mybatis文档笔记
目錄
這兩個鏈接 基本上把本目錄的所有知識點都包含進去了
mybatis高級查詢具體操作
mybatis增刪改查基本操作
Mybatis框架
1. jdbc回顧:
2. mybatis介紹
3. mybatis的整體架構
4. mybatis快速入門
5. 完整CRUD操作
6. 動態代理mapper實現類
7. mybatis-config 配置
8. Mapper.xml
9. 整理
10. 動態sql
11. 緩存
12. 高級查詢
13. 分頁插件
14. mybatis和spring整合
Mybatis框架
1.jdbc回顧:
jdbc的問題:
1、加載驅動問題:
每次執行都加載驅動
驅動名稱,硬編碼到java代碼中,如果需要修改驅動。需要修改java文件
解決方案:將驅動名稱放入到外部的配置文件
2、數據庫的連接信息,硬編碼到java代碼中,解決方案:外部配置文件
3、設置參數的問題:
參數下標硬編碼了。需要人為的去判斷參數的位置。
4、遍歷結果集:需要人工的判斷字段名,以及個位置參數類型,不方便
是否可以:能夠將結果集直接映射到一個pojo對象中
5、頻繁的創建連接,關閉連接。導致資源浪費,影響性能,解決:連接池。
2.mybatis介紹
你會五大框架嗎?
SSH spring struts2(webcontroller—[servlet]) hibernate (dao=jdbc—db)
SSM spring springmvc(webcontroller—[servlet] service[m] ) mybatis(dao=jdbc—db)
Cn.yanqi.bean domain entity pojo 實體類
在mybatis的包里面可以看到,ibatis的字樣。
每一個框架都有一個核心配置文件,這個核心文件你必須會,不會這個框架就用不了
3.mybatis的整體架構
4.mybatis快速入門
編寫第一個mybatis程序
創建數據表 tb_user CREATE TABLE `tb_user` (`id` int(11) NOT NULL AUTO_INCREMENT,`user_name` varchar(20) DEFAULT NULL,`sex` varchar(10) DEFAULT NULL,PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;導入依賴
向工程的pom文件中,添加mybatis的依賴
向工程中,添加mybatis的依賴
編寫全局配置文件
在工程的根目錄src下面創建一個mybatis-config.xml 。這個名字不是固定的,可以隨便起,
但也不能太隨便,通常都叫mybatis-config.xml
注意:mybatis-config.xml 引入外部的jdbc.properties文件
外部的jdbc.properties文件
在src下創建
編寫一個pojo實體類
提供getter,setter,toString方法
mapper.xml根據id查詢用戶信息
1、創建一個局部的mapper.xml(名字也可以隨便寫,但是不能太隨便,位置可以放在項目里的任何位置,只需要你能加載到對應的mpper.xml即可)
通常我們就叫標簽為一個statement對象或者叫mapped statement對象
構建SqlSessionFactory
可以通過官方文檔里找路徑如下:
打開index.html
其中Mybatis-config.XML文件的位置不是固定的,只要能找到xml文件就行,可以隨便放
2、在全局的mybatis-config.xml 中去添加mapper.xml的配置
3、書寫java代碼,調用指定的statement,并且傳遞參數信息。獲取返回值
測試打印查看是否查詢到數據
注意:需要在mybatis-config.xml 中使用mapper 去引入外部的mapper.xml
添加日志支持
放在src下面
導入依賴
mybatis使用步驟總結
5.完整CRUD操作
創建UserDao接口
public interface UserDao { /*** 根據id查詢用戶信息* @param id* @return */public User queryUserById(int id); /*** 查詢所有用戶信息* @return*/public List<User> queryAllUser();/*** 根據id刪除用戶信息* @param id*/public void deleteUserById(int id);/*** 添加用戶信息* @param user*/public void addUser(User user);/*** 修改用戶信息* @param user*/public void updateUser(User user);}創建UserDaoImpl實現類
public class UserDaoImpl implements UserDao{//需要sqlSession的來操作private SqlSession sqlSession;//臨時解決方案,利用構造方法傳入public UserDaoImpl(SqlSession sqlSession){this.sqlSession = sqlSession;}//根據id來查詢用戶@Overridepublic User queryUserById(int id) {return sqlSession.selectOne("user.queryUserById", id);}//查詢所有@Overridepublic List<User> queryAllUser() {return sqlSession.selectList("user.queryAllUser");}//刪除用戶@Overridepublic void deleteUserById(int id) {sqlSession.delete("user.deleteUserById", id);}//添加用戶@Overridepublic void addUser(User user) {sqlSession.insert("user.addUser", user);}//修改用戶@Overridepublic void updateUser(User user) {sqlSession.update("user.updateUser", user);} }編寫User對應的UserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="user"><!-- 根據id來查詢 --><select id="queryUserById" resultType="cn.yanqi.mybaits.pojo.User">select * from t_user where id = #{id}</select><!-- 查詢所有 --><select id="queryAllUser" resultType="cn.yanqi.mybaits.pojo.User">select * from t_user</select><!-- 根據id來刪除用戶 沒有結果集的映射的java對象--><delete id="deleteUserById">delete from t_user where id = #{id}</delete><!-- 添加用戶 --><insert id="addUser">INSERT INTO t_user (id,name,sex)VALUES(NULL,#{name},#{sex})</insert><!-- 修改用戶 #{name} pojo類屬性一樣--><update id="updateUser">UPDATE t_userSETname = #{name},sex = #{sex}WHEREid = #{id}</update></mapper>在mybatis-config.xml里面引入UserMapper.xml
編寫測試用例—操作
用Junit Test Case 來測試
編寫測試用例
public class UserDaoTest {//new 一個userDao對象private UserDao userDao;private SqlSession sqlSession;//定義成全局的對象@Before//執行test方法之前執行public void setUp() throws Exception {String resource ="mybatis-config.xml";//讀取xml配置文件InputStream is = Resources.getResourceAsStream(resource);//構建SqlSessionFactorySqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is); //打開SqlSession,得到sqlSession可以進行curd的操作sqlSession = sqlSessionFactory.openSession();//userDao = new UserDaoImpl(sqlSession);//獲取mapper的動態代理實現類userDao = sqlSession.getMapper(UserDao.class);}//根據id查詢@Testpublic void testQueryUserById() {//調用userDao方法User user = userDao.queryUserById(1);System.out.println(user);}//查詢所有@Testpublic void testQueryAllUser() {//調用userDao方法List<User> users = userDao.queryAllUser();//遍歷輸出for(User user : users){System.out.println(user);}}//根據id來刪除@Testpublic void testDeleteUserById() {userDao.deleteUserById(6);sqlSession.commit();//必須開啟事務}//添加user@Testpublic void testAddUser() {User user = new User();user.setName("yanqi");user.setSex("boy");userDao.addUser(user);sqlSession.commit();//不開啟事務是寫入不到數據庫里去的}//修改用戶@Testpublic void testUpdateUser() { // 1、先去查詢User user = userDao.queryUserById(1);user.setName("yanqi");userDao.updateUser(user); // 提交事務sqlSession.commit();} }數據庫字段名和實體類屬性名不一致的問題
查詢數據的時候,查不到userName的信息,原因:數據庫的字段名是user_name
POJO中的屬性名字是userName
兩端不一致,造成mybatis無法填充對應的字段信息。修改方法:在sql語句中使用別名
解決方案1:在sql語句中使用別名(麻煩)
Select * , user_name as username from t_user;
解決方案2: 參考后面的resultMap –mapper具體的配置的時候
解決方案3:參考駝峰匹配 — mybatis-config.xml 的時候
mybatis中dao層的命名規則
在mybatis中dao層的接口的名字不在使用***Dao 而是修改成***Mapper
例如:把UserDao,修改成UserMapper。 UserDao(Mapper)
思考CURD的dao中的問題
接口->實現類->mapper.xml
思考:能否只寫UserDao接口,不書寫實現類UserDaoImp,只編寫Mapper.xml即可
6.動態代理mapper實現類
使用動態代理的目標是可以不用書寫實現類,只需要書寫接口和mapper.xml即可完成crud的操作如果不想寫實現類(UserDaoImpl ) ,只寫接口UserDao ---- 就可以使用動態代理
因為在dao(mapper)的實現類中對sqlsession的使用方式很類似。mybatis提供了接口的動態代理
名稱空間
mapper.xml 根標簽的 namespace 屬性
如果希望使用mybatis通過的動態代理的接口,就需要namespace 中的值,和需要對應的Mapper(dao)接口的全路徑一直
通過sqlSession.getMapper(接口類.class)
使用動態代理總結
出現錯誤
錯誤原因:mapper接口的全路徑和對應mapper.xml的名稱空間不一致造成。
7.mybatis-config 配置
mapUnderscoreToCamelCase用法:
開啟駝峰匹配:從經典數據庫的命名規則user_name,到經典java命名規則的映射userName
java命名規則:駝峰書寫, 大小寫區分兩個單詞的界限。舉例: userName;
數據庫經典命名規則:兩個單詞之間,使用下劃線分割。舉例:user_name
數據庫中的user_name 和java屬性中的 userName 是一樣的
在mybatis-config.xml中:
typeAliases(常用)
給類起一個別名
缺點:需要為每一個類都去定義一個類型別名。書寫麻煩。
typeAliases的使用2—使用掃描包
typeHandlers(類型處理器)
environments(環境)
預發布環境;
可以指定數據源
mappers----映射器
作用:將mapper.xml 文件配置到mybatis-config.xml的環境中。
<mapper url=”file…xml”這種是在硬盤中讀取的,這種幾乎不用
使用mapper接口路徑:
這里所謂的mapper接口路徑。實際上就是dao的接口路徑。在mybatis中,通常把dao的包叫做mapper
類名,也叫做mapper
1、定義一個接口
2、在接口所在的包中定義mapper.xml
3、在mybatis-config.xml 中通過class路徑,引入mapper。要求mapper.xml 中的名稱空間是類的接口的全路徑
問題:
1、mapper.xml 和 java文件沒有分離。spring整合之后解決。
2、需要一個一個的去加載mapper
使用mapper接口掃描包(常用)
掃描的是包
缺點:
1、如果包的路徑有很多?2、mapper.xml和mapper.java沒有分離。
2、在spring整合的時候可以解決這個問題
整理mybatis-config中的內容
2settings:開啟駝峰匹配。
從數據庫的經典命名規則到java經典命名規則的映射; 把數據庫中的下劃線去頂在和java中的內容進行映射。
3、typealiases:類型別名。 為一些java對象,去起一個簡寫的名字,減少mapper.xml中的 代碼書寫量。
<typeAliases><package name="cn.yanqi.mybatis.pojo"/> </typeAliases>4、環境:數據庫的連接信息
5、mappers:關聯外部的mapper.xml文件的
把外部的mapper.xml加載到mybatis中
掃描包的方式:
<mappers><!--掃描指定包下面的所有的接口要求:1、要求mapper.xml文件的名字和mapper接口的名字,一致2、要求mapper.xml文件 和 mapper接口類在一個目錄下--><package name="cn.yanqi.mybatis.mapper"/> <mapper resource="cn/yanqi/mybatis/resources/mapper.xml"/> <mapper class="cn.yanqi.mybatis.mapper.UserMapper"/></mappers>8.Mapper.xml
CURD操作
select
select – 書寫查詢sql語句
id屬性:當前名稱空間下的statement的唯一標識。必須。要求id和mapper接口中的方法的名字一致。
Select 標簽中 resultType:將結果集映射為java的對象類型必須要有(和 resultMap 二選一)
parameterType:傳入參數類型。可以省略,會自判斷傳入的是什么類型
要求:查詢當前有多少人
接口方法
測試
insert
insert 的幾個屬性說明:
id屬性:當前名稱空間下的statement的唯一標識(必須屬性);
parameterType:傳入的參數類型,可以省略。
標簽內部:具體的sql語句。insert語句
使用#{} 去替換一個變量。
怎么知道我們添加時是否添加成功怎么辦?
UserMapper.java 接口中把返回類型直接寫成Integer返回類型,其他的不用動
測試類中給一個integer 返回值就行了
添加成功后返回1
獲取自增的id的值
可以拿到數據庫的自增長的id值
測試:
User.getId();就可以直接拿到自增的id
測試結果:
Update
update 的幾個屬性說明:
id屬性:當前名稱空間下的statement的唯一標識(必須屬性);
parameterType:傳入的參數類型,可以省略。
標簽內部:具體的sql語句。
使用#{} 去替換一個變量。
補充:
delete
delete 的幾個屬性說明:
id屬性:當前名稱空間下的statement的唯一標識(必須屬性);
parameterType:傳入的參數類型,可以省略。
標簽內部:具體的sql語句。
使用#{} 去替換一個變量。
#{ 只是表示占位可以隨便寫 } 相當于 ?
${}的用法----傳入參數的。接受參數。
#{} ?只能出現where中 ,當作一個變量 ,如要sql語句中要在實體對象中取出數據 ,那么where 后的#{}不能隨便寫
數據:是進行字符串拼接。如果使用{} 數據:是進行字符串拼接。 如果使用數據:是進行字符串拼接。如果使用{} 去取出參數信息,則需要在方法的參數列表上加上一個注釋@param 表示參數的名字
#{} 只是表示占位,與參數的名字無關。如果用#{}去傳入下例中的一個表名的話,是傳不進去的
sql語句動態生成的時候,使用${};
sql語句中某個參數進行占位的時候#{}
mapper.xml中的內容:
新寫一個接口的方法
mapper接口的內容:
測試:
parameterType傳入參數-了解
定義傳入參數的類型:
如果沒有指定參數名,使用{} 沒有指定參數名 ,使用沒有指定參數名,使用{value} 表示傳遞過來的參數。
如果接口中書寫的@Param(“TableName”) 就輸入 ${TableName}
可以在方法的參數列表列表上 @param(“參數名”)
1、如果使用$去傳遞參數的時候,使用@Param 把參數指定一個名字
2、如果傳入多個參數的時候,使用@Param,一定需要使用為每一個參數都去指定名字
parameterType傳入多個參數
如果接口代碼這樣書寫:
mapper.xml
傳遞多個參數的時候出現如下錯誤:
對于傳入多個參數的時候,#{} 需要使用參數名的方式去獲取數據。
java代碼:
解決方案1 不推存使用:
在mapper.xml中使用 0,1這樣的序號去,0表示第一個參數,1表示第二個參數。(從0開始數)
或者 用param1 param2 這個時就是從1開始:
解決方案2:
在java代碼中加入param注解
測試
通過@param(“ 數據名”) 取出 # { 數據名 }
mapper.xml
接口:
面試題:#{}與${}的區別
${} statement對象
#{} Preparedstatement對象
${} 方式:
1、KaTeX parse error: Expected 'EOF', got '#' at position 7: 字符串拼接,#? 參數站位相當于jdbc中的?…不能夠防止sql注入,#可以防止sql注入的
3、KaTeX parse error: Expected 'EOF', got '#' at position 17: …以替換sql語句任何一個內容,#?只能替換參數 4、如果操作字符串,需要在sql中使用單引號。 #不需要(不需要判斷數據類型,會自動轉換)($要考慮參類型 ,#不用考慮參數類型)
簡單來說#{} 解析的是占位符?可以防止SQL注入, 比如打印出來的語句 select * from table where id= ? 然而${} 作為字符串拼接來用,則是不能防止SQL注入打印出來的語句 select * from table where id=2 實實在在的參數 (sql注入:通過字符串拼接達到串改sql語句的目地)
8.5.1: $不能夠防止sql注入,#可以防止sql注入的
以下案例演示的要判斷數據類型
案例:根據姓名進行模糊查詢
定義一個接口的方法
使用#
測試:
使用 $
接口定義方法
mapper定義
測試:
結果
【補充】
什么時候使用 $ ,
$可以代替所有#
如果傳入的數據,不是sql中的字段的時候,就不能夠使用#.
通常使用#。
選擇獲取參數的時候,首要選擇的# 的方式(1、可以防止sql注入,2、可以不用考慮數據類型,簡化書寫,3、sql是參數的話的sql,預編譯的sql,速度會塊一些)
當#用不了的時候,去選擇例如,sql需要改變是表名的情況,就可使用例如 ,sql需要改變是表名的情況,就可使用例如,sql需要改變是表名的情況,就可使用的方式。
總結:能用# 就不選擇$
ResultMap
resultMap的自動映射
sql片段
作用:把重復的sql語句抽出來來放到sql標簽中,然后通來引入
用法1
在一個mapper.xml 中使用 去定義sql片段,然后在需要的位置使用 引入
用法2
將所有的公用的SQL片段集中定義到一個Mapper.xml文件中,其他Mapper.xml文件如需引入mybatis-config.xml,通過命名空間.id即可。
sqlMapper.xml
在全局的mybatis-config.xml里面引入sqlMapper.xml
引入公共的sql.xml
9.整理
10.動態sql
if
進行判斷。
需求1:查詢男性用戶,如果輸入了姓名,進行模糊查找,如果不輸入就按男性用戶來查詢。
定義接口
編寫mapper和測試類
使用# {}的方式
1:使用的方式進行取出數據,要求在sql語句中‘{}的方式進行取出數據,要求在sql語句中 ‘%的方式進行取出數據,要求在sql語句中‘{}%’
2: 使用#{} 去取出數據,要求在傳遞參數的時候,就把% 進行拼接到參數上。%張%
choose,when,otherwise
choose,when,otherwise 相當于java中的 if, else if的邏輯
查詢男性用戶,如果輸入了姓名則按照姓名模糊查找,否則如果輸入了年齡則按照年齡查找。
定義接口
編寫mapper.xml
如果其中的一個when 成立,則后的都不執行,如果所有when的都不成立,那么就執行otherwise
也就是誰在前面誰優先
測試
where 和set
作用:完成WHERE和SET關鍵字,并且處理SQL語句的中語法錯誤。
Select * from t_user where …
Update from t_user set name = …
練習:查詢所有用戶,如果輸入了姓名按照姓名進行模糊查詢,如果輸入年齡,按照年齡進行查詢。
定義接口
編寫mapper.xml
Where標簽 代替了 where這個關鍵字 , 并且會把多余的and去掉
測試
結果:把多余的and 去掉
Set 和 where的用戶類似(自已測試)
set的使用
Set標簽 相當于 sql中 set 關鍵字
需求:如果名字信息不是null,則修改名字, 如果age信息不是null,同時也修改age
會自動去掉錯的 ,(逗號)
foreach
練習:按照多個id查詢用戶信息
Select * from t_user where id in(1,2,3)
定義接口
編寫mapper.xml
Collection:要遍歷的集合, item:接受遍歷集合的值in( 1,2,3)
測試
Trim
trim介紹
trim元素的主要功能是可以在自己包含的內容前加上某些前綴,也可以在其后加上某寫后綴,與之對應的屬性是prefix和suffix;
可以把包含內容的首部某些內容覆蓋,即忽略,也可以把尾部的某些內容覆蓋,對應的屬性是prefixOverrides和suffixOver
案例1
select * from user <trim prefix="WHERE" prefixOverrides="AND |OR"><if test="name != null and name.length()>0"> AND name=#{name}</if><if test="gender != null and gender.length()>0"> AND gender=#{gender}</if> </trim>假如說name和gender的值都不為null的話,打印的SQL為:
select * from user where name = ‘xx’ and gender = ‘xx’
where后不存在and,這是因為prefixOverrides="AND |OR"代表去掉第一個and或者是or。
案例2
update user<trim prefix="set" suffixOverrides="," suffix=" where id = #{id} "><if test="name != null and name.length()>0"> name=#{name} , </if><if test="gender != null and gender.length()>0"> gender=#{gender} , </if> </trim>假如說name和gender的值都不為null的話,打印的SQL為:
update user set name=‘xx’ , gender=‘xx’ where id=‘x’
11.緩存
一級緩存
在mybatis中,一級緩存默認是開啟的,并且一直無法關閉(我們沒法去管理一級緩存)
測試一級緩存
1、測試代碼
2、日志輸出
一級緩存滿足條件:
1、同一個session中
2、相同的SQL和參數
使用sqlsession.clearCache()強制查詢不緩存。
2、日志輸出:
執行update,delete,insert 語句的時候,清空緩存 刷新緩存
執行update,delete,insert 語句的時候 都會清空緩存 然后刷新
二級緩存
mybatis 的二級緩存的作用域是一個mapper的namespace ,同一個namespace中查詢sql可以從緩存中命中。
二級緩存是跨session
開啟二級緩存
需要在mapper.xml 中加入如下:
測試二級緩存
java代碼:
跨session來測試
需要把這個對象進行序列化
日志輸出:
因為開啟了二級緩存,第二次會去二級緩存中去命中,所有不會再發送sql語句
關閉二級緩存
在全局的mybatis-config.xml 中去關閉二級緩存
【擴展知識】
12.高級查詢
案例說明
需求
一對一查詢
查詢訂單,并且查詢出下單人的信息
sql語句分析:
我們以定單為主,不管它有沒有對應上這用戶都要把訂單查詢出來
一對一查詢實現1(了解)
思考:查詢訂單,并且查詢出下單人的信息同要把兩個信息放在一塊去
核心思想:擴展Order對象,來映射結果集。(把兩個信息放到一塊去)
第三個實體類,即用戶信息也有訂單信息
OrderUser.java
接口定義:
OrderMapper 返回第三個實體類
OrderMapper.xml中的定義
測試類
一對一查詢實現2
核心思想:面向對象的思想,在Order對象中添加User對象。 用這個
接口方法: 返回的對象是Order
使用resultType不能完成自動映射,所以需要手動完成結果集的映射,需要使用resultMap實現。
其中user里面的id 和order里面的id 一樣。哪個id是屬于誰了
測試
測試結果:
一對多查詢
一對多查詢:查詢訂單,查詢出下單人信息并且查詢出訂單詳情。
一個定單可以有多個定單詳情
sql:
select *,o.id as order_id,u.id as user_id,d.id as detail_id from tb_order as oLEFT JOIN tb_user as u on o.user_id = u.id LEFT JOIN tb_orderdetail as d on d.order_id = o.idwhere o.order_number = '20140921003';定義接口
接口定義:
Order類:
提供getter,setter 方法
編寫mapper
測試用例
用debug測試
多對多查詢
定單和商品表 是多對多的對應關系
多對多查詢:查詢訂單,查詢出下單人信息并且查詢出訂單詳情中的商品數據。
Sql分析
SELECT*,o.id as order_id,u.id as user_id,d.id as detail_idFROMtb_order as o LEFT JOIN tb_user as u ON o.user_id = u.idleft join tb_orderdetail as d on d.id = o.idleft join tb_item as i on i.id = d.item_idwhere o.order_number = #{OrderNumber};定義接口
java對象的實現:
接口:
返回order對象,里面包含了用戶,訂單詳情,商品
編寫mapper.xml
這里面就不用給itema_id起別名,因為在訂單詳情表中的名字就是item_id
編寫測試用例
resultMap的繼承
高級查詢整理
resutlType無法幫助我們自動的去完成映射,所以只有使用resultMap手動的進行映射
type 結果集對應的數據類型 id 唯一標識,被引用的時候,進行指定
<!—定義pojo中的單個對象的 property 定義對象的屬性名, javaType 屬性的類型,
<!— 如果屬性是集合使用collection ,javaType 集合的類型,ofType 表示集中的存儲的元素類型
13.分頁插件
實現通用分頁組件
Mybatis的plugin實現原理
使用PageHelper實現分頁
導入依賴
<dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>3.7.5</version></dependency><dependency><groupId>com.github.jsqlparser</groupId><artifactId>jsqlparser</artifactId><version>0.9.1</version></dependency>配置插件
這個攔截器插件放在配置環境的上面
在執行查詢時設置分頁參數
可以通過Pageinfo獲取分頁的信息
Pageinfo.getpages :總頁數
14.mybatis和spring整合
導入依賴
共22個jar包
配置spring文件
1、創建spring的配置文件applicationContext.xml
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsdhttp://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">配置資源文件替換器
applicationContext.xml
jdbc.properties
driverClass=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/springdata username=root password=root配置連接池:
applicationContext.xml
配置SqlSessionFactory
<!-- 配置SqlSessionFactory --><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource" /><!--引入mybatis的總配置 --><property name="configLocation" value="classpath:mybatis-config.xml"></property></bean>配置mapper
<!-- 配置mapper --><bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean"><!-- 配置mapper接口 (這種方式太麻煩)--><property name="mapperInterface" value="cn.yanqi.mybatis.mapper.UserMapper" /><property name="sqlSessionFactory" ref="sqlSessionFactory" /></bean>使用1
配置mapper接口掃描器
<!-- 配置mybatis mapper接口掃描器 --><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <!-- 如果配置多個mapper的路徑,可以使用,多個包使用逗號分割即可: value="cn.yanqi.mybatis.mapper,cn.yanqi.mybatis.mapper" --><property name="basePackage" value="cn.yanqi.mybatis.mapper" /></bean>在Spring配置文件中指定別名包
Mapper.xml和java代碼分離
全部配置
測試整合是否通過:
mapper整合servcie
servcie方法:
測試:
總結
以上是生活随笔為你收集整理的mybatis文档笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: springboot文档笔记
- 下一篇: web模块(一)