MyBatis-关联表增删改查配置、resultMap、association、collection的使用

原创 2016年05月30日 14:55:48

相关代码参考:
MyBatis-搭建MyBatis开发环境一(MyEclipse版)

1、数据库表信息

这里写图片描述

实体类代码

1、Dept

public class Dept {

    private Integer deptno;
    private String dname;
    private String loc;

    //get set方法略
}

2、Emp

public class Emp {

    private Integer empno;
    private String ename;
    private String job;
    private Integer mgr;
    private Date hiredate;
    private double sal;
    private double comm;
    private int deptno;

    //get set 方法略
}

2、子查询

示例:在Emp表中查询经理为BLAKE的雇员信息

EmpMapper.xml配置

<!-- 查询经理名称为BLAKE的雇员信息 -->
<select id="getEmpListByMgrIsBlake" resultType="Emp">
    select * from emp where mgr in (
        select empno from emp where ename = 'BLAKE')
</select>

测试代码

    /**查询经理名称为BLAKE的雇员信息 */
    public void getEmpListByMgrIsBlake() {
        SqlSession sqlSession = null;
        List<Emp> empList = new ArrayList<Emp>();
        try {
            sqlSession = MyBatisUtil.createSqlSession();
            //在EmpMapper接口中添加对应方法
            empList = sqlSession.getMapper(EmpMapper.class).getEmpListByMgrIsBlake();
            sqlSession.commit();
        } catch (Exception e) {
            e.printStackTrace();
            sqlSession.rollback();
        } finally {
            MyBatisUtil.closeSqlSession(sqlSession);
        }
        for (Emp emp : empList) {
            logger.debug(emp.getEname() + "==>" + emp.getDeptno());
        }
    }

3、内连接

示例一:查询指定部门编号的雇员信息及部门信息

实体类代码(新建一个实体类接收或者在已有实体类中添加属性)

public class EmpAndDept {
    private Integer empno;
    private String ename;
    private String job;
    private Integer mgr;
    private Date hiredate;
    private double sal;
    private double comm;
    private int deptno;

    private String dname;
    private String loc;

    //get set 方法略
}

EmpMapper.xml配置

<select id="getEmpAndDeptByDeptno" resultType="EmpAndDept" parameterType="Dept">
    select * from emp e inner JOIN dept d on e.DEPTNO=d.DEPTNO 
        where e.deptno = #{deptno}
</select>

测试代码

    /**查询指定部门编号的雇员信息及部门信息*/
    public void getEmpAndDeptByDeptno() {
        SqlSession sqlSession = null;
        List<EmpAndDept> empAndDeptList = new ArrayList<>();
        Dept dept = new Dept();
        //查询部门编号10
        dept.setDeptno(10);
        try {
            sqlSession = MyBatisUtil.createSqlSession();
            //在EmpMapper接口中添加对应方法
            empAndDeptList = sqlSession.getMapper(EmpMapper.class).getEmpAndDeptByDeptno(dept);
            sqlSession.commit();
        } catch (Exception e) {
            e.printStackTrace();
            sqlSession.rollback();
        } finally {
            MyBatisUtil.closeSqlSession(sqlSession);
        }
        for (EmpAndDept empAndDept : empAndDeptList) {
            logger.debug(empAndDept.getEname() + "==>" + empAndDept.getDname());
        }
    }

示例二:配置resultMap查询指定部门名称的雇员姓名及部门编号、部门地址

EmpMapper.xml配置

<resultMap type="EmpAndDept" id="EmpAndDeptByDname">
    <result property="ename" column="ename"/>
    <result property="deptno" column="e_dept"/>
    <result property="loc" column="loc"/>
</resultMap>

<select id="getEmpAndDeptByDname" resultMap="EmpAndDeptByDname" parameterType="Dept">
    select ename,e.deptno as e_dept,loc as loc from emp e inner join dept d on 
        e.DEPTNO=d.DEPTNO where dname = #{dname}
</select>

对于只想获取指定的几个字段信息,可以指定resultMap属性,此属性不能与resultType共存
这里写图片描述

测试代码

    /**查询指定部门名称的雇员姓名及部门编号、部门地址*/
    public void getEmpAndDeptByDname() {
        SqlSession sqlSession = null;
        List<EmpAndDept> empAndDeptList = new ArrayList<>();
        Dept dept = new Dept();
        //查询部门名称为ACCOUNTING
        dept.setDname("ACCOUNTING");
        try {
            sqlSession = MyBatisUtil.createSqlSession();
            //EmpMapper接口中添加此对应方法
            empAndDeptList = sqlSession.getMapper(EmpMapper.class).getEmpAndDeptByDname(dept);
            sqlSession.commit();
        } catch (Exception e) {
            e.printStackTrace();
            sqlSession.rollback();
        } finally {
            MyBatisUtil.closeSqlSession(sqlSession);
        }
        for (EmpAndDept empAndDept : empAndDeptList) {
            logger.debug(empAndDept.getEname() + "==>" + empAndDept.getDeptno() + "==>" + empAndDept.getLoc());
        }
    }

