MyBatis 内连接association 左外连接collection

前提条件:

学生表 (多  子表) 年级表(一  主表)

1,第一种情况:先查子表所有

student.sql.xml文件如何配

由于有多表连接,无法把查询结果直接封装成一个实体对象-------->   结果转换规则:自己手动指定

内连接 返回单个association

<?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="cn.bdqn.mybatis.mapper.StudentMapper">
<!-- 把查询结果自动的封装成一个对象 ,哪些列是可以自动对应到属性中,连接的外表没法对应到啊,复杂的结果转换resultType没法处理,需要手动指定-->
	<select id="findStudent" resultMap="studentMap">
		SELECT 
			s.id,
		    s.gradeId,
		    s.name,
		    g.name as gradeName 
		FROM Student s INNER JOIN Grade g ON s.gradeId=g.id 
		ORDER BY s.id
	</select>

<!-- 结果转换规则,当查询结果无法直接转换成我们想要的,就需编写转换规则,明确表示结果如何转换
id随便起名,type是你想把结果转换成什么类的对象
根据转换规则,查出来的每一行数据都会自动new一个student对象出来
 -->
<resultMap id="studentMap" type="Student"  >
	<!-- 这个是主键特殊   column是我想生成的列名不区分大小写; property是原本实体类中的属性名 必须得一样-->
	<id column="id" property="id"/>
	<result column="gradeId" property="gradeId"/>
	<result column="name" property="name"/>
	<!-- 指定单个关联对象的转换规则 
	property是student类中的grade属性   后边是哪个类
	-->
	<association property="grade" javaType="Grade">
		<!-- column是student类中的gradeId属性   property是原本属于grade类中叫id	-->
		<id column="gradeId" property="id"/>
		<result column="gradeName" property="name"/>
	</association>
</resultMap>
</mapper>




package cn.bdqn.mybatis.test;

import java.util.List;

import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import cn.bdqn.mybatis.entity.Student;
import cn.bdqn.mybatis.mapper.StudentMapper;
import cn.bdqn.mybatis.util.MyBatisUtil;

public class StudentTest {
    //先声明返回值
    List<Student> students=null;
    SqlSession session=null;
    //只写了个方法执行查询语句
    @Test
    public void TestFindStudent() {
        try {
            //先拿到sql session
            session=MyBatisUtil.getSqlSession();
            //通过sqlsession拿到mapper对象
            StudentMapper mapper=session.getMapper(StudentMapper.class);
            students=mapper.findStudent();
            
        } catch (Exception e) {
            e.printStackTrace();
            session.rollback();
        }finally{
            session.close();
        }
        
        for (Student student : students) {
            System.out.println(student.getId()+"\t"+student.getName()+"\t"+student.getGrade().getName()+"\t"+student.getGradeId());
        }
    }
    

}

 左外连接 返回集合collection

<?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="cn.bdqn.mybatis.mapper.GradeMapper">
	<select id="findGrade" resultMap="gradeMap">
		SELECT
		   g.id,
		    g.name,
		    s.id AS stuId,
		    s.gradeId,
		    s.name AS stuName
		FROM Grade g LEFT JOIN Student s ON g.id=s.gradeId
		ORDER BY g.id
	</select>
	<resultMap id="gradeMap" type="Grade">
		<id column="id" property="id"/>
		<result column="name" property="name"/>
		<!--集合转换规则
		property:对应的是grade类中哪儿一列;javaType:返回类型;ofType:表示集合中包含的是Student实体类对象。
		notNullColumn:根据这一列来创建学生对象,班级得有学生了我才创建一个学生对象,没有学生就不创建了  
		根据查询结果中的 gradeId列判断学生对象要加入到这个集合中-->
		<collection property="students" javaType="list" ofType="Student" notNullColumn="gradeId">
			<id column="stuId" property="id"/>
			<result column="gradeId" property="gradeId"/>
			<result column="stuName" property="name"/>
		</collection>
	
	</resultMap>
</mapper>


package cn.bdqn.mybatis.test;

import java.util.List;

import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import cn.bdqn.mybatis.entity.Grade;
import cn.bdqn.mybatis.entity.Student;
import cn.bdqn.mybatis.mapper.GradeMapper;
import cn.bdqn.mybatis.mapper.StudentMapper;
import cn.bdqn.mybatis.util.MyBatisUtil;

public class GradeTest {
	//先声明返回值
	List<Grade> grades=null;
	SqlSession session=null;
	//只写了个方法执行查询语句
	@Test
	public void TestFindGrade() {
		try {
			//先拿到sql session
			session=MyBatisUtil.getSqlSession();
			//通过sqlsession拿到mapper对象
			GradeMapper mapper=session.getMapper(GradeMapper.class);
			grades=mapper.findGrade();
			
		} catch (Exception e) {
			e.printStackTrace();
			session.rollback();
		}finally{
			session.close();
		}
		
		for (Grade grade : grades) {
			System.out.println(grade.getId()+"\t"+grade.getName());
			System.out.println("------------------");
			for (Student student : grade.getStudents()) {
				System.out.println(student.getName());
			}
			System.out.println();
		}
	}
	

}

 

 

posted @ 2016-10-09 10:51  Angelinas  阅读(2455)  评论(0编辑  收藏  举报