Mybatis级联查询

Posted 虚极静笃

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mybatis级联查询相关的知识,希望对你有一定的参考价值。

转自:http://blog.csdn.net/yulei_qq/article/details/22039815

工程的目录结构:

技术分享

有两个表,一个文章表article ,一个用户表user。

 

[sql] view plain copy
 
  1. create table  article (id int(11) not null auto_increment,  
  2.                        userid int(11) not null,  
  3.                        title varchar(100) not null,  
  4.                        content text not null,  
  5.                        primary key (id))ENGINE=InnoDB DEFAULT CHARSET=utf8;  
  6.    
  7. insert into article(id,userid,title,content) values(1,1,‘test_title‘,‘text_content‘);   
  8.   
  9. insert into article(id,userid,title,content) values(2,1,‘test_title_2‘,‘text_content_2‘);     
  10. insert into article(id,userid,title,content) values(3,1,‘test_title_3‘,‘text_content_3‘);                           
  11. insert into article(id,userid,title,content) values(4,1,‘test_title_4‘,‘text_content_4‘);    
  12.   
  13.   
  14. create table user (id int(11) not null auto_increment,  
  15.                    userName varchar(50) default null,  
  16.                    userAge int(11) default null,  
  17.                    userAddress varchar(200) default null,  
  18.                    primary key(id)) ENGINE=InnoDB DEFAULT CHARSET=utf8;  
  19.                      
  20.   
  21. insert into user(id,userName,userAge,userAddress) values(1,‘summer‘,‘100‘,‘上海‘);  

现在要查询,根据用户的ID来查询他所拥有的文章。那么需要编写SQL语句如下:

[sql] view plain copy
 
  1. select a.id, a.userName ,a.userAddress ,b.id aid, b.title,b.content  
  2.                                           from user a,article b   
  3.                                          where a.id=b.userid and a.id=#{id}  


现在就来贴下相关的JAVA代码和映射文件吧,该说的都在注释里了。

 

User.java

 

[java] view plain copy
 
  1. package com.mybatis.model;  
  2.   
  3. public class User {  
  4.  private int id;  
  5.  private String userName;  
  6.  private String userAge;  
  7.  private String userAddress;  
  8.    
  9. public int getId() {  
  10.     return id;  
  11. }  
  12. public void setId(int id) {  
  13.     this.id = id;  
  14. }  
  15. public String getUserName() {  
  16.     return userName;  
  17. }  
  18. public void setUserName(String userName) {  
  19.     this.userName = userName;  
  20. }  
  21. public String getUserAge() {  
  22.     return userAge;  
  23. }  
  24. public void setUserAge(String userAge) {  
  25.     this.userAge = userAge;  
  26. }  
  27. public String getUserAddress() {  
  28.     return userAddress;  
  29. }  
  30.  public void setUserAddress(String userAddress) {  
  31.     this.userAddress = userAddress;  
  32.   }  
  33.    
  34. }  


Article.java

 

 

[java] view plain copy
 
  1. package com.mybatis.model;  
  2.   
  3. public class Article {  
  4.       
  5.     private int id;  
  6.     private User user; //文章的用户定义一个User对象,而不是int 类型  
  7.     private String title;  
  8.     private String content;  
  9.       
  10.     public int getId() {  
  11.         return id;  
  12.     }  
  13.     public void setId(int id) {  
  14.         this.id = id;  
  15.     }  
  16.     public User getUser() {  
  17.         return user;  
  18.     }  
  19.     public void setUser(User user) {  
  20.         this.user = user;  
  21.     }  
  22.     public String getTitle() {  
  23.         return title;  
  24.     }  
  25.     public void setTitle(String title) {  
  26.         this.title = title;  
  27.     }  
  28.     public String getContent() {  
  29.         return content;  
  30.     }  
  31.     public void setContent(String content) {  
  32.         this.content = content;  
  33.     }  
  34.       
  35. }  


接口类

 

IUserDao.java

 

[java] view plain copy
 
  1. package com.mybatis.dao;  
  2.   
  3. import java.util.List;  
  4. import com.mybatis.model.Article;  
  5.   
  6. public interface IUserDao {  
  7.       
  8.  public List<Article> getUserArticles(int id);  
  9. }  


总配置文件configution.xml

 

 

[html] view plain copy
 
  1. <?xml version="1.0" encoding="UTF-8" ?>     
  2. <!DOCTYPE configuration     
  3.     PUBLIC "-//mybatis.org//DTD Config 3.0//EN"     
  4.     "http://mybatis.org/dtd/mybatis-3-config.dtd">  
  5. <configuration>  
  6.   <typeAliases>  
  7.     <!-- 给实体类去一个别名  -->  
  8.         <typeAlias type="com.mybatis.model.User" alias="User"/>   
  9.         <typeAlias type="com.mybatis.model.Article" alias="Article"/>  
  10.   </typeAliases>  
  11.     
  12.   <!-- 数据源配置,这里用mysql数据库 -->  
  13.   <environments default="development">  
  14.      <environment id="development">  
  15.          <transactionManager type="JDBC"/>  
  16.          <dataSource type="POOLED">  
  17.                <property name="driver" value="com.mysql.jdbc.Driver"/>  
  18.                <property name="url" value="jdbc:mysql://127.0.0.1:3306/test"/>  
  19.                <property name="username" value="root"/>  
  20.                <property name="password" value="123456"/>  
  21.          </dataSource>  
  22.      </environment>  
  23.   </environments>  
  24.     
  25.   <mappers>  
  26.      <!-- book.xml装载进来,等同于把Dao的实现类装载进来 -->  
  27.        <mapper resource="com/mybatis/model/User.xml"/>  
  28.   </mappers>  
  29.     
  30. </configuration>  


