mybatis TypeHandler注入spring的依赖方式

 更新时间:2022年01月28日 11:54:18   作者:Star--Zhang  
这篇文章主要介绍了mybatis TypeHandler注入spring的依赖方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

TypeHandler注入spring的依赖

解决方法

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- .... -->
        <property name="typeHandlers">
          <array>
            <bean class="com.example.YurCustomTypeHandler">
              <property name="property" ref="bean"/>
            </bean>
          </array>
        </property>
    </bean>

在mybatis想通过写一个自定义的handler实现业务功能,该handler默认创建的时候,是不在spring的管理范围里的,所以你在handler用@Autowired注入,是会报npe。

需要通过上面的方式,就可以解决了。

mybatis扩展:自定义TypeHandler

在Mybatis中定义了很多默认的类型处理器,将sql语句中的值转化成JDBC的类型,以及将结果集中的值转化为字段类型的值,详情可见官网默认的TypeHandler,但是有的时候我们并不想用官网的TypeHandler的时候,自定义的TypeHandler就派上用场了

1、编写自定义TypeHandler

在自定义的类上加上@MappedJdbcTypes(JdbcType.VARCHAR)注解,括号里的JdbcType.Varchar是需要替代的

默认的JDBC类型,然后让这个类继承BaseHandler<String>,泛型类型String说明替代String类型,然后再重写的方法中

对只进行处理就行了,每个方法都必须返回值,如果没有返回的话,默认是不返回任何东西的,导致的结果就是,插入的值为null,获得的值也全部为null

package javaDIYFree.typeHandler;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import sun.security.provider.MD5;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
 * @author Hearts
 * @date 2019/4/17
 * @desc
 */
@MappedJdbcTypes(JdbcType.VARCHAR)//需要替代的默认的JDBC类型,泛型类型String说明替代String类型
public class VarcharTypeHandler extends BaseTypeHandler<String> {
    /**
     * 对设置的值进行处理
     * @param preparedStatement
     * @param i
     * @param s
     * @param jdbcType
     * @throws SQLException
     */
    @Override
    public void setNonNullParameter(PreparedStatement preparedStatement, int i, String s, JdbcType jdbcType) throws SQLException {
        //我在传进来的字符串后面加了一串字符串
        preparedStatement.setString(i,s+">>>>>>>>>>>>>>>>");
    }
    /**
     * 对获取值的操作进行扩展,列名方式
     * @param resultSet
     * @param s
     * @return
     * @throws SQLException
     */
    @Override
    public String getNullableResult(ResultSet resultSet, String s) throws SQLException {
        return resultSet.getString(s);
    }
    /**
     * 对获取值的操作进行扩展,索引方式
     * @param resultSet
     * @param i
     * @return
     * @throws SQLException
     */
    @Override
    public String getNullableResult(ResultSet resultSet, int i) throws SQLException {
        return resultSet.getString(i);
    }
    /**
     * 对其他获取值的操作进行扩展
     * @param callableStatement
     * @param i
     * @return
     * @throws SQLException
     */
    @Override
    public String getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
        return callableStatement.getString(i);
    }
}

2、配置TypeHandler

有两种方式配置,一种就是直接,再配置SqlSessionFactoryBean的时候,将自定义的TypeHandler配置进去,但是这种方式不常用,应为这就代表所有的Varchar的操作都是用自定义的TypeHandler了,一般我们只需要在某一个表的某一个字段进行自定义,这个时候就用第二种方式配置了

