MyBatis入門01
阿新 • • 發佈:2020-09-12
MyBatis入門
一、下載地址
GitHub:
https://github.com/mybatis/mybatis-3/releases
Maven: <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.6</version> </dependency>
二、入門級別程式案例
1、建立Java工程,匯入mybatis基本jar包與資料庫驅動
asm-7.1.jar cglib-3.3.0.jar commons-logging-1.2.jar javassist-3.27.0-GA.jar log4j-1.2.17.jar log4j-api-2.13.3.jar log4j-core-2.13.3.jar mybatis-3.5.5.jar mysql-connector-java-8.0.16.jar ognl-3.2.14.jar slf4j-api-1.7.30.jar slf4j-log4j12-1.7.30.jar
2、src下建立sqlMapConfig.xml配置檔案
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "mybatis-3-config.dtd" > <configuration> <!-- 和spring整合後 environments配置將廢除 --> <environments default="development"> <environmentid="development"> <!-- 使用jdbc事務管理 --> <transactionManager type="JDBC" /> <!-- 資料庫連線池 --> <dataSource type="POOLED"> <property name="driver" value="com.mysql.cj.jdbc.Driver" /> <property name="url" value="jdbc:mysql://127.0.0.1:3306/dbname?characterEncoding=utf8&useUnicode=true&useSSL=false&serverTimezone=UTC" /> <property name="username" value="root" /> <property name="password" value="1234" /> </dataSource> </environment> </environments> <!-- 引入實體對應的對映檔案 --> <mappers> <mapper resource="entity/User.xml"/> </mappers> </configuration>
log4j.properties
# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# 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
資料表
對應的實體類
package entity; import java.util.Date; //mybatis使用得POJO實體類 public class User { private Integer id; private String username; private Date birthday; private String sex; private String Address; 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 Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getAddress() { return Address; } public void setAddress(String address) { Address = address; } @Override public String toString() { return "User [id=" + id + ", username=" + username + ", birthday=" + birthday + ", sex=" + sex + ", Address=" + Address + "]"; } }
Mabatis與實體類對應的配置檔案
<?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"> <mapper namespace="test"> <select id="queryUserById" parameterType="int" resultType="entity.User"> select * from user where id=#{id} </select> <select id="userList" parameterType="string" resultType="entity.User"> select * from user where username like'%${value}%' </select> <insert id="addUser" parameterType="entity.User"> <selectKey keyProperty="id" resultType="int" order="AFTER" > select LAST_INSERT_ID() </selectKey> insert into user(username,birthday,sex,Address) values(#{username},#{birthday},#{sex},#{Address}) </insert> <update id="updateUser" parameterType="entity.User"> update user set username=#{username} where id=#{id} </update> <delete id="rmUser" parameterType="int"> delete from user where id=#{id} </delete> </mapper>
junit測試類
import static org.junit.Assert.*; import java.io.InputStream; import java.util.Date; import java.util.List; 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 entity.User; public class MytaitsTest { //查詢單個結果 @Test public void fun1() throws Exception { //讀取配置檔案 InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml"); //構建sqlSessionFactory SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //開啟session SqlSession session = sqlSessionFactory.openSession(); User user = session.selectOne("test.queryUserById", 10); System.out.println(user); //關閉session session.close(); } //查詢多個結果 @Test public void fun2() throws Exception { //讀取配置檔案 InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml"); //構建sqlSessionFactory SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //開啟session SqlSession session = sqlSessionFactory.openSession(); List<User> list = session.selectList("test.userList", "王"); for (User user : list) { System.out.println(user); } //關閉session session.close(); } //插入資料 @Test public void fun3() throws Exception { //讀取配置檔案 InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml"); //構建sqlSessionFactory SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //開啟session SqlSession session = sqlSessionFactory.openSession(); User user = new User(); user.setUsername("張三"); user.setBirthday(new Date()); user.setAddress("北京"); user.setSex("男"); int num = session.insert("test.addUser", user); if(num==1) { System.out.println("成功新增資料"); System.out.println("新插入資料的ID:"+user.getId()); } //如果不提交事務,則不會新增進資料庫 session.commit(); //關閉session session.close(); } //修改資料 @Test public void fun4() throws Exception { //讀取配置檔案 InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml"); //構建sqlSessionFactory SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //開啟session SqlSession session = sqlSessionFactory.openSession(); User user = new User(); user.setUsername("張1"); user.setId(29); int num = session.update("test.updateUser", user); if(num==1) { System.out.println("修改成功"); } //如果不提交事務,則不會新增進資料庫 session.commit(); //關閉session session.close(); } //刪除使用者 @Test public void fun5() throws Exception { //讀取配置檔案 InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml"); //構建sqlSessionFactory SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //開啟session SqlSession session = sqlSessionFactory.openSession(); int num = session.delete("test.rmUser", 25); if(num==1) { System.out.println("刪除成功"); } //如果不提交事務,則不會新增進資料庫 session.commit(); //關閉session session.close(); } }
說明
一、流程
1、Mybatis核心sqlMapConfig.xml配置檔案的配置
2、實體類的Mapper 及上面User.xml的建立
3、在sqlMapConfig引入POJO類對應的XML對映檔案
核心基礎程式碼
引數說明:
param1:配置檔案中的 namespace.id
param2:sql語句需要的引數
//讀取配置檔案 InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml"); //構建sqlSessionFactory SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //開啟session SqlSession session = sqlSessionFactory.openSession(); //此處操作DB //session.selectOne("test.queryUserById", 10); //session.selectList("test.userList", "王"); //session.insert("test.addUser", user); //session.update("test.updateUser", user); //session.delete("test.rmUser", 25); //如果不提交事務,則不會新增進資料庫 session.commit(); //關閉session session.close();
使用Mapper動態代理的方式
Mapper介面開發方法只需要程式設計師編寫Mapper介面(相當於Dao介面),
由Mybatis框架根據介面定義建立介面的動態代理物件,代理物件的方法體同上邊Dao介面實現類方法。
Mapper介面開發需要遵循以下規範:4個相同
1、 Mapper.xml檔案中的namespace與mapper介面的類路徑相同。
2、 Mapper介面方法名和Mapper.xml中定義的每個statement的id相同
3、 Mapper介面方法的輸入引數型別和mapper.xml中定義的每個sql 的parameterType的型別相同
4、 Mapper介面方法的輸出引數型別和mapper.xml中定義的每個sql的resultType的型別相同
UserMapper.xml
補充說明: #{}為插值表示式,${}為字串拼接
不同版本的Insert返回的ID有區別,有的是設定 keyColumn=”id‘’ 有的是設定resultType="int"
<?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="mapper.UserMapper"> <select id="findUserById" parameterType="int" resultType="entity.User"> select * from user where id=#{id} </select> <select id="findUserByStr" parameterType="string" resultType="entity.User"> select * from user where username like "%"#{str}"%" </select> <insert id="addUser" parameterType="entity.User"> <selectKey keyProperty="id" resultType="int" order="AFTER"> select LAST_INSERT_ID() </selectKey> insert into user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address}) </insert> <update id="updateUser" parameterType="entity.User"> update user set username=#{username},address=#{address},sex=#{sex} where id=#{id} </update> <delete id="rmUser" parameterType="int" > delete from user where id=#{id} </delete> </mapper>
UserMapper.java
package mapper; import java.util.List; import entity.User; public interface UserMapper { /** *根據id獲取單個使用者 * @param id * @return */ public User findUserById(int id); /** * @param str 模糊查詢,輸入需要查詢的字元 * @return 返回查詢的user集合 */ public List<User> findUserByStr(String str); /** * 會將加入的主鍵返回賦值給User物件 * @param user 新增使用者物件 * @return 返回新增筆數 */ public int addUser(User user); /** * @param user 更新的User物件 * @return 返回更新的筆數 */ public int updateUser(User user); /** * 根據id刪除使用者 * @param id * @return 刪除筆數 */ public int rmUser(int id); }
測試類
package mapperTest; import java.io.IOException; import java.io.InputStream; import java.util.Date; import java.util.List; 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.Before; import org.junit.Test; import entity.User; import mapper.UserMapper; public class MapperTest { SqlSessionFactory sqlSessionFactory=null; //在測試前的準備項,初始化sqlSessionFactory @Before public void setMybatis() throws IOException { //獲取配置檔案 InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml"); //建立sessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream); } //測試查詢一個 @Test public void func1() { //開啟session SqlSession sqlSession = this.sqlSessionFactory.openSession(); //讓mabatis為我們建立介面的代理物件 UserMapper mapper = sqlSession.getMapper(UserMapper.class); //執行查詢方法 方法名就是配置檔案中的id User user = mapper.findUserById(28); System.out.println(user); sqlSession.close(); } /** * 測試模糊查詢多個使用者 */ @Test public void func2() { //開啟session SqlSession sqlSession = this.sqlSessionFactory.openSession(); //讓mabatis為我們建立介面的代理物件 UserMapper mapper = sqlSession.getMapper(UserMapper.class); //執行查詢方法 方法名就是配置檔案中的id List<User> list = mapper.findUserByStr("王"); for (User user : list) { System.out.println(user); } sqlSession.close(); } /** * 測試插入資料 */ @Test public void func3() { //開啟session SqlSession sqlSession = this.sqlSessionFactory.openSession(); //讓mabatis為我們建立介面的代理物件 UserMapper mapper = sqlSession.getMapper(UserMapper.class); //執行查詢方法 方法名就是配置檔案中的id User user = new User(); user.setUsername("李四"); user.setAddress("上海"); user.setBirthday(new Date()); user.setSex("男"); int num = mapper.addUser(user); System.out.println("成功插入:"+num+"筆資料:------------"); System.out.println("新插入的使用者的主鍵ID是:"+user.getId()); //必須提交事務 sqlSession.commit(); sqlSession.close(); } /** * 測試更新資料 */ @Test public void func4() { //開啟session SqlSession sqlSession = this.sqlSessionFactory.openSession(); //讓mabatis為我們建立介面的代理物件 UserMapper mapper = sqlSession.getMapper(UserMapper.class); //執行查詢方法 方法名就是配置檔案中的id User user = new User(); user.setUsername("王五"); user.setAddress("北京"); user.setId(32); user.setSex("男"); int num = mapper.updateUser(user); System.out.println("成功更新一筆資料:"+num+"筆資料:------------"); //必須提交事務 sqlSession.commit(); sqlSession.close(); } /** * 測試更新資料 */ @Test public void func5() { //開啟session SqlSession sqlSession = this.sqlSessionFactory.openSession(); //讓mabatis為我們建立介面的代理物件 UserMapper mapper = sqlSession.getMapper(UserMapper.class); int rmNum = mapper.rmUser(16); System.out.println("刪除了:"+rmNum+" 筆資料"); //必須提交事務 sqlSession.commit(); sqlSession.close(); } }
核心程式碼
SqlSessionFactory sqlSessionFactory=null; //在測試前的準備項,初始化sqlSessionFactory @Before public void setMybatis() throws IOException { //獲取配置檔案 InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml"); //建立sessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream); } //開啟session SqlSession sqlSession = this.sqlSessionFactory.openSession(); //讓mabatis為我們建立介面的代理物件 UserMapper mapper = sqlSession.getMapper(UserMapper.class); //執行查詢方法 方法名就是配置檔案中的id User user = mapper.findUserById(28); List<User> list = mapper.findUserByStr("王"); int num = mapper.addUser(user); int num = mapper.updateUser(user); int rmNum = mapper.rmUser(16); //必須提交事務 sqlSession.commit(); sqlSession.close();
sqlMapConfig.xml配置說明
properties(屬性)
settings(全域性配置引數)
typeAliases(類型別名)
typeHandlers(型別處理器)
objectFactory(物件工廠)
plugins(外掛)
environments(環境集合屬性物件)
environment(環境子屬性物件)
transactionManager(事務管理)
dataSource(資料來源)
mappers(對映器)
在sqlMapConfig.xml中使用 properties 檔案
<?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> <!-- 是用resource屬性載入外部配置檔案 --> <properties resource="db.properties"> <!-- 在properties內部用property定義屬性 --> <!-- 如果外部配置檔案有該屬性,則內部定義屬性被外部屬性覆蓋 --> <property name="jdbc.username" value="root123" /> <property name="jdbc.password" value="root123" /> </properties> <!-- 和spring整合後 environments配置將廢除 --> <environments default="development"> <environment id="development"> <!-- 使用jdbc事務管理 --> <transactionManager type="JDBC" /> <!-- 資料庫連線池 --> <dataSource type="POOLED"> <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> <!-- 載入對映檔案 --> <mappers> <mapper resource="sqlmap/User.xml" /> <mapper resource="mapper/UserMapper.xml" /> </mappers> </configuration>
MyBatis 將按照下面的順序來載入屬性:
在 properties 元素體內定義的屬性首先被讀取。
然後會讀取properties 元素中resource或 url 載入的屬性,它會覆蓋已讀取的同名屬性。
別名
mybatis支援別名:
別名 對映的型別
_byte byte
_long long
_short short
_int int
_integer int
_double double
_float float
_boolean boolean
string String
byte Byte
long Long
short Short
int Integer
integer Integer
double Double
float Float
boolean Boolean
date Date
decimal BigDecimal
bigdecimal BigDecimal
map Map
自定義類別名
<typeAliases> <!-- 單個別名定義 --> <typeAlias alias="user" type="cn.itcast.mybatis.pojo.User" /> <!-- 批量別名定義,掃描整個包下的類,別名為類名(大小寫不敏感) --> <package name="cn.itcast.mybatis.pojo" /> <package name="其它包" /> </typeAliases>
mappers對映器
使用相對於類路徑的資源(現在的使用方式) 如:<mapper resource="sqlmap/User.xml" /><mapper class=" " /> 使用mapper介面類路徑 如:<mapper class="cn.itcast.mybatis.mapper.UserMapper"/> 注意:此種方法要求mapper介面名稱和mapper對映檔名稱相同,且放在同一個目錄中。 <package name=""/> 註冊指定包下的所有mapper介面 如:<package name="cn.itcast.mybatis.mapper"/> 注意:此種方法要求mapper介面名稱和mapper對映檔名稱相同,且放在同一個目錄中。