示例三:配置association查询指定雇员编号的雇员姓名、所在部门编号、部门名称

在Emp实体类中添加Dept属性

public class Emp {

    private Integer empno;
    private String ename;
    private String job;
    private Integer mgr;
    private Date hiredate;
    private double sal;
    private double comm;
    private int deptno;

    //配置association添加一方对象
    private Dept dept;

    //get set方法略
}

EmpMapper.xml配置

<!-- 查询指定雇员编号的雇员姓名、所在部门编号、部门名称 -->
<resultMap type="Emp" id="EmpAndDeptByEmpno">
    <!-- 指定主键,提高查询效率 -->
    <id property="empno" column="empno"/>
    <result property="ename" column="ename"/>
    <result property="deptno" column="e_deptno"/>
    <!-- 配置association方式一 
    <association property="dept" javaType="Dept">
        <result property="dname" column="dname"/>
    </association>
    -->
    <!-- 配置association方式二 -->
    <association property="dept" javaType="Dept" resultMap="DeptInfo"/>
</resultMap>
<!-- association使用的resultMap -->
<resultMap type="Dept" id="DeptInfo">
    <result property="dname" column="dname"/>
</resultMap>

<select id="getEmpAndDeptByEmpno" resultMap="EmpAndDeptByEmpno" parameterType="Emp">
    select ename,e.deptno as e_deptno,dname from emp e inner join dept d on 
        e.deptno=d.DEPTNO where e.empno = #{empno}
</select>

可以看出,association用来配置本类中封装的其他类型对象,可以用于多对一中多方实体类中,配置方式有俩种。
这里写图片描述

测试代码

    /**查询指定雇员编号的雇员姓名、所在部门编号、部门名称*/
    public void getEmpAndDeptByEmpno() {
        SqlSession sqlSession = null;
        List<Emp> empAndDeptList = new ArrayList<>();
        Emp emp = new Emp();
        //查询雇员编号为7788的雇员
        emp.setEmpno(7788);
        try {
            sqlSession = MyBatisUtil.createSqlSession();
            //EmpMapper接口中添加对应方法
            empAndDeptList = sqlSession.getMapper(EmpMapper.class).getEmpAndDeptByEmpno(emp);
            sqlSession.commit();
        } catch (Exception e) {
            e.printStackTrace();
            sqlSession.rollback();
        } finally {
            MyBatisUtil.closeSqlSession(sqlSession);
        }
        for (Emp emp2 : empAndDeptList) {
            logger.debug(emp2.getEname() + "==>" + emp2.getDeptno() + "==>" + emp2.getDept().getDname());
        }
    }

示例四:配置collection查询指定部门编号下所有雇员的部门编号、部门名称、雇员编号、雇员名称

在Dept实体类中添加Emp集合

public class Dept {

    private Integer deptno;
    private String dname;
    private String loc;

    // collection 添加多方属性,为集合
    private List<Emp> empList;

    //get set 方法略
}

EmpMapper.xml配置

<!-- 查询指定部门编号下所有雇员的部门编号、部门名称、雇员编号、雇员名称 -->
<resultMap type="Dept" id="DeptByDeptno">
    <id property="deptno" column="deptno"/>
    <result property="dname" column="dname"/>
    <!-- 配置collection方式一 
    <collection property="empList" ofType="Emp">
        <id property="empno" column="empno"/>
        <result property="ename" column="ename"/>
    </collection>
    -->
    <!-- 配置collection方式二 -->
    <collection property="empList" ofType="Emp" resultMap="EmpInfo"/>
</resultMap>
<!-- collection使用的resultMap -->
<resultMap type="Emp" id="EmpInfo">
    <id property="empno" column="empno"/>
    <result property="ename" column="ename"/>
</resultMap>

<select id="getDeptByDeptno" resultMap="DeptByDeptno" parameterType="Dept">
    select d.deptno,dname,empno,ename from dept d inner join emp e on 
        d.DEPTNO=e.DEPTNO where d.DEPTNO = #{deptno}
</select>

可以看出collection用于配置一对多中一方中包含的多方集合属性

这里写图片描述

