日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

mybatis文档笔记

發布時間:2025/3/19 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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查詢用戶信息

![在這里插入圖片描述](https://img-blog.csdnimg.cn/20200311065412420.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTE1MTk2MA==,size_16,color_FFFFFF,t_70)

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

開啟駝峰匹配:相當于去掉數據庫名字中的下劃線,然后在與java中的屬性名進行對應。

數據庫中的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中的內容進行映射。

<settings><setting name="mapUnderscoreToCamelCase" value="true" /></settings>

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語句分析:
我們以定單為主,不管它有沒有對應上這用戶都要把訂單查詢出來

SELECT*FROMtb_orderLEFT JOIN tb_user ON tb_order.user_id = tb_user.idwhere tb_order.order_number =20140921001

一對一查詢實現1(了解)


思考:查詢訂單,并且查詢出下單人的信息同要把兩個信息放在一塊去

核心思想:擴展Order對象,來映射結果集。(把兩個信息放到一塊去)
第三個實體類,即用戶信息也有訂單信息
OrderUser.java

接口定義:
OrderMapper 返回第三個實體類


OrderMapper.xml中的定義

<!-- 查詢訂單,并且查詢出下單人的信息 --><select id="queryOrderUserByNumber" resultType="OrderUser">SELECT*FROMtb_orderLEFT JOIN tb_user ON tb_order.user_id = tb_user.idwhere tb_order.order_number = #{orderNumber}</select>

測試類

一對一查詢實現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

<!-- 使用spring自帶的占位符替換功能 --><beanclass="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"><!-- 配置資源文件 --><property name="locations"><list><value>classpath:jdbc.properties</value></list></property></bean>

jdbc.properties

driverClass=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/springdata username=root password=root

配置連接池:
applicationContext.xml

<!-- 配置連接池 --><bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"destroy-method="close"><property name="driverClass" value="${c3p0.driverClass}"></property><property name="jdbcUrl" value="${c3p0.url}"></property><property name="user" value="${c3p0.user}"></property><property name="password" value="${c3p0.password}"></property></bean>

配置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文档笔记的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。