激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

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

服務(wù)器之家 - 編程語言 - Java教程 - Mybatis自關(guān)聯(lián)查詢一對(duì)多查詢的實(shí)現(xiàn)示例

Mybatis自關(guān)聯(lián)查詢一對(duì)多查詢的實(shí)現(xiàn)示例

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

這篇文章主要介紹了Mybatis自關(guān)聯(lián)查詢一對(duì)多查詢的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

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

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

所謂自關(guān)聯(lián)查詢,是指自己既然充當(dāng)一方,又充當(dāng)多方。比如新聞欄目的數(shù)據(jù)表,自己可以是父欄目,也可以是多方,子欄目。在數(shù)據(jù)表里面實(shí)現(xiàn)就是一張表,有一個(gè)外鍵pid,用來表示該欄目的父欄目,一級(jí)欄目沒有父欄目的,可以將其外鍵設(shè)置為0。

DB表如下:

Mybatis自關(guān)聯(lián)查詢一對(duì)多查詢的實(shí)現(xiàn)示例

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

 

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

實(shí)體類NewsLabel.java,使用一對(duì)多的關(guān)系:

  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. }

結(jié)果:

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=[]]]]

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

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

 

添加一個(gè)sql的接口:

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

mapper文件里面實(shí)現(xiàn),在resultMap里面遞歸調(diào)用另一個(gè)sql,最外層的sql只執(zhí)行一次,這樣就可以實(shí)現(xiàn)查詢自身一次,遞歸查詢子孫欄目的功能:

  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. }

結(jié)果:

[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=[]]]]]]

到此這篇關(guān)于Mybatis自關(guān)聯(lián)查詢一對(duì)多查詢的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)Mybatis 一對(duì)多查詢內(nèi)容請(qǐng)搜索我們以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持我們!

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 欧美成人一二三区 | 亚洲视频黄 | 国产成人高清在线观看 | 久久艹精品视频 | 天海翼四虎精品正在播放 | 成人三级电影网址 | 国产免费观看视频 | 久久久久性 | 在线视频1区 | 成人h精品动漫一区二区三区 | 亚洲国产资源 | 97久久日一线二线三线 | 久久国产成人精品国产成人亚洲 | 激情在线视频 | 黄色片免费看网站 | 国产成年人网站 | 叶子楣成人爽a毛片免费啪啪 | 国产在线a| 欧美另类视频在线 | 91麻豆精品国产91久久久更新资源速度超快 | 国产精品久久久久久久久久久久午夜 | 男人的天堂色偷偷 | 欧美精品一区二区久久 | av电影在线网站 | 免费一级欧美 | 欧美一级视频网站 | 妇子乱av一区二区三区 | 欧美日韩一| 日本精品婷婷久久爽一下 | 免费一级a毛片免费观看 | 92自拍视频 | 欧美日本在线播放 | 国产亚洲综合一区二区 | 一级黄色片武则天 | xxxxxx免费| 免费视频a | 日本一区二区高清不卡 | 日本在线观看视频网站 | 极品五月天 | 亚洲啊v在线观看 | 国产精品久久久久网站 |