mybatis aprendizaje 8

Uno, use enumeración u otros objetos

1. Utilice el procesador de enumeración
mybatis-config.xml proporcionado por MyBatis :

<?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 usa org.apache en type.EnumTypeHandler por defecto Este procesador solo procesa el valor literal de enumeración, por lo que no es adecuado para la situación actual. Además de este procesador de tipo de enumeración, MyBatis también proporciona el procesador org.apache.ibatis.type.EnumOrdinalTypeHandler, que utiliza el índice de enumeración para su procesamiento.

Clase de enumeración habilitada:

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;
}

Prueba:
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();
    }
}

resultado de la operación:

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. Utilice un procesador de tipo personalizado.
Clase de enumeración habilitada:

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 personalizado:

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();
        }
    }
}

resultado de la operación:

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. Soporte
para Java 8 date (JSR-310) MyBatis ha agregado soporte para Java 8 OSR-310 desde la versión 3.4.0.
pom.xml presenta dependencias:

<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis-typehandlers-jsr310</artifactId>
  <version>1.0.2</version>
</dependency>

De esta forma, el nuevo tipo de fecha se puede utilizar en Java.
Si usa una versión anterior a 3.4.0, agregue la siguiente configuración typeHandler en 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"/>-->
        <!--自定义-->
        <!--<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>

Estos typeHandler no están configurados como javaType, porque InstantTypeHandler la interfaz no es como TypeHandler por encima de EnabledTypeHandler logra la misma BaseTypeHandler<T>clase heredada InstantTypeHandler , pero BaseTypeHandler<T>también heredó la TypeReference<T>clase. Dado que TypeReference<T>con los tipos genéricos, MyBatis ha heredado las TypeReference<T>clases con un tratamiento especial, adquiere el tipo genérico designado aquí como propiedad javaType, por lo que no es necesario especificar javaType en el momento de la configuración. El siguiente InstantTypeHandler.

package org.apache.ibatis.type;

public class InstantTypeHandler extends BaseTypeHandler<Instant> {
    
    
   //...
}

Supongo que te gusta

Origin blog.csdn.net/tongwudi5093/article/details/114798200
Recomendado
Clasificación