一、批量执行SQL语句 (BatchExecutor)
- 之前学习使用mybatis的foreach标签来, 批量查询sql, 这样的操作实际对MySQL数据库存在瓶颈问题,且效率很低
非批量的方式: 发一条sql, 预编译一次, 设置参数; 效率低
- 发送SQL10000次, 预编译10000次, 设置参数1000次, 数据库执行10000次
批量的方式: 将sql语句先预编译好, 给该sql设置参数即可
- 只发送SQL一次, 预编译一次, 设置参数1000次, 数据库执行一次
-
EnumTypeHandler(默认处理) : 通过枚举name来给预编译参数?设置值;
-
EnumOrdinalTypeHandler : 通过枚举的索引来给预编译参数?设置值;
测试
需要在mybatis-config.xml中来配置
此时再保存:
1、枚举类UserStatus
/**
* Description: 希望数据库保存的是100, 200这些状态码, 而不是枚举的名字/索引
*
* @author guizy
* @date 2021/4/22 17:37
*/
public enum UserStatus {
LOGIN(100, "用户登录"), LOGOUT(200, "用户登出"), REMOVE(300, "用户不存在");
private Integer code;
private String msg;
UserStatus(Integer code, String msg) {
this.code = code;
this.msg = msg;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
// 根据状态码返回枚举对象
public static UserStatus getUserStatusByCode(Integer code) {
switch (code) {
case 100:
return LOGIN;
case 200:
return LOGOUT;
case 300:
return REMOVE;
default:
return LOGOUT;
}
}
}
2、自定义枚举处理器
/**
* Description: 自定义的枚举处理器, 保存枚举的状态码
*
* @author guizy
* @date 2021/4/22 18:01
*/
public class MyEnumUserStatusTypeHandler implements TypeHandler {
@Override
public void setParameter(PreparedStatement ps, int i, UserStatus parameter, JdbcType jdbcType) throws SQLException {
System.out.println("要保存的状态码:" + parameter.getCode());
ps.setString(i, parameter.getCode().toString());
}
@Override
public UserStatus getResult(ResultSet rs, String columnName) throws SQLException {
// 需要根据从数据库中拿到的枚举状态码, 返回一个UserStatus枚举对象
int code = rs.getInt(columnName);
System.out.println("从数据库中获取的状态码:" + code);
return UserStatus.getUserStatusByCode(code);
}
@Override
public UserStatus getResult(ResultSet rs, int columnIndex) throws SQLException {
int code = rs.getInt(columnIndex); // 根据索引来拿
System.out.println("从数据库中获取的状态码:" + code);
return UserStatus.getUserStatusByCode(code);
}
@Override
public UserStatus getResult(CallableStatement cs, int columnIndex) throws SQLException {
int code = cs.getInt(columnIndex);
System.out.println("从数据库中获取的状态码:" + code);
return UserStatus.getUserStatusByCode(code);
}
}
3、在mybatis-config.xml中配置
除了在上面全局配置之外, 也可以在处理某个字段的时候告诉MyBatis用什么类型处理器
- 保存操作: #{empStatus,typeHandler=xxxx}
INSERT INTO user (id, name, pwd, userStatus)
VALUES (null, #{name}, #{pwd}, #{userStatus, typeHandler=com.sunny.handler.MyEnumUserStatusTypeHandler});
- 查询操作: 可以在resultMap的列标签中来配置, 如下
注意: 如果在参数位置修改TypeHandler,应该保证保存数据和查询数据用的TypeHandler是一样的。
4、测试
@Test
public void testEnum() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = new User("TestEnum", "1234");
mapper.insertUser(user);
System.out.println("保存成功: " + user.getId());
sqlSession.commit();
sqlSession.close();
}
DEBUG [main] - ==> Preparing: INSERT INTO user (id, name, pwd, userStatus) VALUES (null, ?, ?, ?);
要保存的状态码:200
DEBUG [main] - ==> Parameters: TestEnum(String), 1234(String), 200(String)
DEBUG [main] -
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?