mybatis学習8

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> {
    
    
   //...
}

おすすめ

転載: blog.csdn.net/tongwudi5093/article/details/114798200