一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|JavaScript|易語言|

服務器之家 - 編程語言 - Java教程 - Mybatis自關聯查詢一對多查詢的實現示例

Mybatis自關聯查詢一對多查詢的實現示例

2021-08-02 10:48秦懷雜貨店 Java教程

這篇文章主要介紹了Mybatis自關聯查詢一對多查詢的實現示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

注:代碼已托管在GitHub上,地址是:https://github.com/Damaer/Mybatis-Learning ,項目是mybatis-13-oneself-one2many,需要自取,需要配置maven環境以及mysql環境(sql語句在resource下的test.sql中),覺得有用可以點個小星星。

docsify文檔地址在:https://damaer.github.io/Mybatis-Learning/#/

所謂自關聯查詢,是指自己既然充當一方,又充當多方。比如新聞欄目的數據表,自己可以是父欄目,也可以是多方,子欄目。在數據表里面實現就是一張表,有一個外鍵pid,用來表示該欄目的父欄目,一級欄目沒有父欄目的,可以將其外鍵設置為0。

DB表如下:

Mybatis自關聯查詢一對多查詢的實現示例

查詢指定欄目的所有子孫欄目

 

查詢指定目錄的所有子孫目錄,我們需要使用遞歸的思想,查出當前欄目之后,需要將當前欄目的id作為下一級欄目的pid。

實體類NewsLabel.java,使用一對多的關系:

  1. import java.util.Set;
  2.  
  3. public class NewsLabel {
  4. private Integer id;
  5. private String name;
  6. private Set<NewsLabel>children;
  7. public Integer getId() {
  8. return id;
  9. }
  10. public void setId(Integer id) {
  11. this.id = id;
  12. }
  13. public String getName() {
  14. return name;
  15. }
  16. public void setName(String name) {
  17. this.name = name;
  18. }
  19. public Set<NewsLabel> getChildren() {
  20. return children;
  21. }
  22. public void setChildren(Set<NewsLabel> children) {
  23. this.children = children;
  24. }
  25.  
  26. @Override
  27. public String toString() {
  28. return "NewsLabel [id=" + id + ", name=" + name + ", children="
  29. + children + "]";
  30. }
  31.  
  32. }

定義sql接口:

  1. public interface INewsLabelDao {
  2. List<NewsLabel> selectChildByParentId(int pid);
  3. }

mapper.xml文件,在遞歸里面使用本身sql:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="dao.INewsLabelDao">
  6. <resultMap type="beans.NewsLabel" id="newsLabelMapper">
  7. <id column="id" property="id"/>
  8. <result column="name" property="name"/>
  9. <collection property="children"
  10. ofType="NewsLabel"
  11. select="selectChildByParentId"
  12. column="id"/>
  13. </resultMap>
  14. <select id="selectChildByParentId" resultMap="newsLabelMapper">
  15. select id,name from newslabel where pid=#{xxx}
  16. </select>
  17. </mapper>

測試類MyTest.java:

  1. public class MyTest {
  2. private INewsLabelDao dao;
  3. private SqlSession sqlSession;
  4. @Before
  5. public void Before(){
  6. sqlSession=MyBatisUtils.getSqlSession();
  7. dao=sqlSession.getMapper(INewsLabelDao.class);
  8. }
  9. @Test
  10. public void TestselectMinisterById(){
  11. List<NewsLabel>children=dao.selectChildByParentId(2);
  12. for(NewsLabel newsLabel:children){
  13. System.out.println(newsLabel);
  14. }
  15. }
  16. @After
  17. public void after(){
  18. if(sqlSession!=null){
  19. sqlSession.close();
  20. }
  21. }
  22.  
  23. }

結果:

NewsLabel [id=3, name=NBA, children=[NewsLabel [id=5, name=火箭, children=[]], NewsLabel [id=6, name=湖人, children=[]]]]
NewsLabel [id=4, name=CBA, children=[NewsLabel [id=7, name=北京金甌, children=[]], NewsLabel [id=8, name=浙江廣夏, children=[]], NewsLabel [id=9, name=青島雙星, children=[]]]]

這樣的寫法只能選出子孫欄目,不能將自己的信息輸出。

查詢指定目錄以及指定子孫目錄

 

添加一個sql的接口:

  1. List<NewsLabel> selectSelfAndChildByParentId(int pid);

