(三)mybatis级联的实现
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的结果来判断使用哪个类做映射。
结束。
(三)mybatis级联的实现的更多相关文章
- Mybatis级联:关联、集合和鉴别器的使用
Mybatis中级联有关联(association).集合(collection).鉴别器(discriminator)三种.其中,association对应一对一关系.collection对应一对多 ...
- Mybatis 级联查询 (一对多 )
后台系统中 涉及到添加试卷 问题 答案的一个模块的.我需要通过试卷 查询出所有的试题,以及试题的答案.这个主要要使用到Mybatis的级联查询. 通过试卷 查询出与该试卷相关的试题(一对多),查询出试 ...
- mybatis级联
mybatis中有时候表不能都分成单表进行查询,表之间会有联系,这时候需要将表进行级联 下面讲一下如何将mybatis中 的表进行级联.映射表关系如下 1:创建数据表 DROP TABLE IF EX ...
- Mybatis级联,使用JOIN和Associa,以及一些ID覆盖和自动变换。
先说下坑,比如数据库的字段是 DW_ID ,用generator讲mybatis自动转换的时候,会省略下表_变成dwId,所以我们之后自己手动设计的时候也尽量换成dwId: generate的myb ...
- 74hc165三片级联
3片74HC165进行级联,用于扩展IO口,读取外界设备的数据. unsigned int read_74165(void) { unsigned ; unsigned ; //三片74hc165,需 ...
- mybatis 级联
级联是一个数据库实体的概念.一对多的级联,一对多的级联,在MyBatis中还有一种被称为鉴别器的级联,它是一种可以选择具体实现类的级联. 级联不是必须的,级联的好处是获取关联数据十分便捷,但是级联过多 ...
- mybatis级联查询,多对一查询问题
在使用Mybatis进行多表级联查询时遇到了一个问题:查询结果只有一项,但正确结果是两项.经测试,SQL语句本身没有问题. 在SQL映射文件(XML)中: <!-- 级联查询数据 --> ...
- Mybaits(9)MyBatis级联-2
一.鉴别器和一对多级联 1.完善体检表,分为男雇员体检和女雇员体检表 (1)持久层dao编写 package com.xhbjava.dao; import com.xhbjava.domain.Ma ...
- 三 mybatis typeAlias(别名)使用和resultMap使用
1.MyBatis提供的typeAlias
随机推荐
- Java 工厂模式登陆系统实现
没有工厂模式 设定一个登陆系统 UserServiceImp.java public class UserServiceImp { public boolean login(String userna ...
- 了解Kafka生产者
了解Kafka生产者 之前对kafka的整体架构有浅显的了解,这次正好有时间,准备深入了解一下kafka,首先先从数据的生产者开始吧. 生产者的整体架构 可以看到整个生产者进程主要由两个线程进 ...
- 40)类与类之间的关系(has use is)
1)类与类之间的关系 一般就是三类: ①has--A ②use--A ③is-----A ①has--A 包含关系,用以描述一个类由多个“部件构成”.实现has--A关系用类成员表示, 即一个类 ...
- vue 利用axios请求接口下载excel
一般有三种方法: 方法一: 通过a标签下载 // href为文件的存储路径或者地址,download为问文件名 <a href="/images/download.jpg" ...
- NAIPC2018
NAIPC2018 参考:http://www.cnblogs.com/LQLlulu/p/9513669.html?tdsourcetag=s_pctim_aiomsg https://www.cn ...
- 有关于i++,i=i++等符号的笔记
最近在看一些基础知识,发现自己以前忽略掉了很多东西,而这些东西恰恰是面试笔试中最常考到的 1.i=i+1 这个是最简单,最明了的一个表达式 2.有关于i++和++i的区别 i++和++i都是代表i=i ...
- 序列化模块ModelSerializer
课程准备 配置:settings.py INSTALLED_APPS = [ # ... 'rest_framework', ] DATABASES = { 'default': { 'ENGINE' ...
- [LC] 659. Split Array into Consecutive Subsequences
Given an array nums sorted in ascending order, return true if and only if you can split it into 1 or ...
- 吴裕雄--天生自然python机器学习:基于支持向量机SVM的手写数字识别
from numpy import * def img2vector(filename): returnVect = zeros((1,1024)) fr = open(filename) for i ...
- Image.FromStream(ms) 提示参数无效
说明ms有问题,首先确保有读到数据,这种情况是保存到库的时候出错的. 原来你可能是这样写的: MemoryStream stream = new MemoryStream();PictureBox1. ...