这篇文章主要讲解了“mybatis TypeHandler注入spring依赖的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“mybatis 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中定义了很多默认的类型处理器,将sql语句中的值转化成JDBC的类型,以及将结果集中的值转化为字段类型的值,详情可见官网默认的TypeHandler,但是有的时候我们并不想用官网的TypeHandler的时候,自定义的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);
}
}
有两种方式配置,一种就是直接,再配置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>
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());
}
});
}
}
感谢各位的阅读,以上就是“mybatis TypeHandler注入spring依赖的方法是什么”的内容了,经过本文的学习后,相信大家对mybatis TypeHandler注入spring依赖的方法是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。