首页 > 代码库 > 内连接association 左外连接collection

内连接association 左外连接collection

前提条件:

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

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

student.sql.xml文件如何配

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

内连接 返回单个association

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mapperPUBLIC "-//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 mapperPUBLIC "-//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();		}	}	}

 

 

内连接association 左外连接collection