测试代码

    /**查询指定部门编号下所有雇员的部门编号、部门名称、雇员编号、雇员名称*/
    public void getDeptByDeptno() {
        SqlSession sqlSession = null;
        Dept dept = new Dept();
        //查询部门编号为20的部门员工信息
        dept.setDeptno(20);
        try {
            sqlSession = MyBatisUtil.createSqlSession();
            //EmpMapper接口中添加对应方法
            dept = sqlSession.getMapper(EmpMapper.class).getDeptByDeptno(dept);
            sqlSession.commit();
        } catch (Exception e) {
            e.printStackTrace();
            sqlSession.rollback();
        } finally {
            MyBatisUtil.closeSqlSession(sqlSession);
        }
        System.out.println("部门信息:" + dept.getDeptno() + "==>" + dept.getDname());
        System.out.println("雇员信息如下:");
        for (Emp emp : dept.getEmpList()) {
            System.out.println(emp.getEmpno() + "-->" + emp.getEname());
        }
    }

关于select标签一些属性功能如下:
1、id:命名空间内唯一标识符,用来被引用这条语句。
2、parameterType:用来指定传入参数的完全限定名或别名。
3、resultType:指定返回的期望的完全限定名或别名,如果是集合,应该为集合包含的类型 ,不能和resultMap共存。
4、resultMap:命名引用外部的resultMap。
5、flushCache:默认false,设置为true,则不论语句什么时候被调用,都会清空缓存。
6、useCache:默认值true,会缓存本次语句结果。
7、timeout:这个设置驱动程序等待数据库返回请求结果,并抛出异常时间的最大等待值。默认不设置(驱动自行处理)。
8、fetchSize:暗示程序每次返回的结果行数。
9、statementType:STATEMENT、PREPARED、CALLABLE中的一种,让MyBatis选择使用Statement、PreparedStatement、CallableStatement。默认是PREPARED。
10、resultSetType:FORWARD_ONLY|SCROOL_SENSITIVE|SCROLL_INSENSITIVE中的一种,默认是不设置(驱动自行处理)。

版权声明:本文为博主原创文章,转载请注明出处。

Mybatis 多对多关联表关联 如何插入关联表数据

很多时候我们会碰到这样一个需求,当前我有(用户)表和(角色)表,他们之间是多对多的关系,所以我们通常会创建一个关联表(用户_角色)表,现在我们有固定的角色,只需要添加用户即可,给用户指定角色,那我们怎...
  • yhq1913
  • yhq1913
  • 2017年03月20日 17:00
  • 5001

mybatis---关联表的增删改三种方式

在hibernate的配置文件中,有cascade属性,供我们设置关联表的增上爱

mybatis多对多关联,向关联表插入数据方法

mybatis多对多关联,向关联表插入数据方法: 先向主表插入数据后,根据当前插入数据的ID,来向中间表插入数据 主要sql:   useGeneratedKeys="true"...

MyBatis 3中实现一对多的插入和查询

summary: MyBatis3中实现一对多的查询比较简单,可以自动完成。但插入操作要复杂一些,需要相关的DAO配合完成,这点不如Hibernate。 场景描述: 类:Mail和Att...
  • jubincn
  • jubincn
  • 2012年04月10日 17:46
  • 38738

Mybatis 多对多表关联

中间表实现  下面的例子让新手看不错。可以改进的一点是           1、不必建立 关联对象实体,可以用map传递两个id进去           2、文章的resultMap...

MyBatis联合查询和修改例子

MyBatis现在还挺少人用的,刚玩的时候在网站查资料都没有很多贴研究它.走了很多弯路; 在此做了一个小例子,跟大家分享一下; 如果能对一些刚玩MyBatis的朋友一些帮助就再好不过了. ...

MyBatis教程之数据的增删改查和关联数据的查询

前面已经讲到用接口的方式编程,这一章主要在上一讲基于接口编程的基础上完成如下事情: 1. 用 mybatis 查询数据,包括列表; 2. 用 mybatis 增加数据; 3. 用 mybatis 更新...

Mybatis系列(七)关联映射

Mybatis系列之多表关联映射 引言 之前的文章里有提到过使用Mybatis对数据库单表进行映射,执行增删改查操作。但是在现实的项目中进行数据库建模时,我们要遵循数据库设计范式的要求,会对现实中的...

mybatis框架下mysql多表更新的操作

我在mybatis框架下对mysql进行操作遇到一个问题:我希望对多张结构相同的表进行更新,而且只是更新其中 ctr_cp 属性的值,但是我采用下面的语句时报错 update (select * fr...

mybatis---级联保存,级联删除

mybatis如何试用级联保存,级联删除
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MyBatis-关联表增删改查配置、resultMap、association、collection的使用
举报原因:
原因补充:

(最多只允许输入30个字)