• Mybatis之TypeHandler使用教程


    引言
    MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

    1、typeHandles的基础知识

    TypeHandler 在 MyBatis 中是一个用于处理 Java 类型和数据库类型之间映射转换的接口。简而言之,它负责:

    1. Java到数据库的映射:在执行 SQL 语句时,TypeHandler 将 Java 类型转换为数据库可以理解的类型。

    2. 数据库到Java的映射:在读取数据库结果时,TypeHandler 将数据库类型转换回 Java 类型。

    2、场景复现

    首先建立了一个t_user表存储用户信息,这个表中有一栏favorites是记录个人爱好的,爱好包括篮球、足球、排球:

    在Java的User对象对应的是一个String类型的List,而在数据库中是用分号分隔的字符表示,比如:"basketball;football;volleyball",
    所以我们需要创建一个继承了BaseTypeHandler的类(BaseTypeHandler实现了TypeHandler接口,使用BaseTypeHandler更简单),
    @MappedTypes定义需要被拦截的java类型 @MappedJdbcTypes配置jdbc类型,这里的JdbcType必须org.apache.ibatis.type.JdbcType中的枚举类型,
    然后还需要实现BaseTypeHandler抽象类中一系列的get set方法,具体实现的代码如下:

    @MappedJdbcTypes(JdbcType.VARCHAR)
    @MappedTypes(List.class)
    public class ListVarcharTypeHandler extends BaseTypeHandler> {
     @Override
        public void setNonNullParameter(PreparedStatement ps, int i, List list, JdbcType jdbcType) throws SQLException {
            System.out.println("setNonNullParameter ...... "); //a,b,c,d
            //处理数据 将List转换为特定格式的字符串
            StringBuffer sb = new StringBuffer();
            String msg = null;
            if(list != null){
                for(String p : list){
                    sb.append(p).append(";");
                }
                msg = sb.toString();
                msg = msg.substring(0,msg.length()-1);
            }
            ps.setString(i,msg);
        }
    
        /**
         * 获取非空的结果集
         * @param rs
         * @param columnName
         * @return
         * @throws SQLException
         */
        @Override
        public List getNullableResult(ResultSet rs, String columnName) throws SQLException {
            System.out.println(111);
            System.out.println( Arrays.asList(rs.getString(columnName).split(";")));
            return Arrays.asList(rs.getString(columnName).split(";"));
        }
    
        @Override
        public List getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
            System.out.println(222);
            return Arrays.asList(rs.getString(columnIndex).split(";"));
        }
    
        @Override
        public List getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
            System.out.println(333);
            return Arrays.asList(cs.getString(columnIndex).split(";"));
        }
    }
    

    创建完类后,我们还需要配置xml文件,一个是映射文件,一个mybatis配置文件:

    ...
        
        
            "com.doing.typehandle.ListVarcharTypeHandler" />
        
    ...
    
    ...
        
        "userMap" type="com.doing.pojo.User">
            "id" column="id"/>
            "username" column="username"/>
            "address" column="address"/>
            "gender" column="gender"/>
            "favorites" column="favorites" typeHandler="com.doing.typehandle.ListVarcharTypeHandler"/>
        
    
        
        "addUser" parameterType="com.doing.pojo.User" >
            insert into t_user (id,username,address,gender,favorites)values(#{id},#{username},#{address},#{gender},#{favorites,typeHandler=com.doing.typehandle.ListVarcharTypeHandler})
        
    
    
        
        
    
    
        
        
    ...
    

    在配置完成之后,点击运行:

    3、总结

    TypeHandler是一个用于处理 Java 类型和数据库类型之间映射转换的接口,BaseTypeHandler是实现了TypeHandler接口的抽象类,使用BaseTypeHandler能够处理数据库数据结构和bean对象数据类型之间的转换。


    __EOF__

  • 本文作者: news_one
  • 本文链接: https://www.cnblogs.com/new-one/p/17962118
  • 关于博主: 评论和私信会在第一时间回复。或者直接私信我。
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。
  • 相关阅读:
    构建Java线程间的默契:学习wait()、notify()和notifyAll()方法的巧妙运用
    TFTP协议解析及C/C++代码实现
    棒球省队建设实施办法·棒球1号位
    Java老人护理上门服务类型系统小程序APP源码
    js数据结构[单项链表];
    【FTP】一、什么是FTP?
    Git 小白入门到进阶—(基本概念和常用命令)
    VR虚拟仿真在旅游课堂教学演示
    设计模式概述
    expdp导出分区表缓慢排查(Streams AQ: waiting for messages in the queue )
  • 原文地址:https://www.cnblogs.com/new-one/p/17962118