类型转换
假如java类型是Integer,db类型是varchar
使用注解
Entity.class1 2 3 4 5
| @TableName(value = "table_name", autoResultMap = true) public class Entity { @TableField(typeHandler = IntegerStringHandler.class) Integer field; }
|
其中
IntegerStringHandler.java1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| public class IntegerStringHandler extends BaseTypeHandler<Integer> { @Override public void setNonNullParameter(PreparedStatement ps, int i, Integer parameter, JdbcType jdbcType) throws SQLException { ps.setString(i, String.valueOf(parameter)); }
@Override public Integer getNullableResult(ResultSet rs, String columnName) throws SQLException { String string = rs.getString(columnName); return string == null ? null : Integer.valueOf(string); }
@Override public Integer getNullableResult(ResultSet rs, int columnIndex) throws SQLException { String string = rs.getString(columnIndex); return string == null ? null : Integer.valueOf(string); }
@Override public Integer getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { String string = cs.getString(columnIndex); return string == null ? null : Integer.valueOf(string); } }
|
使用Wrapper Set的方式:
1 2 3
| Wrappers.<>lambdaUpdate() .set(Entity::setField, value, "typeHandler=com.example.xxx.handler.IntegerStringHandler")
|
Enum类型
使用注解的方式
Enum.java1 2 3 4 5 6 7 8
| public enum Enum { A("1"), B("2"), ;
@EnumValue private final String code; }
|
使用TypeHandler
(略)
增加insertAll方法
MybatisPlusConfiguration.java1 2 3 4 5 6 7 8 9 10 11 12 13
| @Bean public CustomSqlInjector customSqlInjector() { return new CustomSqlInjector(); }
public static class CustomSqlInjector extends DefaultSqlInjector { @Override public List<AbstractMethod> getMethodList(Class<?> mapperClass, TableInfo tableInfo) { List<AbstractMethod> methodList = super.getMethodList(mapperClass, tableInfo); methodList.add(new InsertBatchSomeColumn("insertAll", tableFieldInfo -> tableFieldInfo.getInsertStrategy() != FieldStrategy.NEVER)); return methodList; } }
|
使用拦截器
MybatisPlusConfiguration.java1 2 3 4 5 6 7 8 9 10 11 12
| @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(); paginationInnerInterceptor.setDbType(DbType.MYSQL); interceptor.addInnerInterceptor(paginationInnerInterceptor);
interceptor.addInnerInterceptor(new BlockAttackInnerInterceptor());
return interceptor; }
|
缺点
- 很多注解需要写到DTO(Enum)上,除非再加一层Entity
- Wrapper无法使用字段注解,需要多次添加mapping参数
- Wrapper的
eq没有mapping参数 - 很多配置都是以
mybatis-plus开头,需要再配置一次
类型不匹配
- db是
integer,sql是string,走索引 - db是
varchar,sql是integer,不走索引