mybatis级联的实现

开篇

        级联有三种对应关系:

1.一对一(association):如学号与学生

      2.一对多(collection):如角色与用户

      3.多对多(discriminator):如一个角色可以对应多个用户,一个用户也可以兼任多个角色

下面做一个一对多级联

  数据库表描述:(使用的是derby数据库)

    user表中的role_id 对应role表中的id,一个用户对应一个角色,一个角色对应多个用户。

    standard_user表:

    role表:

  1.使用上篇分享的代码生成工具mybatis generator,对两个表进行代码生成(链接:http://t.cn/RHbiQ6l

    生成代码目录如图选中部分(最后会给出详细代码)

  2.对xml文件添加collection级联

    修改UserMapper.XML,同时在user的bean中添加Role的定义。(加粗部分)

UserMapper.xml

 <?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="com.standard.dao.UserMapper"> <resultMap id="BaseResultMap" type="com.standard.model.User">
<id column="ID" jdbcType="INTEGER" property="id" />
<result column="ACCOUNT" jdbcType="VARCHAR" property="account" />
<result column="NAME" jdbcType="VARCHAR" property="name" />
<result column="PASSWORD" jdbcType="VARCHAR" property="password" />
<result column="ROLE_ID" jdbcType="INTEGER" property="roleId" />
<collection property="role" column="role_id" select="com.standard.dao.RoleMapper.findRoleById"></collection>
</resultMap>
<sql id="Base_Column_List">
ID, ACCOUNT, NAME, PASSWORD, ROLE_ID
</sql>
//省略sql语句代码...
</mapper>

User.java

package com.standard.model;

import java.io.Serializable;

public class User implements Serializable{
private Integer id; private String account; private String name; private String password; private Integer roleId; private Role role; //get set方法省略...
}

  3.测试

 public class UserTest {
static SqlSession sqlSession=null;
static UserMapper userMapper;
public static void main(String[] args ) {
try{
sqlSession=SqlSessionFactoryUtil.openSqlSession();
userMapper=sqlSession.getMapper(UserMapper.class);
UserTest userTest=new UserTest();
//查询
userTest.select();
sqlSession2.commit(); }catch(Exception e){
System.err.println("---"+e.getMessage());
sqlSession.rollback();
}finally{
if(sqlSession!=null){
sqlSession.close();
}
}
}
public List<User> select(){
List<User> list=userMapper.select();
int l=list.size();
for(int j=0;j<l;j++){
System.out.println(list.get(j).getRole().getName());
}
System.out.println("-----------");
return list;
}
}

  最后查看控制台是否能够输出角色名,若输出成功,则通过用户查询角色成功。(若需要通过角色查询用户,需要在role相关的文件进行配置)。

  【补充】

  1.mapper.xml中ResultMap可以被继承

  2.超过三层关联时尽量少用级联

  3.会有N+1性能问题:使用延迟加载解决:

    两个全局参数:lazyLoadingEnabled和aggressiveLazy Loading

    lazyLoadingEnabled:是否开启延迟加载

    aggressiveLazy Loading:对任意延迟属性的调用会使带有延迟加载属性的对象完整加载;反之,每种属性将按需加载

  配置:

<settings>

    <setting name=”lazyLoadingEnabled” value=”true”/>

    <setting name=”aggressiveLazyLoading” value=”false”/>

</settings>

  4.局部延迟加载:在association和collection元素上加属性值fetchType(eager、lazy)默认为eager,默认值会被全局变量覆盖

  5.另一种级联:尽量使用左连接,定义映射规则

    eg.(来自《深入浅出mybatis技术原理与实战》)

     discriminator是根据sex的结果来判断使用哪个类做映射。

结束。

最新文章

  1. WinForm:DataGridViewButtonColumn的使用
  2. hdu 5925 Coconuts 离散化+dfs
  3. 软件工程 speedsnail 第二次冲刺8
  4. 关于COUNT STOPKEY的工作机制(转载)
  5. 解决ntfs格式的移动硬盘mount到Linux下时变成只读文件系统的问题
  6. 第一个APP 时钟
  7. SCU 1069 POJ 2955 Brackets
  8. bzoj4447[Scoi2015]小凸解密码
  9. Mybatis源码分析之结果封装ResultSetHandler和DefaultResultSetHandler
  10. Zookeeper + Dubbo + SpringMVC + dubbo-admin
  11. WEB学习笔记12-高可读性的HTML之如何正确设计表单
  12. 我的Unity学习笔记之——Unity中从网站下载ab资源+下载存储一条龙
  13. mysql 循环写入数据库
  14. 可遇不可求的Question之Mysql在不重启服务的情况下修改运行时变量篇
  15. 一道关于:ArrayList、Vector、LinkedList的存储性能和特性 的面试题
  16. Eric Chen Mock Interview
  17. pygame 笔记-1 按键控制方块移动
  18. 把网卡中断绑定到CPU,最大化网卡的吞吐量(转)
  19. JavaScript实现功能全集
  20. Android RelativeLayout属性介绍

热门文章

  1. LeetCode No.163,164,165
  2. placeholder在IE下的兼容问题
  3. 七、linux-mysql下mysql增量备份与恢复
  4. 用 Apache Derby 进行 ODBC 编程
  5. k8s中command、args和dockerfile中的entrypoint、cmd之间的关系
  6. 微软不将《帝国时代》终极版上架Steam的原因到底是什么?
  7. Mock测试,何去何从
  8. yet|women teachers|waters|
  9. axious设置携带cookie同时允许跨域的问题
  10. python学习笔记(4)数据类型-元组