国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

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

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 黄色美女网站免费 | 日韩免费一区二区 | 亚洲综合无码一区二区 | 国产精品亲子伦av一区二区三区 | 国产一区二区影院 | 成年人黄色免费网站 | av中文字幕在线播放 | 日韩在线视频播放 | 日韩一区二区在线观看 | 成年人在线看片 | 久久久久久成人 | 精品国产乱码久久久久久影片 | 91在线视频观看 | 色视av| 亚洲成人精品久久久 | 日韩精品一区二区三区在线播放 | 成av在线 | 国产精品久久久久久久午夜片 | 亚洲精品一区二区在线 | 老丁头电影在线观看 | 久久精品电影 | 日韩欧美一区二区三区在线观看 | 亚洲激情视频 | 国产高清在线精品一区二区三区 | 99精品国产一区二区三区 | 精品久久久久久 | 在线视频亚洲 | 免费黄色大片 | 91国内视频在线观看 | 人人澡人人爽 | 日本久久网| 国产黄色在线观看 | 国产一区av在线 | www一区| 中文字幕在线观看日本 | 日韩欧美一级 | 国产精品污www一区二区三区 | 国产精品自拍在线观看 | 看免费5xxaaa毛片 | 欧美精品91 | 亚洲精品视频免费观看 |