MyBatis學習筆記01

 2023-11-30 阅读 22 评论 0

摘要:文章目錄一、引言1.1 什么是框架?1.2 什么是ORM框架?1.3 使用JDBC完成ORM操作的缺點?二、MyBatis框架2.1 概念2.2 訪問與下載三、構建Maven項目3.1 新建項目3.2 選擇Maven目錄3.3 GAV坐標四、MyBatis環境搭建【`重點`】4.1 pom.xml中引入MyBati

文章目錄

      • 一、引言
        • 1.1 什么是框架?
        • 1.2 什么是ORM框架?
        • 1.3 使用JDBC完成ORM操作的缺點?
      • 二、MyBatis框架
        • 2.1 概念
        • 2.2 訪問與下載
      • 三、構建Maven項目
        • 3.1 新建項目
        • 3.2 選擇Maven目錄
        • 3.3 GAV坐標
      • 四、MyBatis環境搭建【`重點`】
        • 4.1 pom.xml中引入MyBatis核心依賴
        • 4.2 創建MyBatis配置文件
      • 五、MyBatis開發步驟【`重點`】
        • 5.1 建表
        • 5.2 定義實體類
        • 5.3 定義DAO接口
        • 5.4 編寫Mapper.xml
        • 5.5 注冊Mapper
        • 5.6 測試一
        • 5.7 測試二【了解】
      • 六、細節補充
        • 6.1 解決mapper.xml存放在resources以外路徑中的讀取問題
        • 6.2 properties配置文件
        • 6.3 類型別名
        • 6.4 創建log4j配置文件
      • 七、MyBatis的CRUD操作【`重點`】
        • 7.1 查詢
          • 7.1.1 序號參數綁定
          • 7.1.2 注解參數綁定【推薦】
          • 7.1.3 Map參數綁定
          • 7.1.4 對象參數綁定
          • 7.1.5 模糊查詢
        • 7.2 刪除
        • 7.3 修改
        • 7.4 添加
        • 7.5 主鍵回填--添加數據的場景
          • 7.5.1 通過last_insert_id()查詢主鍵
          • 7.5.2 通過uuid()查詢主鍵

一、引言


1.1 什么是框架?

軟件的半成品,解決了軟件開發過程當中的普適性問題,從而簡化了開發步驟,提供了開發的效率。

