首页 > 其他分享 >Mybatis之TypeHandler使用教程

Mybatis之TypeHandler使用教程

时间:2024-01-13 11:13:58浏览次数:32  
标签:教程 Java 映射 TypeHandler 数据库 List BaseTypeHandler Mybatis

引言
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<List<String>> {
 @Override
    public void setNonNullParameter(PreparedStatement ps, int i, List<String> 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<String> 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<String> getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        System.out.println(222);
        return Arrays.asList(rs.getString(columnIndex).split(";"));
    }

    @Override
    public List<String> getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        System.out.println(333);
        return Arrays.asList(cs.getString(columnIndex).split(";"));
    }
}

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

...
    <!-- 使用将集合转化为对应的数据类型的注解  -->
    <typeHandlers>
        <typeHandler handler="com.doing.typehandle.ListVarcharTypeHandler" />
    </typeHandlers>
...
...
    <!-- 对指定的结果进行类型转换  -->
    <resultMap id="userMap" type="com.doing.pojo.User">
        <id property="id" column="id"/>
        <result property="username" column="username"/>
        <result property="address" column="address"/>
        <result property="gender" column="gender"/>
        <result property="favorites" column="favorites" typeHandler="com.doing.typehandle.ListVarcharTypeHandler"/>
    </resultMap>

    <!-- 添加用户信息 -->
    <insert id="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})
    </insert>


    <!--  查询所有用户信息  -->
    <select id="queryAll" resultMap="userMap">
        select * from t_user
    </select>


    <!-- 根据用户编号查询用户信息 -->
    <select id="queryById" parameterType="java.lang.Integer"
            resultMap="userMap">
        select * from t_user where id = #{id};
    </select>
...

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

3、总结

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

标签:教程,Java,映射,TypeHandler,数据库,List,BaseTypeHandler,Mybatis
From: https://www.cnblogs.com/new-one/p/17962118

相关文章

  • 通过 KernelUtil.dll 劫持 QQ / TIM 客户端 QQClientkey / QQKey 详细教程(附源码)
    前言由于QQ9.7.20版本后已经不能通过模拟网页快捷登录来截取QQClientkey/QQKey,估计是针对访问的程序做了限制,然而经过多方面测试,诸多的地区、环境、机器也针对这种获取方法做了相应的措施,导致模拟网页快捷登录来截取数据被彻底的和谐,为了解决这个问题我们只能更改思路对......
  • 无涯教程-JUnit - 扩展类
    以下是JUnit扩展-CactusJWebUnitXMLUnitCactusCactus是用于对服务器端Java代码(Servlet,EJB,TagLib,Filters)进行单元测试的简单测试框架。Cactus的目的是降低编写服务器端代码测试的成本。它使用JUnit并将其扩展。由几个部分组成-CactusFramework是Cactus的核心,它是提供......
  • 无涯教程-Maven - 环境设置
    Maven是一个基于Java的工具,因此最首要的要求是在您的计算机上安装JDK。第1步-验证Java安装打开控制台并执行以下java命令。OSTaskCommandWindowsOpenCommandConsolec:\>java-versionLinuxOpenCommandTerminal$java-versionMacOpenTerminalmachine:~jo......
  • 学习如何使用 Python 连接 MongoDB: PyMongo 安装和基础操作教程
    Python可以用于数据库应用程序。最流行的NoSQL数据库之一是MongoDBMongoDBMongoDB将数据存储在类似JSON的文档中,使数据库非常灵活和可扩展。您可以在MongoDB官网上下载免费的MongoDB数据库PyMongoPython需要一个MongoDB驱动程序来访问MongoDB数据库。我将......
  • 无涯教程-Maven - 配置文件
    构建配置文件是一组配置值,可用于设置或覆盖Maven构建的默认值。文件类型构建配置文件主要分为三种类型。Type定义的地方PerProject在项目POM文件pom.xml中定义PerUser在Maven设置xml文件(%USER_HOME%/.m2/settings.xml)中定义Global在Maven全局设置xml文件(%M2_HOME%/co......
  • 简单说一下mybatis的多表映射的使用
    MyBatis是一种流行的Java持久层框架,它提供了一种简单而强大的方式来进行数据库操作。在MyBatis中,多表映射是指将数据库中多个关联表之间的数据映射到Java对象中的过程。MyBatis提供了多种方式来实现多表映射,下面是其中两种常用的方法:使用嵌套查询(NestedQueries):这是一......
  • 学习如何使用 Python 连接 MongoDB: PyMongo 安装和基础操作教程
    Python可以用于数据库应用程序。最流行的NoSQL数据库之一是MongoDBMongoDBMongoDB将数据存储在类似JSON的文档中,使数据库非常灵活和可扩展。您可以在MongoDB官网上下载免费的MongoDB数据库PyMongoPython需要一个MongoDB驱动程序来访问MongoDB数据库。我将......
  • 无涯教程-JUnit - Eclipse插件
    要使用eclipse设置JUnit,请遵循以下步骤。步骤1-下载JUnit包根据系统上的操作系统下载JUnitjar。OSJar名称Windowsjunit4.10.jarLinuxjunit4.10.jarMacjunit4.10.jar假设您已将上面的JAR文件复制到文件夹C:\>JUnit。步骤2-设定Eclipse环境打开eclipse→......
  • mybatis-generator:generate生成器将另外的数据库内同名表生成
     问题:在使用mybatis-generator:generate生成器时,会生成别的数据库内同表名;因为是相同表名。 解决:在生成器的配置文件中的数据库连接地址内添加:<!--放置生成其他库同名表--><propertyname="nullCatalogMeansCurrent"value="true"/>......
  • 无涯教程-JUnit - 参数化测试
    JUnit4引入了称为参数化测试的新功能,参数化测试允许开发人员使用不同的值一次又一次地运行相同的测试。创建参数化测试需要遵循五个步骤。使用@RunWith(Parameterized.class)注释测试类。创建一个用@Parameters注释的公共静态方法,该方法返回对象的集合作为测试数据集。创建一......