mapper文件里面實現,在resultMap里面遞歸調用另一個sql,最外層的sql只執行一次,這樣就可以實現查詢自身一次,遞歸查詢子孫欄目的功能:

  1. <!-- 篩選出自己以及子孫欄目-->
  2. <select id="selectChildByParentId2" resultMap="newsLabelMapper2">
  3. select id,name from newslabel where pid=#{ooo}
  4. </select>
  5. <resultMap type="beans.NewsLabel" id="newsLabelMapper2">
  6. <id column="id" property="id"/>
  7. <result column="name" property="name"/>
  8. <collection property="children"
  9. ofType="NewsLabel"
  10. select="selectChildByParentId2"
  11. column="id"/>
  12. </resultMap>
  13. <select id="selectSelfAndChildByParentId" resultMap="newsLabelMapper2">
  14. select id,name from newslabel where id=#{xxx}
  15. </select>

單元測試:

  1. @Test
  2. public void TestselectSelfAndChildrenLabelById(){
  3. List<NewsLabel> children = dao.selectSelfAndChildByParentId(2);
  4. for (NewsLabel newsLabel : children) {
  5. System.out.println(newsLabel);
  6. }
  7. }

結果:

[service] 2018-07-16 11:17:16,667 - org.apache.ibatis.transaction.jdbc.JdbcTransaction -450  [main] DEBUG org.apache.ibatis.transaction.jdbc.JdbcTransaction  - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@5bb21b69]
[service] 2018-07-16 11:17:16,669 - dao.INewsLabelDao.selectSelfAndChildByParentId -452  [main] DEBUG dao.INewsLabelDao.selectSelfAndChildByParentId  - ==>  Preparing: select id,name from newslabel where id=?
[service] 2018-07-16 11:17:16,704 - dao.INewsLabelDao.selectSelfAndChildByParentId -487  [main] DEBUG dao.INewsLabelDao.selectSelfAndChildByParentId  - ==> Parameters: 2(Integer)
[service] 2018-07-16 11:17:16,722 - dao.INewsLabelDao.selectChildByParentId2 -505  [main] DEBUG dao.INewsLabelDao.selectChildByParentId2  - ====>  Preparing: select id,name from newslabel where pid=?
[service] 2018-07-16 11:17:16,723 - dao.INewsLabelDao.selectChildByParentId2 -506  [main] DEBUG dao.INewsLabelDao.selectChildByParentId2  - ====> Parameters: 2(Integer)
[service] 2018-07-16 11:17:16,726 - dao.INewsLabelDao.selectChildByParentId2 -509  [main] DEBUG dao.INewsLabelDao.selectChildByParentId2  - ======>  Preparing: select id,name from newslabel where pid=?
[service] 2018-07-16 11:17:16,726 - dao.INewsLabelDao.selectChildByParentId2 -509  [main] DEBUG dao.INewsLabelDao.selectChildByParentId2  - ======> Parameters: 3(Integer)
[service] 2018-07-16 11:17:16,727 - dao.INewsLabelDao.selectChildByParentId2 -510  [main] DEBUG dao.INewsLabelDao.selectChildByParentId2  - ========>  Preparing: select id,name from newslabel where pid=?
[service] 2018-07-16 11:17:16,728 - dao.INewsLabelDao.selectChildByParentId2 -511  [main] DEBUG dao.INewsLabelDao.selectChildByParentId2  - ========> Parameters: 5(Integer)
[service] 2018-07-16 11:17:16,729 - dao.INewsLabelDao.selectChildByParentId2 -512  [main] DEBUG dao.INewsLabelDao.selectChildByParentId2  - <========      Total: 0
[service] 2018-07-16 11:17:16,732 - dao.INewsLabelDao.selectChildByParentId2 -515  [main] DEBUG dao.INewsLabelDao.selectChildByParentId2  - ========>  Preparing: select id,name from newslabel where pid=?
[service] 2018-07-16 11:17:16,732 - dao.INewsLabelDao.selectChildByParentId2 -515  [main] DEBUG dao.INewsLabelDao.selectChildByParentId2  - ========> Parameters: 6(Integer)
[service] 2018-07-16 11:17:16,733 - dao.INewsLabelDao.selectChildByParentId2 -516  [main] DEBUG dao.INewsLabelDao.selectChildByParentId2  - <========      Total: 0
[service] 2018-07-16 11:17:16,734 - dao.INewsLabelDao.selectChildByParentId2 -517  [main] DEBUG dao.INewsLabelDao.selectChildByParentId2  - <======      Total: 2
[service] 2018-07-16 11:17:16,734 - dao.INewsLabelDao.selectChildByParentId2 -517  [main] DEBUG dao.INewsLabelDao.selectChildByParentId2  - ======>  Preparing: select id,name from newslabel where pid=?
[service] 2018-07-16 11:17:16,734 - dao.INewsLabelDao.selectChildByParentId2 -517  [main] DEBUG dao.INewsLabelDao.selectChildByParentId2  - ======> Parameters: 4(Integer)
[service] 2018-07-16 11:17:16,736 - dao.INewsLabelDao.selectChildByParentId2 -519  [main] DEBUG dao.INewsLabelDao.selectChildByParentId2  - ========>  Preparing: select id,name from newslabel where pid=?
[service] 2018-07-16 11:17:16,736 - dao.INewsLabelDao.selectChildByParentId2 -519  [main] DEBUG dao.INewsLabelDao.selectChildByParentId2  - ========> Parameters: 7(Integer)
[service] 2018-07-16 11:17:16,738 - dao.INewsLabelDao.selectChildByParentId2 -521  [main] DEBUG dao.INewsLabelDao.selectChildByParentId2  - <========      Total: 0
[service] 2018-07-16 11:17:16,738 - dao.INewsLabelDao.selectChildByParentId2 -521  [main] DEBUG dao.INewsLabelDao.selectChildByParentId2  - ========>  Preparing: select id,name from newslabel where pid=?
[service] 2018-07-16 11:17:16,739 - dao.INewsLabelDao.selectChildByParentId2 -522  [main] DEBUG dao.INewsLabelDao.selectChildByParentId2  - ========> Parameters: 8(Integer)
[service] 2018-07-16 11:17:16,741 - dao.INewsLabelDao.selectChildByParentId2 -524  [main] DEBUG dao.INewsLabelDao.selectChildByParentId2  - <========      Total: 0
[service] 2018-07-16 11:17:16,742 - dao.INewsLabelDao.selectChildByParentId2 -525  [main] DEBUG dao.INewsLabelDao.selectChildByParentId2  - ========>  Preparing: select id,name from newslabel where pid=?
[service] 2018-07-16 11:17:16,742 - dao.INewsLabelDao.selectChildByParentId2 -525  [main] DEBUG dao.INewsLabelDao.selectChildByParentId2  - ========> Parameters: 9(Integer)
[service] 2018-07-16 11:17:16,743 - dao.INewsLabelDao.selectChildByParentId2 -526  [main] DEBUG dao.INewsLabelDao.selectChildByParentId2  - <========      Total: 0
[service] 2018-07-16 11:17:16,744 - dao.INewsLabelDao.selectChildByParentId2 -527  [main] DEBUG dao.INewsLabelDao.selectChildByParentId2  - <======      Total: 3
[service] 2018-07-16 11:17:16,744 - dao.INewsLabelDao.selectChildByParentId2 -527  [main] DEBUG dao.INewsLabelDao.selectChildByParentId2  - <====      Total: 2
[service] 2018-07-16 11:17:16,745 - dao.INewsLabelDao.selectSelfAndChildByParentId -528  [main] DEBUG dao.INewsLabelDao.selectSelfAndChildByParentId  - <==      Total: 1
NewsLabel [id=2, name=體育新聞, children=[NewsLabel [id=3, name=NBA, children=[NewsLabel [id=6, name=湖人, children=[]], NewsLabel [id=5, name=火箭, children=[]]]], NewsLabel [id=4, name=CBA, children=[NewsLabel [id=7, name=北京金甌, children=[]], NewsLabel [id=8, name=浙江廣夏, children=[]], NewsLabel [id=9, name=青島雙星, children=[]]]]]]

