mybatis级联的实现
开篇
级联有三种对应关系:
1.一对一(association):如学号与学生
2.一对多(collection):如角色与用户
3.多对多(discriminator):如一个角色可以对应多个用户,一个用户也可以兼任多个角色
下面做一个一对多级联
数据库表描述:(使用的是derby数据库)
user表中的role_id 对应role表中的id,一个用户对应一个角色,一个角色对应多个用户。
standard_user表:
role表:
1.使用上篇分享的代码生成工具mybatis generator,对两个表进行代码生成(链接:)
生成代码目录如图选中部分(最后会给出详细代码)
2.对xml文件添加collection级联
修改UserMapper.XML,同时在user的bean中添加Role的定义。(加粗部分)
UserMapper.xml
1 2 34 5 6 137 8 9 10 11 12 14 ID, ACCOUNT, NAME, PASSWORD, ROLE_ID15 16 //省略sql语句代码...17
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.测试
1 public class UserTest { 2 static SqlSession sqlSession=null; 3 static UserMapper userMapper; 4 public static void main(String[] args ) { 5 try{ 6 sqlSession=SqlSessionFactoryUtil.openSqlSession(); 7 userMapper=sqlSession.getMapper(UserMapper.class); 8 UserTest userTest=new UserTest(); 9 //查询10 userTest.select();11 sqlSession2.commit();12 13 }catch(Exception e){14 System.err.println("---"+e.getMessage());15 sqlSession.rollback();16 }finally{17 if(sqlSession!=null){18 sqlSession.close();19 }20 }21 }22 public Listselect(){23 List list=userMapper.select();24 int l=list.size();25 for(int j=0;j
最后查看控制台是否能够输出角色名,若输出成功,则通过用户查询角色成功。(若需要通过角色查询用户,需要在role相关的文件进行配置)。
【补充】
1.mapper.xml中ResultMap可以被继承
2.超过三层关联时尽量少用级联
3.会有N+1性能问题:使用延迟加载解决:
两个全局参数:lazyLoadingEnabled和aggressiveLazy Loading
lazyLoadingEnabled:是否开启延迟加载
aggressiveLazy Loading:对任意延迟属性的调用会使带有延迟加载属性的对象完整加载;反之,每种属性将按需加载
配置:
4.局部延迟加载:在association和collection元素上加属性值fetchType(eager、lazy)默认为eager,默认值会被全局变量覆盖
5.另一种级联:尽量使用左连接,定义映射规则
eg.(来自《深入浅出mybatis技术原理与实战》)
discriminator是根据sex的结果来判断使用哪个类做映射。
结束。