Mybatis 通用JSON Type Handler (无需在mapper.xml中配置)

看了很多博客,大部分都是讲的自定义TypeHandler处理器,然后通过xml来指定这个处理器来进行配置。其实不然,也可以通过编码的方式进行配置。

继承 org.apache.ibatis.type.BaseTypeHandler 类是实现自定义 TypeHandler 的常见方式,假设我们需要将一个 Java 对象转化为 JSON 字符串进行存储。可以通过以下步骤来定义和注册自定义 TypeHandler:

  1. 实现一个 TypeHandler 类,继承自 BaseTypeHandler<T>,其中 T 为需要处理的 Java 对象的类型,实现以下方法:
  • setNonNullParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType):将 Java 对象转化为字符串,设置到 PreparedStatement 中。

  • getNullableResult(ResultSet rs, String columnName):从结果集中根据列名称获取结果并转化为 Java 对象。

  • getNullableResult(ResultSet rs, int columnIndex):从结果集中根据列索引获取结果并转化为 Java 对象。

  • getNullableResult(CallableStatement cs, int columnIndex):从 CallableStatement 中根据列索引获取结果并转化为 Java 对象。

以下是一个案例:

package com.maxrocky.repository.lottery.config;    /**
 * @Author:ChenBenLong
 * @name:JsonObjectTypeHandler
 * @Date:2023/4/26 18:33
 * @Filename:JsonObjectTypeHandler
 */

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * JsonObjectTypeHandler :
 * @author:chenbenlong
 * @Time:2023/4/26
 * @Version:1.0
 **/
public class JsonObjectTypeHandler extends BaseTypeHandler<JSONObject> {


    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, JSONObject parameter, JdbcType jdbcType) throws SQLException {
        ps.setString(i, JSONObject.toJSONString(parameter));
    }

    @Override
    public JSONObject getNullableResult(ResultSet rs, String columnName) throws SQLException {
        // 从 ResultSet 中获取 JSON 字符串并将其转换为 Java 对象
        return JSON.parseObject(rs.getString(columnName));
    }

    @Override
    public JSONObject getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        // 从 ResultSet 中获取 JSON 字符串并将其转换为 Java 对象
        return JSON.parseObject(rs.getString(columnIndex));
    }

    @Override
    public JSONObject getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        // 从 CallableStatement 中获取 JSON 字符串并将其转换为 Java 对象
        return JSON.parseObject(cs.getString(columnIndex));
    }
}

在这个案例中,我们使用了alibaba的fastJson库,并且将需要处理的类进行了转换。

        2.注册自定义 TypeHandler,在 SqlSessionFactory(mybaits数据库配置) 中进行注册

    @Bean
    @Primary
    public SqlSessionFactory primarySqlSessionFactory(@Qualifier("primaryDataSource") DataSource dataSource,@Qualifier("pageHelperPlugins") Interceptor[] interceptors) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        
        //注册TypeHandler进行json处理
                                 bean.getObject().getConfiguration().getTypeHandlerRegistry().register(JSONObject.class, JsonObjectTypeHandler.class);

        //bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mybatis/mapper/test1/*.xml"));
        return bean.getObject();
    }

在这个示例中,我们首先通过 SqlSessionFactoryBean 构造了 SqlSessionFactoryBean 对象,然后获取 configuration 配置对象并且在 TypeHandlerRegistry 中注册了 TypeHandler 类型处理器。

需要注意的是,由于 TypeHandler 是处理 Java 对象和 SQL 数据类型的关系,在使用时需要根据实际的场景传入相应的类型。

另外,需要注意在使用时,不同版本的 Mybatis 的 API 可能会略微有不同。以上仅是示例,具体还需要根据实际情况进行调整。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis 是一款使用 XML 或注解配置的持久层框架,它可以自动化地将数据库的数据映射到 Java 对象。在 MyBatis mappermapper.xml 是配对使用的,其 mapper 是接口,而 mapper.xml 是映射配置文件。 mapper 接口定义了数据库操作的方法,而 mapper.xml 则定义了这些方法的 SQL 语句以及参数映射规则、结果集映射规则等。 下面是一个简单的例子: 1. 定义 mapper 接口 ```java public interface UserMapper { User selectUserById(Integer id); } ``` 2. 定义 mapper.xml 映射配置文件 ```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.example.UserMapper"> <resultMap id="userResultMap" type="com.example.User"> <id column="id" property="id"/> <result column="username" property="username"/> <result column="password" property="password"/> </resultMap> <select id="selectUserById" resultMap="userResultMap"> SELECT * FROM user WHERE id = #{id} </select> </mapper> ``` 上述代码,namespace 属性指定了 mapper 接口的全限定名,resultMap 标签定义了一个结果集映射规则,select 标签定义了一个查询操作,其 id 属性指定了 mapper 接口的方法名,resultMap 属性指定了结果集映射规则的 id。 3. 在 MyBatis 配置文件引入 mapper.xml ```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> <mappers> <mapper resource="com/example/UserMapper.xml"/> </mappers> </configuration> ``` 上述代码mapper 标签指定了映射配置文件的位置。 这样就完成了 mappermapper.xml配置。在代码调用 selectUserById 方法时,MyBatis 会根据 mapper.xml 配置自动生成 SQL 语句,并将查询结果映射到 User 对象

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值