軟件的半成品,解決了軟件開發過程當中的普適性問題,從而簡化了開發步驟,提供了開發的效率。
- ORM(Object Relational Mapping)對象關系映射,將程序中的一個對象與表中的一行數據一一對應。
- ORM框架提供了持久化類與表的映射關系,在運行時參照映射文件的信息,把對象持久化到數據庫中`。
存在大量的冗余代碼。
手工創建 Connection、Statement 等。
手工將結果集封裝成實體對象。
查詢效率低,沒有對數據訪問進行過優化(Not Cache)。
- 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操作,將執行結果返回。
官方網站:http://www.mybatis.org/mybatis-3/
下載地址:https://github.com/mybatis/mybatis-3/releases/tag/mybatis-3.5.1
使用IDEA打開已創建的文件夾目錄 |
---|
選擇Maven項目 |
---|
GAV坐標 |
---|
重點
】在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>
創建并配置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"/><!-- &轉義& 3306后加數據庫名 --><property name="url" value="jdbc:mysql://localhost:3306/mybatis_shine?useUnicode=true&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中,路徑不能以/開頭
補充:&
五個字符是&符號的轉譯。
environment id 是配置數據庫的配置名
重點
】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;
可選擇數據庫
定義所需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;}
}
根據所需DAO定義接口、以及方法
package com.qf.dao;import com.qf.entity.User;public interface UserDAO {User queryUserById(Integer id);
}
在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對不同字段起別名對應實體類中字段,就可以實現對應映射。
將Mapper.xml注冊到mybatis-config.xml中
<!--Mapper注冊--><!--Mapper文件注冊位置--><mappers><!--注冊Mapper文件--><mapper resource="UserDAOMapper.xml"/></mappers>
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接口要傳入正確
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);}
}
如果是放在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>
多環境多配置文件,需要分別讀取,那就把常用配置寫在不同的文件下
對于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}"/><!-- &轉義& --><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對應前面對應機制
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
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 | 關閉所有日志記錄開關;是最高等級的,用于關閉所有日志記錄。 |
重點
】標簽:< select id="" resultType="" >
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}
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>
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就可以
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()注解和對象常用
注:
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}]
和之前一樣,先在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();
沒有被刪除
標簽:< 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();
標簽:< 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();
標簽:< selectKey id="" parameterType="" order=“AFTER|BEFORE”>
添加之后需要返回主鍵信息
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做主鍵。
需要在插入之前就生成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!
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态