mybatis学习8

一、使用枚举或其他对象

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 默认使用 org.apache at type.EnumTypeHandler ,这个处理器只是对枚举的字面值进行处理,所以不适合当前的情况。除了这个枚举类型处理器, MyBatis还提供了 org.apache.ibatis.type.EnumOrdinalTypeHandler 处理器,这个处理器使用枚举的索引进行处理。

枚举类Enabled:

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、使用自定义的类型处理器
枚举类Enabled:

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、对Java8 日期( JSR-310 )的支持
MyBatis 从3.4.0 版本开始增加 了对 Java 8 OSR-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