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

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

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

服務(wù)器之家 - 編程語(yǔ)言 - 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)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

注:代碼已托管在GitHub上,地址是:https://github.com/Damaer/Mybatis-Learning ,項(xiàng)目是mybatis-13-oneself-one2many,需要自取,需要配置maven環(huán)境以及mysql環(huán)境(sql語(yǔ)句在resource下的test.sql中),覺(jué)得有用可以點(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,用來(lái)表示該欄目的父欄目,一級(jí)欄目沒(méi)有父欄目的,可以將其外鍵設(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>

測(cè)試類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>

單元測(cè)試:

  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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 爽好舒服使劲添高h视频 | 欧美破苞合集 magnet | 精品无人区麻豆乱码1区2 | 精品欧美日韩一区二区三区 | 农村妇女野战bbxxx | 成人免费毛片一区二区三区 | 毛毛片在线 | 国产综合亚洲专区在线 | 午夜影视在线观看 | 免费看隐私美女 | 亚洲视频在线免费 | 欧美另类xxx精品人妖 | jk制服喷水 | 草草草视频在线观看 | 国产成人免费高清激情视频 | 亚洲视频久久 | 免看一级a一片成人123 | aaaa黄 | 人与动人物性行为zozo共患病 | 亚洲欧美日韩国产一区图片 | 韩国三级在线观看 完整版 韩国三级视频网站 | 王的视频视ivk | 亚洲人成网站在线观看妞妞网 | 情侣宾馆愉拍自拍视频 | 四虎影视永久在线观看 | 亚洲精品国产一区二区三区在 | 狠狠色婷婷丁香六月 | 92国产福利视频一区二区 | 国产精品亚洲专区在线播放 | 亚洲男人天堂av | 亚洲成人网在线 | 免费精品国产在线观看 | 91国语精品自产拍在线观看一 | 国内外成人在线视频 | 亚洲精品乱码蜜桃久久久 | 午夜AV内射一区二区三区红桃视 | 国产午夜免费秋霞影院 | 成人亚洲欧美日韩中文字幕 | 第一福利在线视频 | 古装床戏做爰无遮挡三级 | 特黄一级 |