mybatis TypeHandler注入spring的依赖方式

网友投稿 531 2022-08-31


mybatis TypeHandler注入spring的依赖方式

目录TypeHandler注入spring的依赖解决方法mybatis扩展:自定义TypeHandler1、编写自定义TypeHandler2、配置TypeHandler3、测试4、项目结构图

TypeHandler注入spring的依赖

解决方法

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

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

mybatis扩展:自定义TypeHandler

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

1、编写自定义TypeHandler

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

默认的JDBC类型,然后让这个类继承BaseHandler,泛型类型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 {

/**

* 对设置的值进行处理

* @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、http://配置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 Varcharhttp://TypeHandler()});

} catch (IOException e) {

e.printStackTrace();

}

return sqlSessionFactoryBean;

}

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

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}

)

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() {

public void accept(User i) {

//打印用户名和密码

System.out.println(i.getUsername() +" ======> "+i.getPassword());

}

});

}

}

4、项目结构图


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Django(part27)--聚合查询(django 分组聚合)
下一篇:Django(part34)--一对多映射(django映射数据库)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~