springboot整合mybatis實(shí)現(xiàn)多表查詢的實(shí)戰(zhàn)記錄
什么是mybatis
(1)Mybatis 是一個(gè)半 ORM(對(duì)象關(guān)系映射)框架,它內(nèi)部封裝了 JDBC,開發(fā)時(shí)只需要關(guān)注 SQL 語(yǔ)句本身,不需要花費(fèi)精力去處理加載驅(qū)動(dòng)、創(chuàng)建連接、創(chuàng)建statement 等繁雜的過(guò)程。程序員直接編寫原生態(tài) sql,可以嚴(yán)格控制 sql 執(zhí)行性能,靈活度高。
(2)MyBatis 可以使用 XML 或注解來(lái)配置和映射原生信息,將 POJO 映射成數(shù)據(jù)庫(kù)中的記錄,避免了幾乎所有的 JDBC 代碼和手動(dòng)設(shè)置參數(shù)以及獲取結(jié)果集。 @Insert @Repository
(3)通過(guò) xml 文件或注解的方式將要執(zhí)行的各種 statement 配置起來(lái),并通過(guò)java 對(duì)象和 statement 中 sql 的動(dòng)態(tài)參數(shù)進(jìn)行映射生成最終執(zhí)行的 sql 語(yǔ)句,最后由 mybatis 框架執(zhí)行 sql 并將結(jié)果映射為 java 對(duì)象并返回。(從執(zhí)行 sql 到返回 result 的過(guò)程)。
Mybaits 的優(yōu)點(diǎn):
(1)基 于 SQL 語(yǔ)句編程,相當(dāng)靈活,不會(huì)對(duì)應(yīng)用程序或者數(shù)據(jù)庫(kù)的現(xiàn)有設(shè)計(jì)造成任何影響,SQL 寫在 XML 里,解除 sql 與程序代碼的耦合,便于統(tǒng)一管理;提供 XML標(biāo)簽,支持編寫動(dòng)態(tài) SQL 語(yǔ)句,并可重用。
(2)與 JDBC 相比,減少了 50%以上的代碼量,消除了 JDBC 大量冗余的代碼,不需要手動(dòng)開關(guān)連接;
(3)很好的與各種數(shù)據(jù)庫(kù)兼容(因?yàn)?MyBatis 使用 JDBC 來(lái)連接數(shù)據(jù)庫(kù),所以只要JDBC 支持的數(shù)據(jù)庫(kù) MyBatis 都支持)。
(4)能夠與 Spring 很好的集成;
Mybatis是如何進(jìn)行分頁(yè)的?分頁(yè)插件的原理是什么?
Mybatis使用RowBounds對(duì)象進(jìn)行分頁(yè),它是針對(duì)ResultSet結(jié)果集執(zhí)行的內(nèi)存分頁(yè),而非物理分頁(yè)??梢栽趕ql內(nèi)直接書寫帶有物理分頁(yè)的參數(shù)來(lái)完成物理分頁(yè)功能,也可以使用分頁(yè)插件來(lái)完成物理分頁(yè)。
下面將詳細(xì)springboot整合mybatis多表查詢的方法,一起來(lái)看看吧
1、一對(duì)一查詢(例一個(gè)用戶一個(gè)賬戶)
1.1、實(shí)體類
//用戶實(shí)體 @Data public class UserInfo { private int u_id; private String name; private Account account; } //賬戶實(shí)體 @Data public class Account { private int a_id; private String aname; private double money; }
1.2、數(shù)據(jù)庫(kù)表
用戶表
賬戶表
1.3、持久層接口
@Select("select * from userInfo where name=#{name} ") @Results({ //@Result(property = "a_id",column = "a_id"), @Result(property ="account",column = "a_id",javaType = Account.class, one = @One(select="com.bbz.dao.AccountDao.findById",fetchType = FetchType.LAZY)) }) public UserInfo findUserlnfo(String name);
@Select("select * from account where a_id=#{a_id}") public Account findById (int a_id);
2、一對(duì)多查詢(例一個(gè)用戶對(duì)應(yīng)多個(gè)賬戶)
2.1、實(shí)體類
//用戶實(shí)體 @Data public class UserInfo { private int u_id; private String name; private List<Account>accountList; } //賬戶實(shí)體 @Data public class Account { private int id; private int a_id; private String aname; private double money; }
2.2、數(shù)據(jù)庫(kù)表
用戶表
賬戶表
2.3、持久層接口
@Select("select * from userInfo where name=#{name}") @Results({ @Result(property ="accountList",column ="a_id",javaType = List.class, many = @Many(select = "com.bbz.dao.AccountDao.findById",fetchType = FetchType.LAZY) ) }) public UserInfo findUser(String name); //fetchType = FetchType.LAZY):提取方式為延遲加載,默認(rèn)是立即加載
@Select("select * from account where a_id=#{a_id}") public Account findById (int a_id);
3、總結(jié)
共同點(diǎn):
無(wú)論是一對(duì)一還是一對(duì)多,都是通過(guò)附屬查詢來(lái)實(shí)現(xiàn)的,我們需要定義這個(gè)附屬查詢方法。
在主查詢方法中通過(guò)@One、@Many指定附屬查詢方法的全路徑。
都通過(guò)column來(lái)傳遞參數(shù)給附屬方法。
不同點(diǎn):
一對(duì)一,那么附屬方法返回的是一個(gè)單獨(dú)的對(duì)象
一對(duì)多,那么附屬方法返回的是一個(gè)對(duì)象集合
4、多對(duì)多的查詢(例一個(gè)用戶多個(gè)角色)
4.1、實(shí)體類
//用戶實(shí)體 @Data public class UserInfo { private int u_id; private String name; private List<Role>roleList; } //角色實(shí)體 @Data public class Role { private int r_id; private String name; }
4.2、數(shù)據(jù)庫(kù)表
用戶表
角色表
中間表
4.3、持久層接口
@Select("select * from userInfo where u_id=#{u_id}") @Results({ @Result(property = "u_id",column = "u_id"), @Result(property ="roleList",column ="u_id",javaType = List.class, many = @Many(select = "com.bbz.dao.RoleDao.findById",fetchType = FetchType.LAZY) ) }) public UserInfo findUser(int u_id);
@Select("select * from role r,user_role ur where r.r_id=ur.r_id and ur.u_id=#{u_id}") public List<Role> findById(int U_id);
5、多對(duì)一(一個(gè)用戶對(duì)應(yīng)多個(gè)老師)
5.1 實(shí)體類
//用戶實(shí)體 @Data public class UserInfo { private int u_id; private String name; private Teacher teacher; } //老師實(shí)體 public class Teacher { public int t_id; public String name; }
5.2、數(shù)據(jù)庫(kù)表
用戶表
老師表
5.3、持久層接口
@Select("select * from userInfo where u_id=#{u_id}") @Results({ @Result(property ="teacher",column ="t_id",javaType = Teacher.class, one= @One(select = "com.bbz.dao.TeacherDao.findById",fetchType = FetchType.LAZY) ) })
@Select("select * from teacher where t_id=#{t_id}") public Teacher findById(int t_id);
總結(jié)
到此這篇關(guān)于springboot整和mybatis實(shí)現(xiàn)多表查詢的文章就介紹到這了,更多相關(guān)springboot整和mybatis多表查詢內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- MyBatis-Plus詳解(環(huán)境搭建、關(guān)聯(lián)操作)
- MybatisPlus實(shí)現(xiàn)對(duì)象嵌套關(guān)聯(lián)查詢一對(duì)多List集合查詢
- mybatis主從表關(guān)聯(lián)查詢,返回對(duì)象帶有集合屬性解析
- mybatis多表查詢的實(shí)現(xiàn)(xml方式)
- MyBatis如何實(shí)現(xiàn)多表查詢(多對(duì)一、一對(duì)多)
- MybatisPlus自定義Sql實(shí)現(xiàn)多表查詢的示例
- 結(jié)合mybatis-plus實(shí)現(xiàn)簡(jiǎn)單不需要寫sql的多表查詢
- MyBatis中的關(guān)聯(lián)關(guān)系配置與多表查詢的操作代碼
相關(guān)文章
java int類型二維數(shù)組實(shí)現(xiàn)“楊輝三角”的完整實(shí)例
這篇文章主要給大家介紹了關(guān)于java int類型二維數(shù)組實(shí)現(xiàn)“楊輝三角”的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12SpringMvc請(qǐng)求處理參數(shù)?和?響應(yīng)數(shù)據(jù)處理的示例詳解
這篇文章主要介紹了SpringMvc請(qǐng)求處理參數(shù)和響應(yīng)數(shù)據(jù)處理,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-09-09Java 處理圖片與base64 編碼的相互轉(zhuǎn)換的示例
本篇文章主要介紹了Java 處理圖片與base64 編碼的相互轉(zhuǎn)換的示例,具有一定的參考價(jià)值,有興趣的可以了解一下2017-08-08spring security獲取用戶信息為null或者串值的解決
這篇文章主要介紹了spring security獲取用戶信息為null或者串值的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03Java中POST、GET、@RequestBody和@RequestParam區(qū)別詳析
在前后端傳json數(shù)據(jù)進(jìn)行交互的時(shí)候,同學(xué)們會(huì)經(jīng)常用到的兩個(gè)注解,@RequestBody和@RequestParam主要是用來(lái)接收前端傳給后端的json數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于Java中POST、GET、@RequestBody和@RequestParam區(qū)別的相關(guān)資料,需要的朋友可以參考下2022-10-10SpringBoot管理RabbitMQ中的Channel詳解
這篇文章主要介紹了SpringBoot管理RabbitMQ中的Channel詳解,channel僅存在于connection的上下文中,而不會(huì)單獨(dú)存在,當(dāng)channel關(guān)閉時(shí),其上的所有channel也會(huì)關(guān)閉,需要的朋友可以參考下2023-08-08