到此這篇關于Mybatis自關聯查詢一對多查詢的實現示例的文章就介紹到這了,更多相關Mybatis 一對多查詢內容請搜索我們以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持我們!

原文鏈接:https://segmentfault.com/a/1190000039134263

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 成人免费视屏 | 好大水好多好爽好硬好深视频 | 国产一级特黄aa大片在线 | 好奇害死猫在线观看 | 69堂最新地域网名 | 国内在线观看 | 精品视频在线免费播放 | 欧美一级高清片免费一级 | 出差上的少妇20p | 久久久这里有精品999 | 三体动漫在线观看免费完整版2022 | 精品视频久久久久 | 婷婷网址 | 免费尤物视频 | 男女真实无遮挡xx00动态图软件 | 日韩毛片基地一区二区三区 | 国产成人精品实拍在线 | 亚洲精品二三区伊人久久 | 成年人黄色录像 | 欧美黑大吊 | 久久re视频精品538在线 | 日本在线视频免费观看 | 俺去也亚洲色图 | 四虎影院免费在线 | 国产综合色在线视频区色吧图片 | 欧美一级鲁丝片免费看 | 嫩草影院永久入口在线观看 | 天堂网www在线中文天堂 | 成人精品一区久久久久 | 日韩毛片免费在线观看 | 亚洲图片一区二区三区 | 亚洲国产高清视频 | 免费人成在线观看 | 女暴露狂校园裸露小说 | 欧美肥胖bb| 四虎国产精品免费入口 | 大伊香蕉精品二区视频在线 | 国产精品一级香蕉一区 | 男人的天堂视频 | 色综合视频一区二区观看 | 情人我吃糖果小说 |