zoukankan      html  css  js  c++  java
  • 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()+" "+student.getName()+" "+student.getGrade().getName()+" "+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()+"	"+grade.getName());
    			System.out.println("------------------");
    			for (Student student : grade.getStudents()) {
    				System.out.println(student.getName());
    			}
    			System.out.println();
    		}
    	}
    	
    
    }
    
  • 相关阅读:
    Google Shell Style Guide
    50 Must-have plugins for extending Twitter Bootstrap
    HTTP 请求头中的 X-Forwarded-For
    如何让 PowerPoint 幻灯片「高大上」?
    数据挖掘系列(1)关联规则挖掘基本概念与Aprior算法
    关于大型网站技术演进的思考(三)--存储的瓶颈(3)
    基于 Nginx XSendfile + SpringMVC 进行文件下载
    如何成为全栈工程师?
    Sqlserver通过列名查表名
    animate
  • 原文地址:https://www.cnblogs.com/Angelinas/p/5626494.html
Copyright © 2011-2022 走看看