前提条件:

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

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();
}
} }

MyBatis 内连接association 左外连接collection的更多相关文章

  1. mysql的内连接,外连接(左外连接,右外连接)巩固

    1:mysql的内连接: 内连接(inner join):显示左表以及右表符合连接条件的记录: select a.goods_id,a.goods_name,b.cate_name from tdb_ ...

  2. SQL 四种连接:内连接、左外连接、右外连接、全连接--转载

    原文:http://zwdsmileface.iteye.com/blog/2191730 个人理解 内连接(INNER JOIN)(典型的连接运算,使用像   =   或   <>   ...

  3. sql的交叉连接,内连接,左外连接,右外连接,全外连接总结

    实践是最好的检验,一直都对这几个连接查询出来的结果有什么不同不大理解,然后自己放一块查询比较了一下,用结果来说话~ 先建两张表如下: t1: id name age 1 张三 18 2 李四 25 t ...

  4. 内连接、左外连接、右外连接、全外连接、交叉连接(CROSS JOIN)-----小知识解决大数据攻略

    早就听说了内连接与外连接,以前视图中使用过.这次自考也学习了,只是简单理解,现在深入探究学习(由于上篇博客的出现)与实践: 概念 关键字: 左右连接 数据表的连接有: 1.内连接(自然连接): 只有两 ...

  5. SQL: 左连接,右连接,内连接,左外连接,右外连接,完全连接

    例子: ---------------------- --------------------------- a表 id name b表 id job parent_id 1 张三           ...

  6. SQL:内连接、左外连接、右外连接、全连接、交叉连接区别

    有两个表A和表B.表A结构如下: Aid:int:标识种子,主键,自增ID Aname:varchar 数据情况,即用select * from A出来的记录情况如下图1所示: 图1:A表数据表B结构 ...

  7. SQL的四种连接(左外连接、右外连接、内连接、全连接)

    1.内联接(典型的联接运算,使用像 =  或 <> 之类的比较运算符).包括相等联接和自然联接.     内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行.例如,检索 stude ...

  8. MySQL之表连接-> 内连接,左外连接,右外链接,全连接

    1.首先创建student库 create database student; 2. 在数据库中创建boy表 和 girl表, mysql> create table boy( -> bo ...

  9. SQL Server内连接、左外连接、右外连接、完全连接、交叉lianjie

    数据准备: create table T1( A ) not null, B ) not null, C tinyint not null ); create table T2( B ) not nu ...

随机推荐

  1. Portal Page的呈現

    先看一下在JSR168中提到的Portal page,可以了解一個Portal Page上大概有哪些element: OK...進入本次主題 PSML:PSML的全名是Portal Structure ...

  2. UIView属性及方法

    @property(nonatomic) CGFloat alpha //设置视图的透明度 //透明度的设置从最小0.0到1.0 ,1.0为完全不透明, //其中这个属性只影响当前视图,并不会影响其子 ...

  3. shell 日期加减

    shell 日期加减运算   比如今日是2012-04-22 $ date -d "+1 day" +%Y-%m-%d 2012-04-23   $ date -d "- ...

  4. Web前端开发工程师面试题

    Web前端开发工程师面试题1.说说css的优先级?2.在移动端中,常常使用tap作为点击事件,好处是?会带来什么问题?3.原生JS的window,onload与Jquery的$(document).r ...

  5. java中使用反射做一个工具类,来为指定类中的成员变量进行赋值操作,使用与多个类对象的成员变量的赋值。

    //------------------------------------------------我是代码的分割线 // 首选是一个工具类,在该工具类里面,定义了一个方法,public void s ...

  6. MyISAM表杂记实验

    一.本文说明 由于刚学mysql所以动手做了一些实验. 二.实验内容 1.验证MyISAM有AUOT_INCREMENT coloumn功能 ----在这里是对现有表t,增加一个主键----mysql ...

  7. Java四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor

    1.new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? Java new Thread(new Runnable() { @Override public void ru ...

  8. 关于easyUI在子页面增加显示tabs的一个问题

    在父页面点个链接能动态看到子页面的情况太简单,请看easyUI官网:http://www.jeasyui.com/tutorial/layout/tabs2.php 现在说的是在子页面点个按钮也能触发 ...

  9. .Uva&LA部分题目代码

    1.LA 5694 Adding New Machine 关键词:数据结构,线段树,扫描线(FIFO) #include <algorithm> #include <cstdio&g ...

  10. Github for Windows安装

    下载软件:https://desktop.github.com/ 安装之前要求系统先要有安装.net framework 4.5,不然软件安装的时候会自动上网下载安装,这软件下载起来非常慢. 第一次操 ...