springboot整合mybatis實現多表查詢的實戰記錄
什麼是mybatis
(1)Mybatis 是一個半 ORM(對象關系映射)框架,它內部封裝瞭 JDBC,開發時隻需要關註 SQL 語句本身,不需要花費精力去處理加載驅動、創建連接、創建statement 等繁雜的過程。程序員直接編寫原生態 sql,可以嚴格控制 sql 執行性能,靈活度高。
(2)MyBatis 可以使用 XML 或註解來配置和映射原生信息,將 POJO 映射成數據庫中的記錄,避免瞭幾乎所有的 JDBC 代碼和手動設置參數以及獲取結果集。 @Insert @Repository
(3)通過 xml 文件或註解的方式將要執行的各種 statement 配置起來,並通過java 對象和 statement 中 sql 的動態參數進行映射生成最終執行的 sql 語句,最後由 mybatis 框架執行 sql 並將結果映射為 java 對象並返回。(從執行 sql 到返回 result 的過程)。
Mybaits 的優點:
(1)基 於 SQL 語句編程,相當靈活,不會對應用程序或者數據庫的現有設計造成任何影響,SQL 寫在 XML 裡,解除 sql 與程序代碼的耦合,便於統一管理;提供 XML標簽,支持編寫動態 SQL 語句,並可重用。
(2)與 JDBC 相比,減少瞭 50%以上的代碼量,消除瞭 JDBC 大量冗餘的代碼,不需要手動開關連接;
(3)很好的與各種數據庫兼容(因為 MyBatis 使用 JDBC 來連接數據庫,所以隻要JDBC 支持的數據庫 MyBatis 都支持)。
(4)能夠與 Spring 很好的集成;
Mybatis是如何進行分頁的?分頁插件的原理是什麼?
Mybatis使用RowBounds對象進行分頁,它是針對ResultSet結果集執行的內存分頁,而非物理分頁。可以在sql內直接書寫帶有物理分頁的參數來完成物理分頁功能,也可以使用分頁插件來完成物理分頁。
下面將詳細springboot整合mybatis多表查詢的方法,一起來看看吧
1、一對一查詢(例一個用戶一個賬戶)
1.1、實體類
//用戶實體 @Data public class UserInfo { private int u_id; private String name; private Account account; } //賬戶實體 @Data public class Account { private int a_id; private String aname; private double money; }
1.2、數據庫表
用戶表
賬戶表
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、一對多查詢(例一個用戶對應多個賬戶)
2.1、實體類
//用戶實體 @Data public class UserInfo { private int u_id; private String name; private List<Account>accountList; } //賬戶實體 @Data public class Account { private int id; private int a_id; private String aname; private double money; }
2.2、數據庫表
用戶表
賬戶表
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):提取方式為延遲加載,默認是立即加載
@Select("select * from account where a_id=#{a_id}") public Account findById (int a_id);
3、總結
共同點:
無論是一對一還是一對多,都是通過附屬查詢來實現的,我們需要定義這個附屬查詢方法。
在主查詢方法中通過@One、@Many指定附屬查詢方法的全路徑。
都通過column來傳遞參數給附屬方法。
不同點:
一對一,那麼附屬方法返回的是一個單獨的對象
一對多,那麼附屬方法返回的是一個對象集合
4、多對多的查詢(例一個用戶多個角色)
4.1、實體類
//用戶實體 @Data public class UserInfo { private int u_id; private String name; private List<Role>roleList; } //角色實體 @Data public class Role { private int r_id; private String name; }
4.2、數據庫表
用戶表
角色表
中間表
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、多對一(一個用戶對應多個老師)
5.1 實體類
//用戶實體 @Data public class UserInfo { private int u_id; private String name; private Teacher teacher; } //老師實體 public class Teacher { public int t_id; public String name; }
5.2、數據庫表
用戶表
老師表
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);
總結
到此這篇關於springboot整和mybatis實現多表查詢的文章就介紹到這瞭,更多相關springboot整和mybatis多表查詢內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Mybatis使用@one和@Many實現一對一及一對多關聯查詢
- Mybatis一對多查詢列表屬性處理示例詳解
- mybatis多表查詢的實現(xml方式)
- mybatis如何使用註解實現一對多關聯查詢
- Mybatis中resultMap的Colum和property屬性詳解