21、(知識篇)Mybatis02使用(嵌套結果/嵌套查詢)

/**

* MyBatis的嵌套結果/嵌套查詢(網上有說這是叫延遲加載)

* 1、一對一:

* 1.1 一對一嵌套結果:實際就是將兩個表join起來(參考userMapper.xml的selectUserById方法)

* 得出多行數據,其中,需要用resultMap返回,

* 配置resultMap

* <resultMap type="User" id="selectUserMap" autoMapping="true"></resultMap>

* type:返回的類型的全類名/配置別名 

* autoMapping:自動對應字段,如果不寫,則需要手動映射起來

* 方法是加入<id column="xxx" property="xxx" />/<result column="xxx" property="xxx"/>

* 1.2 通過 <association> 標籤,配置返回的一對一的bean(入User中對應一個Teacher),association中則需要配置Teacher的class

* 例如:<association property="teacher" javaType="Teacher" autoMapping="true"><id column="teacherId" property="id"/><association/>

* 1.3一對一嵌套查詢:實際是做兩次查詢(參考userMapper.xml的selectSingleUserById)

* 和嵌套結果類似:只不過配置association時,需要傳入外鍵,和填寫select的語句的id(參考selectSingleUser方法)

* 例如:<association javaType="Teacher" property="teacher" column="teacherId" select="selectSingleUser"  autoMapping="true"></association>

* 其中需要提及一下的是column 爲表的外鍵的列名

* 2、一對多

* 2.1 一對多嵌套結果:跟一對一嵌套結果類似,區別在於(參考teacherMapper.xml的getTeacherByJoin方法):

* 一對一嵌套結果使用<association>,一對多中使用<collection>標籤

* 一對一中使用javaType指定類型,一堆多中使用ofType指定類型;

* resultMap中必須指定id 的標籤,否則selectone中返回結果會報錯

* 2.2一對多嵌套查詢:同樣跟一對一嵌套結果類似

* 注意一下collection標籤、ofType、指定id標籤對應的column

* @param args

*/



測試類:

package com.mybatis.test;

import java.io.InputStream;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import com.mybatis.vo.Teacher;
import com.mybatis.vo.User;

public class Test {
	
	/**
	 * MyBatis的嵌套結果/嵌套查詢(網上有說這是叫延遲加載)
	 * 
	 * 1、一對一:
	 * 		1.1 一對一嵌套結果:實際就是將兩個表join起來(參考userMapper.xml的selectUserById方法)
	 * 			得出多行數據,其中,需要用resultMap返回,
	 * 		配置resultMap
	 * 		<resultMap type="User" id="selectUserMap" autoMapping="true"></resultMap>
	 * 		type:返回的類型的全類名/配置別名 
	 * 		autoMapping:自動對應字段,如果不寫,則需要手動映射起來
	 * 					方法是加入<id column="xxx" property="xxx" />/<result column="xxx" property="xxx"/>
	 * 		
	 * 		1.2 通過 <association> 標籤,配置返回的一對一的bean(入User中對應一個Teacher),association中則需要配置Teacher的class
	 * 			例如:<association property="teacher" javaType="Teacher" autoMapping="true"><id column="teacherId" property="id"/><association/>
	 * 
	 * 
	 * 		1.3一對一嵌套查詢:實際是做兩次查詢(參考userMapper.xml的selectSingleUserById)
	 * 			和嵌套結果類似:只不過配置association時,需要傳入外鍵,和填寫select的語句的id(參考selectSingleUser方法)
	 * 			例如:<association javaType="Teacher" property="teacher" column="teacherId" select="selectSingleUser"  autoMapping="true"></association>
	 * 			其中需要提及一下的是column 爲表的外鍵的列名
	 * 
	 * 
	 * 2、一對多
	 *		2.1 一對多嵌套結果:跟一對一嵌套結果類似,區別在於(參考teacherMapper.xml的getTeacherByJoin方法):
	 *			一對一嵌套結果使用<association>,一對多中使用<collection>標籤
	 * 			一對一中使用javaType指定類型,一堆多中使用ofType指定類型;
	 * 			resultMap中必須指定id 的標籤,否則selectone中返回結果會報錯
	 * 		2.2一對多嵌套查詢:同樣跟一對一嵌套結果類似
	 * 			注意一下collection標籤、ofType、指定id標籤對應的column
	 * 
	 * 
	 * @param args
	 */
	
	
	public static void main(String[] args) {
		
		
		InputStream is = Test.class.getClassLoader().getResourceAsStream("mybatis-config.xml");
		
		System.out.println(is);
		
		SqlSessionFactory sessionFactory =  new SqlSessionFactoryBuilder().build(is);
		
		System.out.println(sessionFactory);
		
		SqlSession session = sessionFactory.openSession();
		
		System.out.println(session);
		
		
		String userNameSpace = "com.mybatis.vo.User";
		/*一對一嵌套結果*/
		String selectOneByJoin = userNameSpace+".selectUserById";
		User user = session.selectOne(selectOneByJoin,3);
		System.out.println(user);


		/*一對一嵌套查詢*/
		String selectOneBySelect = userNameSpace+".selectSingleUserById";
		User user2 = session.selectOne(selectOneBySelect,1);
		System.out.println(user2);
		
		
		
		String teacherNameSpace = "com.mybatis.vo.Teacher";
		/*一對多嵌套結果*/
		String getTeacherByJoin = teacherNameSpace+".getTeacherByJoin";
		Teacher teacher = session.selectOne(getTeacherByJoin,1);
		System.out.println(teacher);
		
		
		/*一對多嵌套查詢*/
		String getTeacherById = teacherNameSpace+".getTeacherById";
		Teacher teacher2 = session.selectOne(getTeacherById,2);
		System.out.println(teacher2);
		
	}
}