第一种配置方式

	@Bean
    public SqlSessionFactoryBean createSqlSessionFactoryBean(DruidDataSource druidDataSource){
        final SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        try{
            //配置数据源
            sqlSessionFactoryBean.setDataSource(druidDataSource);
            //配置mapper文件所在的位置
            sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/*.xml"));
            //配置自定义TypeHandler
            sqlSessionFactoryBean.setTypeHandlers(new TypeHandler[]{new VarcharTypeHandler()});
        } catch (IOException e) {
            e.printStackTrace();
        }
        return sqlSessionFactoryBean;
    }

在需要使用的操作和字段中添加typeHandler

  <insert id="insert" parameterType="javaDIYFree.model.User">
    insert into user (id, create_date, `name`, 
      did, `password`, username
      )
    values (#{id,jdbcType=BIGINT}, #{createDate,jdbcType=TIMESTAMP}, #{name,jdbcType=VARCHAR}, 
      #{did,jdbcType=BIGINT}, #{password,jdbcType=VARCHAR}, #{username,jdbcType=VARCHAR,typeHandler=varcharTypeHandler}
      )
      <!--在插入操作内,对username字段进行处理-->
  </insert>

3、测试

package javaDIYFree.dao;
import javaDIYFree.config.MybatisConfig;
import javaDIYFree.model.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.util.function.Consumer;
/**
 * @author Hearts
 * @date 2019/4/17
 * @desc
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = MybatisConfig.class)
public class UserMapperTest {
    @Autowired
    private UserMapper userMapper;
    @Test
    /**
     * 测试insert方法
     */
    public void insertUser(){
        User user = new User();
        user.setUsername("zhangsan");
        user.setPassword("123456");
        userMapper.insert(user);
    }
    @Test
    /**
     * 测试selectAll方法
     */
    public void selectAllUser(){
        userMapper.selectAll().forEach(new Consumer<User>() {
            public void accept(User i) {
                //打印用户名和密码
                System.out.println(i.getUsername() +" ======> "+i.getPassword());
            }
        });
    }
}

4、项目结构图

在这里插入图片描述

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Spark学习笔记 (二)Spark2.3 HA集群的分布式安装图文详解

    Spark学习笔记 (二)Spark2.3 HA集群的分布式安装图文详解

    这篇文章主要介绍了Spark2.3 HA集群的分布式安装,结合图文与实例形式详细分析了Spark2.3 HA集群分布式安装具体下载、安装、配置、启动及执行spark程序等相关操作技巧,需要的朋友可以参考下
    2020-02-02
  • 基于Java实现Socket编程入门

    基于Java实现Socket编程入门

    Java最初是作为网络编程语言出现的,使得客户端和服务器的沟通变成了现实,而在网络编程中,使用最多的就是Socket,本文就来介绍一下基于Java实现Socket编程入门,感兴趣的可以来了解一下
    2022-03-03
  • socket编程时的发送与接收数据时的问题解析

    socket编程时的发送与接收数据时的问题解析

    这篇文章主要为大家介绍了socket编程时的发送与接收数据时的问题解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • spring定时任务执行两次及tomcat部署缓慢问题的解决方法

    spring定时任务执行两次及tomcat部署缓慢问题的解决方法

    这篇文章主要给大家介绍了关于spring定时任务执行两次及tomcat部署缓慢问题的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面小编来一起学习学习吧。
    2018-01-01
  • Java基础之让你彻底搞懂代理模式

    Java基础之让你彻底搞懂代理模式

    这篇文章主要介绍了Java基础之让你彻底搞懂代理模式,文中有非常详细的代码示例,对正在学习java基础的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-04-04
  • 使用springboot activiti关闭验证自动部署方式

    使用springboot activiti关闭验证自动部署方式

    这篇文章主要介绍了使用springboot activiti关闭验证自动部署方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • IDEA 2021.3 使用及idea2021.3.1激活使用方法

    IDEA 2021.3 使用及idea2021.3.1激活使用方法

    IDEA 全称 IntelliJ IDEA,是java语言开发的集成环境,IntelliJ在业界被公认为最好的java开发工具之一,今天通过本文给大家介绍idea2021.3.1激活及使用教程,感兴趣的朋友一起看看吧
    2022-01-01
  • Java Redis Template批量查询指定键值对的实现

    Java Redis Template批量查询指定键值对的实现

    本文主要介绍了Java Redis Template批量查询指定键值对的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • Java 创建PDF打印小册子案例

    Java 创建PDF打印小册子案例

    这篇文章主要给大家分享Java 创建PDF打印小册子案例,PDF打印小册子是指将PDF格式文档在打印成刊物前需要提前进行的页面排版,以便在打印后装订成册,下面文章内容我们将下面以Java代码展示如何来实现,需要的朋友可以参考一下
    2021-10-10
  • 如何在Spring Boot框架中使用拦截器实现URL限制

    如何在Spring Boot框架中使用拦截器实现URL限制

    在Spring Boot框架中,您可以使用拦截器(Interceptor)来控制限制URL列表,本文通过一个简单的示例给大家介绍Spring Boot 拦截器实现URL限制的操作方法,感兴趣的朋友跟随小编一起看看吧
    2023-08-08

最新评论