User.xml

 

 

[html] view plain copy
 
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <!DOCTYPE mapper PUBLIC   
  3.     "-//mybatis.org//DTD Mapper 3.0//EN"  
  4.     "http://mybatis.org/dtd/mybatis-3-mapper.dtd">  
  5.       
  6. <mapper namespace="com.mybatis.dao.IUserDao">  
  7.        <!-- User联合Article进行查询 (多对一的方式)-->  
  8.        <resultMap type="Article" id="resultUserArticleList">  
  9.              <id property="id" column="aid"/>  
  10.              <result property="title" column="title"/>  
  11.              <result property="content" column="content"/>  
  12.                
  13.              <!--关联一个用户 ,如果是关联多个的话,就需要用collection了-->  
  14.             <association property="user" javaType="User"<!-- 这个 property="user" 对应的是Article中的User user属性-->  
  15.                    <id property="id" column="id"/>  
  16.                    <result property="userName" column="userName"/>  
  17.                    <result property="userAddress" column="userAddress"/>  
  18.             </association>  
  19.        </resultMap>   
  20.          
  21.        <select id="getUserArticles" parameterType="int" resultMap="resultUserArticleList">  
  22.                select a.id, a.userName ,a.userAddress ,b.id aid, b.title,b.content  
  23.                                           from user a,article b   
  24.                                          where a.id=b.userid and a.id=#{id}          
  25.        </select>  
  26. </mapper>  


总后,编写个测试类.

 

 

[java] view plain copy
 
  1. package com.mybatis.test;  
  2.   
  3. import java.io.IOException;  
  4. import java.util.List;  
  5.   
  6. import org.apache.ibatis.io.Resources;  
  7. import org.apache.ibatis.session.SqlSession;  
  8. import org.apache.ibatis.session.SqlSessionFactory;  
  9. import org.apache.ibatis.session.SqlSessionFactoryBuilder;  
  10.   
  11. import com.mybatis.dao.IUserDao;  
  12. import com.mybatis.model.Article;  
  13.   
  14. public class Test {  
  15.       
  16.     /*** 
  17.      * 获得MyBatis SqlSessionFactory 
  18.      * SqlSessionFactory 负责创建SqlSession ,一旦创建成功,就可以用SqlSession实例来执行映射语句 
  19.      * ,commit,rollback,close等方法 
  20.      * @return 
  21.      */  
  22.     private static SqlSessionFactory getSessionFactory(){  
  23.         SqlSessionFactory sessionFactory=null;  
  24.         String resource="configuration.xml";  
  25.          try {  
  26.             sessionFactory=new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader(resource));  
  27.         } catch (IOException e) {  
  28.             e.printStackTrace();  
  29.         }  
  30.         return sessionFactory;  
  31.     }  
  32.       
  33.     /** 
  34.      * main 方法 
  35.      * @param args 
  36.      */  
  37.     public static void main(String[] args) {  
  38.           
  39.           SqlSession session=getSessionFactory().openSession();  
  40.      try {  
  41.          IUserDao userDao=session.getMapper(IUserDao.class);  
  42.          //传入用户的id=1  
  43.          List<Article> listArticle=userDao.getUserArticles(1);  
  44.          for(Article article:listArticle){  
  45.              System.out.println(article.getTitle()+":"+article.getContent()+  
  46.                      ":作者是:"+article.getUser().getUserName()+":地址:"+  
  47.                       article.getUser().getUserAddress());  
  48.          }  
  49.         } catch (Exception e) {  
  50.             e.printStackTrace();  
  51.         }  
  52.           
  53.         finally{  
  54.             session.close();  
  55.         }  
  56.     }  
  57. }  


运行后结果如下:

 

 

[java] view plain copy
 
    1. test_title:text_content:作者是:summer:地址:上海  
    2. test_title_2:text_content_2:作者是:summer:地址:上海  
    3. test_title_3:text_content_3:作者是:summer:地址:上海  
    4. test_title_4:text_content_4:作者是:summer:地址:上海  







以上是关于Mybatis级联查询的主要内容,如果未能解决你的问题,请参考以下文章

mybatis 查询一对多 集合中没有值为啥

Mybatis 级联查询 (一对多 )

Mybatis + mysql 实现两级级联的查询

MyBatis之级联小结

mybatis级联查询,分步查询和延迟加载

mybatis 级联查询