User類:

package com.mybatis.vo;

public class User {
	private int id;
	private String userName;
	private int sex;
	private Teacher teacher;

	public User() {
		super();
		// TODO Auto-generated constructor stub
	}

	public User(int id, String userName, int sex, Teacher teacher) {
		super();
		this.id = id;
		this.userName = userName;
		this.sex = sex;
		this.teacher = teacher;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

	public int getSex() {
		return sex;
	}

	public void setSex(int sex) {
		this.sex = sex;
	}

	public Teacher getTeacher() {
		return teacher;
	}

	public void setTeacher(Teacher teacher) {
		this.teacher = teacher;
	}

	@Override
	public String toString() {
		return "User [id=" + id + ", userName=" + userName + ", sex=" + sex + ", teacher=" + teacher + "]";
	}

}

userMapper.xml

<?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.mybatis.vo.User">
	
	<!-- 一對一嵌套結果 -->
	<select id="selectUserById" parameterType="int" resultMap="selectUserMap">
		SELECT user.id,userName,sex,teacher.id AS teacherId,teacherName FROM USER
		LEFT OUTER JOIN Teacher ON Teacher.id = user.teacherId 
		 where user.id = #{id}
	</select>
	<resultMap type="User" id="selectUserMap" autoMapping="true">
		<!-- <id property="id" column="id"/>
		<result property="userName" column="userName"/>
		<result property="sex" column="sex"/> -->
		<association property="teacher" javaType="Teacher" autoMapping="true">
			<id column="teacherId" property="id"/>
			<!-- <result column="teacherName" property="teacherName"/> -->
		</association>
	</resultMap>
	
	
	
	<!-- 一對一嵌套查詢 -->
	<select id="selectSingleUserById" parameterType="int" resultMap="selectSingleUserMap" >
		select * from User where id = #{id}
	</select>
	<select id="selectSingleUser" parameterType="int" resultType="Teacher">
		select * from Teacher where id = #{id}
	</select>
	<resultMap type="User" id="selectSingleUserMap" autoMapping="true">
		<association javaType="Teacher" property="teacher" column="teacherId" select="selectSingleUser"  autoMapping="true"></association>
	</resultMap>
	
	
</mapper>

Teacher類:

package com.mybatis.vo;

import java.util.List;

public class Teacher {
	private int id;
	private String teacherName;
	private List<User> users;

	public Teacher() {
		super();
		// TODO Auto-generated constructor stub
	}

	public Teacher(int id, String teacherName, List<User> users) {
		super();
		this.id = id;
		this.teacherName = teacherName;
		this.users = users;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getTeacherName() {
		return teacherName;
	}

	public void setTeacherName(String teacherName) {
		this.teacherName = teacherName;
	}

	public List<User> getUsers() {
		return users;
	}

	public void setUsers(List<User> users) {
		this.users = users;
	}

	@Override
	public String toString() {
		return "Teacher [id=" + id + ", teacherName=" + teacherName + ", users=" + users + "]";
	}

}

teacherMapper.xml

<?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.mybatis.vo.Teacher">

	<!-- 嵌套結果 -->
	<select id="getTeacherByJoin" parameterType="int" resultMap="getTeacherByJoinMap">
		SELECT teacher.*,user.id AS userId,user.UserName,user.Sex FROM Teacher
		LEFT OUTER JOIN USER ON user.TeacherID = teacher.id where teacher.id = #{id}
	</select>
	<resultMap type="Teacher" id="getTeacherByJoinMap" autoMapping="true">
		<id column="id" property="id"/>
		<collection property="users" ofType="User" autoMapping="true">
			<id property="id" column="userId"/>
		</collection>
	</resultMap>
	
	

	<!-- 一對多嵌套查詢 -->
	<select id="getTeacherById" parameterType="int" resultMap="getTeacherByIdMap">
		select * from Teacher where id = #{id}
	</select>
	<select id="getUserByTeacherId" parameterType="int" resultType="User">
		select * from User where teacherId = #{teacherId}
	</select>
	<resultMap type="Teacher" id="getTeacherByIdMap" autoMapping="true">
		<id column="id" property="id"/>
		<collection property="users" column="id"  select="getUserByTeacherId" autoMapping="true"></collection>
	</resultMap>
	
</mapper>

mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	<typeAliases>
		<typeAlias type="com.mybatis.vo.User" alias="User" />
		<typeAlias type="com.mybatis.vo.Teacher" alias="Teacher" />
	</typeAliases>
	<environments default="development">
		<environment id="development">
			<transactionManager type="JDBC" />
			<dataSource type="POOLED">
				<property name="driver" value="com.mysql.jdbc.Driver" />
				<property name="url" value="jdbc:mysql://192.168.1.92:3306/test" />
				<property name="username" value="root" />
				<property name="password" value="root" />
			</dataSource>
		</environment>
	</environments>
	<mappers>
		<!-- <mapper resource="org/mybatis/example/BlogMapper.xml" /> -->
		<mapper resource="com/mybatis/vo/userMapper.xml" />
		<mapper resource="com/mybatis/vo/teacherMapper.xml" />
	</mappers>
</configuration>


發佈了52 篇原創文章 · 獲贊 4 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章