首页 > 编程知识 正文

mybatis查询大量数据,oracle过滤数据

时间:2023-05-04 10:18:43 阅读:167258 作者:4907

SysRole.java和SysUser.java的序列化实现:

publicclasssysuserimplementsserializable { privatestaticfinallongserialversionuid=632094190822932112 l;

}

publicclasssysroleimplementsserializable { privatestaticfinallongserialversionuid=632094190822932112 l;

}

2 .代码测试准备:

@Testpublic voidtestDirtyDate () {

sqlsessionsqlsession=getsql session (; try{

usermapperusermapper=SQL session.get mapper (user mapper.class;

sysuser user=user mapper.selectuserandrolebyid (1001 l;

Assert.assertEquals (“一般用户”,user.getRole ) ).getRoleName );

System.out.println (角色名称(user.getRole ) ).getRoleName );

}finally{

sqlSession.close (;

}

System.out.println ('打开新会话';

sqlSession=getSqlSession (; try{

rolemapperrolemapper=SQL session.get mapper (role mapper.class;

sysrolerole=role mapper.selectbyid (2l;

role.setRoleName (“脏数据”); //提出修改

sqlSession.commit (;

}finally{

sqlSession.close (;

}

system.out.println ('打开第二个新会话';

sqlSession=getSqlSession (; try{

usermapperusermapper=SQL session.get mapper (user mapper.class;

rolemapperrolemapper=SQL session.get mapper (role mapper.class;

sysuser user=user mapper.selectuserandrolebyid (1001 l;

sysrolerole=role mapper.selectbyid (2l;

Assert.assertEquals (“一般用户”,user.getRole ) ).getRoleName );

Assert.assertEquals ('脏数据',role.getRoleName ) );

System.out.println (角色名称(user.getRole ) ).getRoleName ); //恢复数据

role.setRoleName (“一般用户”);

rolemapper.updatebyid(role;

sqlSession.commit (;

}finally{

sqlSession.close (;

}

}

测试后的结果:

debug [ main ]-cachehitratio [ com.example.simple.mapper.user mapper ] 3360.0

debug [ main ]--==preparing : selectu.id,u.user_name userName,u.user_password userPassword,u.user _ name r.id 'role.id ',r.role_name 'role.roleName ',r.e nabble r.create _ time ' role.createtime ' from sys _ from

DEBUG [main] -==gt

; Parameters: 1001(Long)

TRACE [main] - <== Columns: id, userName, userPassword, userEmail, userInfo, headImg, createTime, role.id, role.roleName, role.enabled, role.createBy, role.createTime

TRACE [main] - <== Row: 1001, test, 123456, test@mybatis.com, <>, <>, 2020-12-01 20:05:01, 2, 普通用户, 1, 1, 2020-12-01 20:05:04

DEBUG [main] - <== Total: 1

角色名:普通用户

开启一个新的session

DEBUG [main] - Cache Hit Ratio [com.example.simple.mapper.RoleMapper]: 0.0

DEBUG [main] - ==> Preparing: select id, role_name,enabled,create_by,create_time from sys_role where id = ?

DEBUG [main] - ==> Parameters: 2(Long)

TRACE [main] - <== Columns: id, role_name, enabled, create_by, create_time

TRACE [main] - <== Row: 2, 普通用户, 1, 1, 2020-12-01 20:05:04

DEBUG [main] - <== Total: 1

开启第二个新的session

DEBUG [main] - Cache Hit Ratio [com.example.simple.mapper.UserMapper]: 0.5

DEBUG [main] - Cache Hit Ratio [com.example.simple.mapper.RoleMapper]: 0.5

角色名:普通用户

DEBUG [main] - ==> Preparing: update sys_role set enabled = ? where id = ?

DEBUG [main] - ==> Parameters: 1(Integer), 2(Long)

DEBUG [main] - <== Updates: 1

测试的思路和脏数据产生分析是:

第一个sqlSession负责先关联用户表和角色表将user_id = 1001L的用户信息和角色信息查询出来;

第二个sqlSession负责将上一个sqlSession中查询到的角色信息对应的role_id进行再查询,并对role_name进行赋值,使得role_name被赋予新值;

第三个sqlSession分别通过SysUser类和SysRole类获取角色name,发现两者取出来的值并不一样,这时就出现了脏数据,这时因为UserMapper.xml和RoleMapper.xml中分别设置的二级缓存互不影响,这时就出现了同一角色对应两个name。

二、脏数据避免

脏数据产生原因是二级缓存在不同的mapper.xml中,因此出现了缓存内容不一样,内容显示不一致的原因,这时解决方案如下:

这时测试结果是:

DEBUG [main] - Cache Hit Ratio [com.example.simple.mapper.RoleMapper]: 0.0

DEBUG [main] - ==> Preparing: select u.id, u.user_name userName, u.user_password userPassword, u.user_email userEmail , u.user_info userInfo , u.head_img headImg, u.create_time createTime , r.id "role.id", r.role_name "role.roleName" , r.enabled "role.enabled" , r.create_by "role.createBy", r.create_time "role.createTime" from sys_user u inner join sys_user_role ur on u.id = ur.user_id inner join sys_role r on ur.role_id = r.id where u.id = ?

DEBUG [main] - ==> Parameters: 1001(Long)

TRACE [main] - <== Columns: id, userName, userPassword, userEmail, userInfo, headImg, createTime, role.id, role.roleName, role.enabled, role.createBy, role.createTime

TRACE [main] - <== Row: 1001, test, 123456, test@mybatis.com, <>, <>, 2020-12-01 20:05:01, 2, 普通用户, 1, 1, 2020-12-01 20:05:04

DEBUG [main] - <== Total: 1

角色名:普通用户

开启一个新的session

DEBUG [main] - Cache Hit Ratio [com.example.simple.mapper.RoleMapper]: 0.0

DEBUG [main] - ==> Preparing: select id, role_name,enabled,create_by,create_time from sys_role where id = ?

DEBUG [main] - ==> Parameters: 2(Long)

TRACE [main] - <== Columns: id, role_name, enabled, create_by, create_time

TRACE [main] - <== Row: 2, 普通用户, 1, 1, 2020-12-01 20:05:04

DEBUG [main] - <== Total: 1

开启第二个新的session

DEBUG [main] - Cache Hit Ratio [com.example.simple.mapper.RoleMapper]: 0.3333333333333333

DEBUG [main] - Cache Hit Ratio [com.example.simple.mapper.RoleMapper]: 0.5

角色名:普通用户

DEBUG [main] - ==> Preparing: update sys_role set enabled = ? where id = ?

DEBUG [main] - ==> Parameters: 1(Integer), 2(Long)

DEBUG [main] - <== Updates: 1

这样一来,二级缓存就存在于两个关联表中,因此就实现了脏数据的避免。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。