mybatis多對一、一對多、多對多、自關聯查詢

目錄

多對一

創建對象

 創建接口

sql 映射文件

測試

結果

 方法2:使用單表查詢(分佈查詢)的方式實現多對一

一對多

創建po對象

創建接口

sql語句映射文件

測試

方法2:使用單表查詢(分佈查詢)的方式實現一對多

多對多

創建po對象

創建接口

sql語句映射文件

測試

自關聯

po對象

接口

sql語句映射文件

測試


多對一

指的是在多的一端維護關聯關係.

用戶、 組表

創建對象

用戶是的一段

Group是的一端

 創建接口

public interface UserDao {
     User getUserById(int uid);
}

sql 映射文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.iotek.dao.UserDao">
   
   <resultMap type="User" id="userMapper">
      <id column="uid" property="uid"/>
      <result column="uname" property="uname"/>
      <!--association關聯查詢-->
      <association property="group" javaType="Group">
        <id column="gid" property="gid"/>
        <result column="gname" property="gname"/>
      </association>
   </resultMap>
   
   <select id="getUserById" parameterType="int" resultMap="userMapper">
     SELECT gid,gname,uid,uname FROM tb_group g,tb_users u WHERE 
     g.gid=u.groupid AND u.uid=#{uid}
   </select>  
</mapper>

測試

	@Test
	public void getUserById() throws IOException {
		SqlSession sqlSession = Utils.getSqlSessionFactory().openSession();
	    UserDao userDao=sqlSession.getMapper(UserDao.class);
	    User user=userDao.getUserById(1);
	    System.out.println(user.getGroup().getGname());
	
	}

結果

 方法2:使用單表查詢(分佈查詢)的方式實現多對一

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.iotek.dao.UserDao">
   <!--第二次查詢-->
    <select id="aa" parameterType="int" resultType="Group">
         SELECT gid,gname FROM tb_group WHERE gid=#{groupid}
   </select>
   
   <resultMap type="User" id="userMapper">
      <id column="uid" property="uid"/>
      <result column="uname" property="uname"/>
      <association property="group" javaType="Group"
        select="aa" column="groupid">       
      </association>
   </resultMap>
   <!--第一次查詢-->
   <select id="getUserById" parameterType="int" resultMap="userMapper">    
     SELECT uid ,uname, groupid FROM tb_users WHERE uid=#{uid}
   </select>  
</mapper>

一對多

創建po對象

1的一端(在1的一端維護關聯關係)

多的一端

創建接口

public interface GroupDao {
    Group getGroupById(int gid);
}

sql語句映射文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.iotek.dao.GroupDao">
   <resultMap type="Group" id="aa">
      <id column="gid" property="gid"/>
      <result column="gname" property="gname"/>
      <collection property="users" ofType="User">
          <id column="uid" property="uid"/>
          <result column="uname" property="uname"/>
      </collection>
   </resultMap>
   
   <select id="getGroupById" parameterType="int" resultMap="aa">    
    SELECT gid,gname,uid,uname FROM tb_group g,tb_users u WHERE 
     g.gid=u.groupid AND g.gid=#{gid}
   </select>
  
</mapper>

測試

	@Test
	public void getUserById() throws IOException {
		SqlSession sqlSession = Utils.getSqlSessionFactory().openSession();
	    GroupDao gd=sqlSession.getMapper(GroupDao.class);
	    Group group= gd.getGroupById(1);
	    System.out.println(group);	
	}

方法2:使用單表查詢(分佈查詢)的方式實現一對多

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.iotek.dao.GroupDao">
 <!--第二次查詢-->
 <select id="aa" parameterType="int" resultType="User">    
     select uid,uname from tb_users where groupid=#{gid}
   </select>
   <resultMap type="Group" id="groupMapper">
      <id column="gid" property="gid"/>
      <result column="gname" property="gname"/>
      <collection property="users" ofType="User" 
        select="aa" column="gid">         
      </collection>
   </resultMap>
   <!--第一次查詢-->
   <select id="getGroupById" parameterType="int" resultMap="groupMapper">    
     select gid,gname from tb_group where gid=#{gid}
   </select>
  
</mapper>

多對多

創建po對象

 

創建接口

public interface StudentDao {
    Student getStudentById(int sid);
}

sql語句映射文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.iotek.dao.StudentDao">
  
  <resultMap type="Student" id="studentMapper">
     <id column="sid" property="sid"/>
     <result column="sname" property="sname"/>
     <collection property="courses" ofType="Course">
       <id column="cid" property="cid"/>
       <result column="cname" property="cname"/>
     </collection>   
  </resultMap>  
  
  <select id="getStudentById" parameterType="int" resultMap="studentMapper">     
   SELECT sid,sname,cid,cname FROM tb_stu s,tb_middle m,tb_course c
   WHERE s.sid=m.studentid AND c.cid=m.courseid AND s.sid=#{sid}
  </select>
  
</mapper>

測試

	@Test
	public void getStudentById() throws IOException {
		SqlSession sqlSession = Utils.getSqlSessionFactory().openSession();
	    StudentDao stuDao=sqlSession.getMapper(StudentDao.class);
	    Student student=stuDao.getStudentById(1);
	    System.out.println(student);
	    Iterator<Course> iter= student.getCourses().iterator();
	     while(iter.hasNext()){
	    	 Course c=iter.next();
	    	 System.out.println(c.getCname());	    	 
	     }	
	}

自關聯

po對象

接口

public interface NewsLabelDao {
     /*根據父節點把有子節點查詢出來*/
	List<NewsLabel> getChildrenByPid(int pid);
}

sql語句映射文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.iotek.dao.NewsLabelDao">  
   <select id="aaa" resultMap="newslabelMapper1">      
       SELECT id,NAME FROM tb_newslabel WHERE pid=#{id}
   </select>   
   <resultMap type="NewsLabel" id="newslabelMapper1">
       <id column="id" property="id"/>
       <result column="name" property="name"/>
       <collection property="children" ofType="NewsLabel"
        select="aaa" column="id">       
       </collection>       
   </resultMap>
   <select id="getChildrenByPid" resultMap="newslabelMapper1">      
       SELECT id,NAME FROM tb_newslabel WHERE pid=#{pid}
   </select>  
</mapper>

測試

	@Test
	public void getStudentById() throws IOException {
		SqlSession sqlSession = Utils.getSqlSessionFactory().openSession();
		NewsLabelDao newsDao=sqlSession.getMapper(NewsLabelDao.class);
		List<NewsLabel> children=newsDao.getChildrenByPid(2);
		System.out.println(children);   
	
	}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章