1つは、列挙型または他のオブジェクトを使用する
1.MyBatisが提供する列挙プロセッサmybatis-config.xmlを使用します。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<typeHandlers>
<typeHandler handler="org.apache.ibatis.type.EnumOrdinalTypeHandler" javaType="cn.linst.type.Enabled"/>
</typeHandlers>
</configuration>
MyBatisはデフォルトでtype.EnumTypeHandlerでorg.apacheを使用します。このプロセッサは列挙リテラル値のみを処理するため、現在の状況には適していません。この列挙型プロセッサーに加えて、MyBatisはorg.apache.ibatis.type.EnumOrdinalTypeHandlerプロセッサーも提供します。これは、処理に列挙型インデックスを使用します。
列挙型クラスが有効:
package cn.linst.type;
public enum Enabled {
disabled,
enabled;
}
SysRole:
package cn.linst.model;
import cn.linst.type.Enabled;
import lombok.Getter;
import lombok.Setter;
import java.util.Date;
import java.util.List;
@Setter
@Getter
public class SysRole {
private Long id;
private String roleName;
//private Integer enabled;
private Enabled enabled;
private Long createBy;
private Date createTime;
private SysUser user;
/**
* 角色包含的权限列表
*/
List<SysPrivilege> privilegeList;
}
テスト:
UserMapperTest:
package cn.linst;
import cn.linst.mapper.RoleMapper;
import cn.linst.mapper.UserMapper;
import cn.linst.model.SysPrivilege;
import cn.linst.model.SysRole;
import cn.linst.model.SysUser;
import cn.linst.type.Enabled;
import org.apache.ibatis.session.SqlSession;
import org.junit.Assert;
import org.junit.Test;
import java.util.*;
public class UserMapperTest extends BaseMapperTest {
@Test
public void testUpdateById () {
SqlSession sqlSession = getSqlSession() ;
try {
RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class) ;
//先查询出角色,然后修改角色的 enabled 值为 disabled
SysRole role = roleMapper.selectById(2L) ;
Assert.assertEquals(Enabled.enabled , role.getEnabled());
role.setEnabled(Enabled.disabled) ;
roleMapper.updateById(role) ;
} finally {
sqlSession.rollback();
sqlSession.close();
}
}
}
BaseMapperTest:
package cn.linst;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.BeforeClass;
import java.io.IOException;
import java.io.Reader;
public class BaseMapperTest {
private static SqlSessionFactory sqlSessionFactory;
@BeforeClass
public static void init () {
try {
Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
reader.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
public SqlSession getSqlSession() {
return sqlSessionFactory.openSession();
}
}
演算結果:
DEBUG [main] - ==> Preparing: select id, role_name roleName, enabled, create_by createBy, create_time createTime from sys_role where id = ?
DEBUG [main] - ==> Parameters: 2(Long)
TRACE [main] - <== Columns: id, roleName, enabled, createBy, createTime
TRACE [main] - <== Row: 2, 普通用户, 1, 1, 2020-02-01 17:02:34.0
DEBUG [main] - <== Total: 1
DEBUG [main] - ==> Preparing: update sys_role set role_name = ?, enabled = ?, create_by = ?, create_time = ? where id = ?
DEBUG [main] - ==> Parameters: 普通用户(String), 0(Integer), 1(Long), 2020-02-01 17:02:34.0(Timestamp), 2(Long)
DEBUG [main] - <== Updates: 1
2.カスタムタイププロセッサを使用する
列挙クラス有効:
package cn.linst.type;
public enum Enabled {
enabled(1), // 启用
disabled(0); // 禁用
private final int value;
Enabled(int value) {
this.value = value;
}
public int getValue() {
return value;
}
}
カスタムEnabledTypeHandler:
package cn.linst.type;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.TypeHandler;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
/**
* Enabled 类型处理器
*/
public class EnabledTypeHandler implements TypeHandler<Enabled> {
private final Map<Integer, Enabled> enabledMap = new HashMap<Integer , Enabled>();
public EnabledTypeHandler() {
for (Enabled enabled : Enabled.values()) {
enabledMap.put(enabled.getValue(), enabled);
}
}
@Override
public void setParameter(PreparedStatement ps, int i, Enabled parameter, JdbcType jdbcType) throws SQLException {
ps.setInt(i, parameter.getValue());
}
@Override
public Enabled getResult(ResultSet rs, String columnName) throws SQLException {
Integer value = rs.getInt(columnName);
return enabledMap.get(value);
}
@Override
public Enabled getResult(ResultSet rs, int columnIndex) throws SQLException {
Integer value = rs.getInt(columnIndex);
return enabledMap.get(value);
}
@Override
public Enabled getResult(CallableStatement cs, int columnIndex) throws SQLException {
Integer value = cs.getInt(columnIndex);
return enabledMap.get(value);
}
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 其他配置 -->
<settings>
<setting name="logImpl" value="LOG4J"/>
<!-- 将以下画线方式命名的数据库列映射到-->
<setting name="mapUnderscoreToCamelCase" value="true" />
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
<typeHandlers>
<!--<typeHandler handler="org.apache.ibatis.type.EnumOrdinalTypeHandler" javaType="cn.linst.type.Enabled"/>-->
<!--自定义-->
<typeHandler handler="cn.linst.type.EnabledTypeHandler" javaType="cn.linst.type.Enabled"/>
</typeHandlers>
</configuration>
package cn.linst;
import cn.linst.mapper.RoleMapper;
import cn.linst.mapper.UserMapper;
import cn.linst.model.SysPrivilege;
import cn.linst.model.SysRole;
import cn.linst.model.SysUser;
import cn.linst.type.Enabled;
import org.apache.ibatis.session.SqlSession;
import org.junit.Assert;
import org.junit.Test;
import java.util.*;
public class UserMapperTest extends BaseMapperTest {
// 省略其他
@Test
public void testUpdateById () {
SqlSession sqlSession = getSqlSession() ;
try {
RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class) ;
//先查询出角色,然后修改角色的 enabled 值为 disabled
SysRole role = roleMapper.selectById(2L) ;
Assert.assertEquals(Enabled.enabled , role.getEnabled());
role.setEnabled(Enabled.disabled) ;
roleMapper.updateById(role) ;
} finally {
sqlSession.rollback();
sqlSession.close();
}
}
}
演算結果:
DEBUG [main] - ==> Preparing: select id, role_name roleName, enabled, create_by createBy, create_time createTime from sys_role where id = ?
DEBUG [main] - ==> Parameters: 2(Long)
TRACE [main] - <== Columns: id, roleName, enabled, createBy, createTime
TRACE [main] - <== Row: 2, 普通用户, 1, 1, 2020-02-01 17:02:34.0
DEBUG [main] - <== Total: 1
DEBUG [main] - ==> Preparing: update sys_role set role_name = ?, enabled = ?, create_by = ?, create_time = ? where id = ?
DEBUG [main] - ==> Parameters: 普通用户(String), 0(Integer), 1(Long), 2020-02-01 17:02:34.0(Timestamp), 2(Long)
DEBUG [main] - <== Updates: 1
3.
Java 8日付のサポート(JSR-310)MyBatisは、バージョン3.4.0以降、Java 8OSR-310のサポートを追加しました。
pom.xmlは依存関係を導入します:
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-typehandlers-jsr310</artifactId>
<version>1.0.2</version>
</dependency>
このようにして、新しい日付型をJavaで使用できます。
3.4.0より前のバージョンを使用する場合は、mybatis-config.xmlに次のtypeHandler構成を追加します。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 省略其他配置 -->
<typeHandlers>
<!--<typeHandler handler="org.apache.ibatis.type.EnumOrdinalTypeHandler" javaType="cn.linst.type.Enabled"/>-->
<!--自定义-->
<!--<typeHandler handler="cn.linst.type.EnabledTypeHandler" javaType="cn.linst.type.Enabled"/>-->
<typeHandler handler="org.apache.ibatis.type.InstantTypeHandler"/>
<typeHandler handler="org.apache.ibatis.type.LocalDateTimeTypeHandler"/>
<typeHandler handler="org.apache.ibatis.type.LocalDateTypeHandler"/>
<typeHandler handler="org.apache.ibatis.type.OffsetDateTimeTypeHandler"/>
<typeHandler handler="org.apache.ibatis.type.OffsetTimeTypeHandler"/>
<typeHandler handler="org.apache.ibatis.type.ZonedDateTimeTypeHandler"/>
<typeHandler handler="org.apache.ibatis.type.YearTypeHandler"/>
<typeHandler handler="org.apache.ibatis.type.MonthTypeHandler"/>
</typeHandlers>
</configuration>
これらのtypeHandlerはjavaTypeとして構成されていません。これは、InstantTypeHandlerインターフェースが、EnabledTypeHandlerの上のTypeHandlerと同じ、InstantTypeHandler継承BaseTypeHandler<T>
クラスを実現するだけでなくBaseTypeHandler<T>
、TypeReference<T>
クラスも継承するためです。のでTypeReference<T>
、一般的なタイプと、MyBatisのは継承されてきたTypeReference<T>
のJavaTypeプロパティとしてここに指定されたジェネリック型を取得し、特別な治療のクラスを、その設定時にJavaTypeがを指定する必要はありません。次のInstantTypeHandler。
package org.apache.ibatis.type;
public class InstantTypeHandler extends BaseTypeHandler<Instant> {
//...
}