mybatis类型处理器TypeHandler(自定义类型处理器)

一  概述

   对于jdbc 中PrepareStatement ResultSet都需要对数据库类型和java中数据类型进行转换,mybatis启动时已经加载了我们所需类型处理器如下:

  

     

二  自定义类型处理器

  现在有个需求把文档状态(是枚举类型)中的code存入数据库(枚举类型和数据类型的转换)

  自定义类型处理器有两种方式:

    a 实现TypeHandler接口

    b 继承BaseTypeHandler抽象类

  (1)文档实体类:

    

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Document {
    
    private  String title;
    private  DocStatus status;
}

 (2)枚举类,插入操作时候将文档状态code存入数据库,列如Ok中的1

public enum DocStatus {
    
    OK(1),
    ERROR(2);
    
    int code;    
    DocStatus(int code) {
        this.code=code;
    }
    public int getCode() {
        return code;
    }
    public void setCode(int code) {
        this.code = code;
    }
    
    
}

 (3)TypeHandler实现类的编写

public class DocumentTypeHandler implements TypeHandler<DocStatus> {

    @Override
    public void setParameter(PreparedStatement ps, int i, DocStatus parameter, JdbcType jdbcType) throws SQLException {
     //做了处理 ps.setInt(i, parameter.getCode()); } @Override
public DocStatus getResult(ResultSet rs, String columnName) throws SQLException {
return null; } @Override public DocStatus getResult(ResultSet rs, int columnIndex) throws SQLException { return null; } @Override public DocStatus getResult(CallableStatement cs, int columnIndex) throws SQLException { return null; } }

  (4)xml文件中使用上面的类型处理器 

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.dp.ssm.dao.DocumentDao">
        <insert id="saveDocument" parameterType="com.dp.ssm.entity.Document">
          insert into document (title,status)
          values (#{title},#{status,typeHandler=com.dp.ssm.config.DocumentTypeHandler})
        </insert>

</mapper>

 

测试:

  

    @Test
    public void test2() throws IOException {
        SqlSessionFactory  sqlSessionFactory=new  SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
        SqlSession sqlSession=sqlSessionFactory.openSession();
        
        Document document=new Document("test",DocStatus.OK);
        DocumentDao documentDao=sqlSession.getMapper(DocumentDao.class);
        documentDao.saveDocument(document);
        sqlSession.commit();
    }
    

测试结果如下:

  

posted @ 2021-02-24 19:28  StrangerIt  阅读(497)  评论(0)    收藏  举报