1.2 什么是ORM框架?

  • ORM(Object Relational Mapping)對象關系映射,將程序中的一個對象與表中的一行數據一一對應。
  • ORM框架提供了持久化類與表的映射關系,在運行時參照映射文件的信息,把對象持久化到數據庫中`。

1.3 使用JDBC完成ORM操作的缺點?

  • 存在大量的冗余代碼。

  • 手工創建 Connection、Statement 等。

  • 手工將結果集封裝成實體對象。

  • 查詢效率低,沒有對數據訪問進行過優化(Not Cache)。

二、MyBatis框架


2.1 概念

  • MyBatis本是Apache軟件基金會的一個開源項目iBatis, 2010年這個項目由apache software foundation 遷移到了Google Code,并且改名為MyBatis 。2013年11月遷移到Github。
  • MyBatis是一個優秀的基于Java的持久層框架,支持自定義SQL,存儲過程和高級映射。
  • MyBatis對原有JDBC操作進行了封裝,幾乎消除了所有JDBC代碼,使開發者只需關注 SQL 本身。
  • MyBatis可以使用簡單的XML或Annotation來配置執行SQL,并自動完成ORM操作,將執行結果返回。

2.2 訪問與下載

官方網站:http://www.mybatis.org/mybatis-3/

下載地址:https://github.com/mybatis/mybatis-3/releases/tag/mybatis-3.5.1

三、構建Maven項目


3.1 新建項目

使用IDEA打開已創建的文件夾目錄
在這里插入圖片描述

3.2 選擇Maven目錄

選擇Maven項目
在這里插入圖片描述

3.3 GAV坐標

GAV坐標
在這里插入圖片描述

在這里插入圖片描述

四、MyBatis環境搭建【重點


4.1 pom.xml中引入MyBatis核心依賴

在pom.xml中引入相關依賴

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" 	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><!--項目配置--><groupId>com.qf</groupId><artifactId>hello-mybatis</artifactId><version>1.0-SNAPSHOT</version><!--依賴--><dependencies><!--MyBatis核心依賴--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.4.6</version></dependency><!--MySql驅動依賴--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.47</version></dependency></dependencies>
</project>

4.2 創建MyBatis配置文件

創建并配置mybatis-config.xml

補充:config全部默認寫到resource下

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><!--MyBatis配置-->
<configuration><!--JDBC環境配置、選中默認環境--><environments default="shine_config"><!--MySql數據庫環境配置 id自己寫--><environment id="shine_config"><!--事務管理--><transactionManager type="JDBC"/><!--連接池--><dataSource type="org.apache.ibatis.datasource.pooled.PooledDataSourceFactory"><property name="driver" value="com.mysql.jdbc.Driver"/><!-- &轉義&amp; 3306后加數據庫名 --><property name="url" value="jdbc:mysql://localhost:3306/mybatis_shine?useUnicode=true&amp;characterEncoding=utf-8"/><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment></environments><!--Mapper注冊--><!--Mapper文件注冊位置--><mappers><!--注冊Mapper文件--><mapper resource="UserDAOMapper.xml"/></mappers>
</configuration>
  • 注意:mapper.xml默認建議存放在resources中,路徑不能以/開頭

補充:&amp;五個字符是&符號的轉譯。
environment id 是配置數據庫的配置名

五、MyBatis開發步驟【重點


5.1 建表

create database mybatis_shine default charset =utf8;create table t_user(id int primary key auto_increment,username varchar(50),password varchar(50),gender tinyint,regist_time datetime
)default charset =utf8;

在這里插入圖片描述

可選擇數據庫

5.2 定義實體類

定義所需CURD操作的實體類

package com.qf.entity;import java.util.Date;public class User {private Integer id;private String username;private String password;private Boolean gender;private Date registTime;public User(){}public User(Integer id, String username, String password, Boolean gender, Date registTime) {this.id = id;this.username = username;this.password = password;this.gender = gender;this.registTime = registTime;}@Overridepublic String toString() {return "User{" +"id=" + id +", username='" + username + '\'' +", password='" + password + '\'' +", gender=" + gender +", registTime=" + registTime +'}';}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public Boolean getGender() {return gender;}public void setGender(Boolean gender) {this.gender = gender;}public Date getRegistTime() {return registTime;}public void setRegistTime(Date registTime) {this.registTime = registTime;}
}

5.3 定義DAO接口

根據所需DAO定義接口、以及方法

package com.qf.dao;import com.qf.entity.User;public interface UserDAO {User queryUserById(Integer id);
}

5.4 編寫Mapper.xml

在resources目錄中創建Mapper.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><!--namespace = 所需實現的接口全限定名-->
<mapper namespace="com.qf.dao.UserDAO"><!--id = 所需重寫的接口抽象方法,resultType = 查詢后所需返回的對象類型--><select id="queryUserById" resultType="com.qf.entity.User"><!--#{arg0} = 方法的第一個形參-->SELECT * FROM t_user WHERE id = #{arg0}</select>
</mapper>

最終結果是通過queryUserById 獲取到arg0,查出并封裝為User對象。
對應依據:如果是同名那自動對應,如果不同名,可以在SQL語句中使用AS對不同字段起別名對應實體類中字段,就可以實現對應映射。

5.5 注冊Mapper

將Mapper.xml注冊到mybatis-config.xml中

<!--Mapper注冊--><!--Mapper文件注冊位置--><mappers><!--注冊Mapper文件--><mapper resource="UserDAOMapper.xml"/></mappers>

5.6 測試一

MyBatis的API操作方式

package com.qf;import com.qf.dao.UserDAO;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;import java.io.IOException;
import java.io.InputStream;public class UserTest {@Testpublic void test1() throws IOException {//1.獲得讀取MyBatis配置文件的流對象InputStream is = Resources.getResourceAsStream("mybatis-config.xml");//2.構建SqlSession連接對象的工廠SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);//3.通過工廠獲得連接對象SqlSession sqlSession = factory.openSession();//4.通過連接對象獲得接口實現類對象UserDAO userDao = sqlSession.getMapper(UserDAO.class);//5.調用接口中的方法System.out.println(userDao.queryUserById(1));}
}

注意UserDAO接口要傳入正確

5.7 測試二【了解】

iBatis傳統操作方式

package com.qf.mybatis.part1.basic;import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;import java.io.IOException;
import java.io.InputStream;public class HelloMyBatis {@Testpublic void test2() throws IOException {//1.獲得讀取MyBatis配置文件的流對象InputStream is = Resources.getResourceAsStream("mybatis-config.xml");//2.構建SqlSession連接對象的工廠SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);//3.通過工廠獲得連接對象SqlSession sqlSession = factory.openSession();//4.通過連接對象直接調用接口中的方法Object o = sqlSession.selectOne("com.qf.mybatis.part1.basic.UserDao.selectUserById", 1);System.out.println(o);}
}

六、細節補充


6.1 解決mapper.xml存放在resources以外路徑中的讀取問題

如果是放在resources之外需要添加配置,原因是maven如果編譯java文件下的文件只會編譯.java文件,其他文件一概不管,現在就需要管一下,統一編譯下xml文件就需要添加配置(補充:機器只識別target文件下的編譯后文件,如果不配置,里面是不會有編譯的xml文件的)
在這里插入圖片描述

在pom.xml文件最后追加< build >標簽,以便可以將xml文件復制到classes中,并在程序運行時正確讀取。

<build><!-- 更改maven編譯規則 --><resources><resource><!-- 資源目錄 --><directory>src/main/java</directory><includes><include>*.xml</include><!-- 默認(新添加自定義則失效) --><include>**/*.xml</include><!-- 新添加 */代表1級目錄 **/代表多級目錄 --></includes><filtering>true</filtering></resource></resources></build>

可能會報錯:Cause: com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceExcep
在pom添加配置

<properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties>

6.2 properties配置文件

多環境多配置文件,需要分別讀取,那就把常用配置寫在不同的文件下

對于mybatis-config.xml的核心配置中,如果存在需要頻繁改動的數據內容,可以提取到properties中。

#jdbc.properties
jdbc.url=jdbc:mysql://localhost:3306/mybatis_shine?useUnicode=true&characterEncoding=utf-8
jdbc.driver=com.mysql.jdbc.Driver
jdbc.username=root
jdbc.password=root

修改mybatis-config.xml。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><!--MyBatis配置-->
<configuration><!--添加properties配置文件路徑(外部配置、動態替換)--><properties resource="jdbc.properties" /><!--JDBC環境配置、選中默認環境--><environments default="shine_config"><!--MySql數據庫環境配置--><environment id="shine_config"><!--事務管理--><transactionManager type="JDBC"/><!--連接池--><dataSource type="org.apache.ibatis.datasource.pooled.PooledDataSourceFactory"><!--使用$ + 占位符--><property name="driver" value="${jdbc.driver}"/><!-- &轉義&amp; --><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/></dataSource></environment></environments><!--Mapper注冊--><!--Mapper文件注冊位置--><mappers><!--注冊Mapper文件--><!--<mapper resource="UserDAOMapper.xml"/>--><mapper resource="com/qf/dao/UserDAOMapper.xml"/></mappers>
</configuration>

測試成功,其中最后字段為null對應前面對應機制
在這里插入圖片描述

6.3 類型別名

mapper配置文件中后面會涉及到各種各樣的查詢,里面都涉及到實體類,如果每次都添加上路徑那就太麻煩了
在這里插入圖片描述

為實體類定義別名,提高書寫效率。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><properties ... /><!--定義別名二選一--><typeAliases><!--定義類的別名--><typeAlias type="com.qf.mybatis.part1.basic.User" alias="user" /><!--自動掃描包,將原類名作為別名--><package name="com.qf.mybatis.part1.basic" /></typeAliases>...
</configuration>

補:

    <!-- 實體類別名 --><typeAliases><typeAlias type="com.qf.entity.User" alias="user_shine"/><!-- 定義實體類所在的package,每個實體類都會自動注冊一個別名=類名 --><!--       <package name="com.qf.entity"/>--></typeAliases>

注意:兩者選其一。推薦定義實體類所在package

6.4 創建log4j配置文件

pom.xml添加log4j依賴

<!-- log4j日志依賴 https://mvnrepository.com/artifact/log4j/log4j -->
<dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version>
</dependency>

創建并配置log4j.properties

# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# MyBatis logging configuration...
log4j.logger.org.mybatis.example.BlogMapper=TRACE
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
級別描述
ALL LEVEL打開所有日志記錄開關;是最低等級的,用于打開所有日志記錄。
DEBUG輸出調試信息;指出細粒度信息事件對調試應用程序是非常有幫助的。
INFO輸出提示信息;消息在粗粒度級別上突出強調應用程序的運行過程。
WARN輸出警告信息;表明會出現潛在錯誤的情形。
ERROR輸出錯誤信息;指出雖然發生錯誤事件,但仍然不影響系統的繼續運行。
FATAL輸出致命錯誤;指出每個嚴重的錯誤事件將會導致應用程序的退出。
OFF LEVEL關閉所有日志記錄開關;是最高等級的,用于關閉所有日志記錄。

七、MyBatis的CRUD操作【重點


7.1 查詢

標簽:< select id="" resultType="" >

7.1.1 序號參數綁定
public interface UserDao {//使用原生參數綁定public User selectUserByIdAndPwd(Integer id , String pwd);
}
<select id="selectUserByIdAndPwd" resultType="user">SELECT * FROM t_usersWHERE id = #{arg0} AND password = #{arg1} <!--arg0 arg1 arg2 ...-->
</select><select id="selectUserByIdAndPwd" resultType="user">SELECT * FROM t_usersWHERE id = #{param1} AND password = #{param2} <!--param1 param2 param3 ...-->
</select>

說明:#{arg0}和#{param1}

7.1.2 注解參數綁定【推薦】
import org.apache.ibatis.annotations.Param; //引入注解public interface UserDao {//使用MyBatis提供的@Param進行參數綁定public User selectUserByIdAndPwd(@Param("id") Integer id , @Param("pwd") String pwd);
}
<select id="selectUserByIdAndPwd" resultType="user">SELECT * FROM t_usersWHERE id = #{id} AND password = #{pwd} <!-- 使用注解值 @Param("pwd") -->
</select>
7.1.3 Map參數綁定
public interface UserDao {//添加Map進行參數綁定public User selectUserByIdAndPwd_map(Map values);
}
Map values = new HashMap(); //測試類創建Map
values.put("myId",1); //自定義key,綁定參數
values.put("myPwd","123456");
User user = userDao.selectUserByIdAndPwd_map(values);
<select id="selectUserByIdAndPwd_map" resultType="user">SELECT * FROM t_users WHERE id = #{myId} AND password = #{myPwd} <!-- 通過key獲得value -->
</select>

補充:凡是調用使用map集合id的方法,就把返回值給map,我們只需要知道Map的key就可以

7.1.4 對象參數綁定
public interface UserDao {//使用對象屬性進行參數綁定public User selectUserByUserInfo(User user);
}
<select id="selectUserByUserInfo" resultType="user">SELECT * FROM t_usersWHERE id = #{id} AND password = #{password} <!-- #{id}取User對象的id屬性值、#{password}同理 -->
</select>

補充:

UserDAO

package com.qf.dao;import com.qf.entity.User;
import org.apache.ibatis.annotations.Param;import java.util.Map;public interface UserDAO {User queryUserById(Integer id);User queryUserByIdAndUsername(Integer id, String username);//使用注解@Param() ,在需要傳入的參數之前加上該注解,習慣上和參數保持一直User queryUserByIdAndPassword(@Param("id") Integer id,@Param("password") String password);//使用map集合 map -> key-value類型,主需要傳入keyUser queryUserByIdAndPassword2(Map map);//類比上述Map集合傳參方法,也可以封裝User對象傳入User queryUserByIdAndPassword3(User user);
}

Mapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><!--namespace = 所需實現的接口全限定名-->
<mapper namespace="com.qf.dao.UserDAO"><!--id = 所需重寫的接口抽象方法,resultType = 查詢后所需返回的對象類型--><select id="queryUserById" resultType="User"><!--#{arg0} = 方法的第一個形參-->SELECT * FROM t_user WHERE id = #{arg0}</select><!--param參數,從1開始--><select id="queryUserByIdAndUsername" resultType="User">select id,username,password,gender,regist_time as registTimefrom t_userwhere id=#{param1} and username=#{param2}</select><!--@param()注解--><select id="queryUserByIdAndPassword" resultType="User">select id,username,password,gender,regist_time as registTimefrom t_userwhere id=#{id} and password = #{password}</select><!--Map集合--><select id="queryUserByIdAndPassword2" resultType="User">select id,username,password,gender,regist_time as registTimefrom t_userwhere id=#{id} and password = #{password}</select><!--User對象--><select id="queryUserByIdAndPassword3" resultType="User">select id,username,password,gender,regist_time as registTimefrom t_userwhere id=#{id} and password = #{password}<!-- #{id}取User對象的id屬性值、#{password}同理 --></select></mapper>

UserTest

package com.qf;import com.qf.dao.UserDAO;
import com.qf.entity.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;public class UserTest {@Testpublic void test1() throws IOException {//1.獲得讀取MyBatis配置文件的流對象InputStream is = Resources.getResourceAsStream("mybatis-config.xml");//2.構建SqlSession連接對象的工廠SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);//3.通過工廠獲得連接對象SqlSession sqlSession = factory.openSession();//4.通過連接對象獲得接口實現類對象UserDAO userDao = sqlSession.getMapper(UserDAO.class);//5.調用接口中的方法//arg0參數System.out.println(userDao.queryUserById(1));//paramSystem.out.println(userDao.queryUserByIdAndUsername(2,"zhangsan"));//@param()注解System.out.println(userDao.queryUserByIdAndPassword(1,"123"));//Map集合Map values = new HashMap(); //測試類創建Mapvalues.put("id",1); //自定義key,綁定參數values.put("password","123456");System.out.println(userDao.queryUserByIdAndPassword2(values));//User對象User user = new User();user.setId(1);user.setPassword("123");System.out.println(userDao.queryUserByIdAndPassword3(user));}
}

在這里插入圖片描述
注:@param()注解和對象常用

7.1.5 模糊查詢

注:

  1. 查詢時返回多結果需要使用集合
  2. mapper的id寫入方法值,resultType寫入泛型
  3. concat()函數做拼接
public interface UserDao {public List<User> selectUsersByKeyword(@Param("keyword") String keyword);
}
<mapper namespace="com.qf.mybatis.part1.different.UserDao"><select id="selectUsersByKeyword" resultType="user">SELECT * FROM t_users WHERE name LIKE concat('%',#{keyword},'%') <!-- 拼接'%' --></select>
</mapper>

注:Expected one result (or null) to be returned by selectOne(), but found: 2
如果報錯是因為沒有設定返回值為集合,只能返回一個對象,如果有多個返回值會報這個錯。

方法:

 //模糊查詢public List<User> queryUserByusername(@Param("username") String username);

Mapper.xml

<select id="queryUserByusername" resultType="User">select id,username,password,gender,regist_time as registTimefrom t_userwhere   username like concat('%',#{username},'%')</select>

測試

//模糊查詢System.out.println(userDao.queryUserByusername("zhangsan"));}

結果:

DEBUG [main] - ==>  Preparing: select id,username,password,gender,regist_time as registTime from t_user where username like concat('%',?,'%') 
DEBUG [main] - ==> Parameters: zhangsan(String)
DEBUG [main] - <==      Total: 2
[User{id=1, username='zhangsan', password='123', gender=true, registTime=Wed Apr 21 12:21:46 CST 2021}, User{id=6, username='zhangsan', password='232323', gender=false, registTime=Tue Dec 08 13:10:16 CST 2020}]

7.2 刪除

和之前一樣,先在dao中定義方法,然后使用mapper.xml描述方法

標簽:< delete id="" parameterType="" >
id寫入方法名稱,parameterType寫入方法的參數類型

 <delete id="deleteUser" parameterType="int">DELETE FROM t_usersWHERE id = #{id} <!--只有一個參數時,#{任意書寫}-->
</delete>

補充:

1//該方法不需要返回值void deleteUser(@Param("id") Integer id);2<!--刪除--><delete id="deleteUser" parameterType="int">delete from t_userwhere  id=#{id}</delete>3//刪除userDao.deleteUser(2);

在這里插入圖片描述
在這里插入圖片描述
查看數據中數據并沒有被刪除,查看日志
在這里插入圖片描述

原因:事務的自動提交默認為false,也就是說不會影響到數據,數據不會持久化。
解決辦法:添加事務的提交

    @Testpublic void test1() throws IOException {//1.獲得讀取MyBatis配置文件的流對象InputStream is = Resources.getResourceAsStream("mybatis-config.xml");//2.構建SqlSession連接對象的工廠SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);//3.通過工廠獲得連接對象SqlSession sqlSession = factory.openSession();//4.通過連接對象獲得接口實現類對象UserDAO userDao = sqlSession.getMapper(UserDAO.class);//5.調用接口中的方法//刪除userDao.deleteUser(2);//提交事務sqlSession.commit();

在這里插入圖片描述
發現id為2的數據被刪除。
測試回滾

        //刪除userDao.deleteUser(1);//提交事務
//        sqlSession.commit();//回滾sqlSession.rollback();

沒有被刪除
在這里插入圖片描述

7.3 修改

標簽:< update id="" parameterType="" >

<update id="updateUser" parameterType="user">UPDATE t_users SET name=#{name}, password=#{password}, sex=#{sex}, birthday=#{birthday}WHERE id = #{id} <!--方法參數為對象時,可直接使用#{屬性名}進行獲取-->
</update>

補充 :

void updateUser(User user);
<!--修改--><update id="updateUser" parameterType="User">update t_userset username=#{username},password=#{password},gender=#{gender},regist_time=#{registTime}where id=#{id}</update>
User xiaohuzi = new User(6, "xiaohuzi", "2222", true, new Date());userDao.updateUser(xiaohuzi);sqlSession.commit();

在這里插入圖片描述
在這里插入圖片描述

7.4 添加

標簽:< insert id="" parameterType="" >

<!--手動主鍵-->
<insert id="insertUser" parameterType="user">INSERT INTO t_users VALUES(#{id},#{name},#{password},#{sex},#{birthday},NULL);
</insert><!--自動主鍵-->
<insert id="insertUser" parameterType="user"><!-- 自動增長主鍵,以下兩種方案均可 -->INSERT INTO t_users VALUES(#{id},#{name},#{password},#{sex},#{birthday},NULL);INSERT INTO t_users VALUES(NULL,#{name},#{password},#{sex},#{birthday},NULL);
</insert>

補充:

Integer insertUser(User user);
    <insert id="insertUser" parameterType="User">insert into t_user values(#{id},#{username},#{password},#{gender},#{registTime})</insert>
        //添加,主鍵自增可設為nullUser xiaozhu = new User(null, "xiaozhu", "2222", true, new Date());userDao.insertUser(xiaozhu);sqlSession.commit();

在這里插入圖片描述

補充:如果想顯示返回行數,把方法中void改成integer,其他不需要修改

    void deleteUser(@Param("id") Integer id);void updateUser(User user);Integer insertUser(User user);
        //添加,主鍵自增可設為nullUser xiaozhu = new User(null, "xiaozhu", "2222", true, new Date());Integer integer = userDao.insertUser(xiaozhu);System.out.println("插入了"+integer+"條數據");sqlSession.commit();

在這里插入圖片描述

7.5 主鍵回填–添加數據的場景

標簽:< selectKey id="" parameterType="" order=“AFTER|BEFORE”>

添加之后需要返回主鍵信息

7.5.1 通過last_insert_id()查詢主鍵
create table t_product(id int primary key auto_increment,name varchar(50)
)default charset = utf8;
class Product{private Integer id;private String name;//set+get ...
}
<mapper namespace="com.qf.mybatis.part1.basic.ProductDao"><insert id="insertProduct" parameterType="product"><selectKey keyProperty="id" resultType="int" order="AFTER"> <!-- 插入之后 -->SELECT LAST_INSERT_ID() <!-- 適用于整數類型自增主鍵 --></selectKey>INSERT INTO t_product(id,name) VALUES(#{id},#{name})</insert>
</mapper>

補充:

insertUser方法返回主鍵值:

    <insert id="insertUser" parameterType="User"><selectKey order="AFTER" resultType="int" keyProperty="id">select  last_insert_id()</selectKey>insert into t_user values(#{id},#{username},#{password},#{gender},#{registTime})</insert>
        //1.獲得讀取MyBatis配置文件的流對象InputStream is = Resources.getResourceAsStream("mybatis-config.xml");//2.構建SqlSession連接對象的工廠SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);//3.通過工廠獲得連接對象SqlSession sqlSession = factory.openSession();//4.通過連接對象獲得接口實現類對象StudentDAO studentDAO = sqlSession.getMapper(StudentDAO.class);UserDAO user = sqlSession.getMapper(UserDAO.class);//5.調用接口中的方法User user1 = new User(null,"zhangsansan","123",true,new Date());user.insertUser(user1);System.out.println(user1);//提交sqlSession.commit();

在這里插入圖片描述

使用這個方法適合整數類型并且自增,id是在運行insert方法后返回,但是分布式分表時基本不用int類型做主鍵,會使用varchar(32)類型加uuid做主鍵。

7.5.2 通過uuid()查詢主鍵

需要在插入之前就生成id

create table t_student(id varchar(32) primary key,#字符型主鍵name varchar(50),gender tinyint
)default charset =utf8;

注意:id的類型是varchar類型,自然也談不上自增。

package com.qf.entity;public class Student {private String id;//注意:要和數據庫的字段類型一樣private String name;private boolean gender;public Student() {}@Overridepublic String toString() {return "Student{" +"id='" + id + '\'' +", name='" + name + '\'' +", gender=" + gender +'}';}public String getId() {return id;}public void setId(String id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public boolean isGender() {return gender;}public void setGender(boolean gender) {this.gender = gender;}public Student(String id, String name, boolean gender) {this.id = id;this.name = name;this.gender = gender;}
}

DAO:

public interface StudentDAO {Integer insertStudent(Student student);
}

Mapper:

<!--namespace = 所需實現的接口全限定名-->
<mapper namespace="com.qf.dao.StudentDAO"><insert id="insertStudent" parameterType="Student"><selectKey order="BEFORE" keyProperty="id" resultType="String"><!-- 插入之前 --><!-- 賦值給下面的id屬性 --><!-- 返回值為String類型 -->SELECT REPLACE(UUID(),'-','') <!-- 適用于字符類型主鍵 --></selectKey>insert into t_student values(#{id},#{name},#{gender})</insert></mapper>

Test:

    @Testpublic void test1() throws IOException {//1.獲得讀取MyBatis配置文件的流對象InputStream is = Resources.getResourceAsStream("mybatis-config.xml");//2.構建SqlSession連接對象的工廠SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);//3.通過工廠獲得連接對象SqlSession sqlSession = factory.openSession();//4.通過連接對象獲得接口實現類對象StudentDAO studentDAO = sqlSession.getMapper(StudentDAO.class);//5.調用接口中的方法Student xiaoming = new Student(null, "xiaoming", true);studentDAO.insertStudent(xiaoming);System.out.println(xiaoming);//提交sqlSession.commit();}

在這里插入圖片描述
成功插入數據,并返回主鍵id!

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/5/186154.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息