mybatis 传入数字字符串被强转成int_MyBatis 自定义 typeHandler

当MyBatis在处理数据库查询时,如果传入的参数是数字字符串,可能会被默认转换为int,导致错误。解决方法是自定义TypeHandler。本文介绍了如何创建并注册自定义的TypeHandler,以确保 VARCHAR 类型的数据库字段能正确映射为 Java 的 String 类型。示例代码包括处理类的编写、配置文件的更新以及映射文件的修改。通过这个方法,可以避免因类型不匹配引发的问题。
摘要由CSDN通过智能技术生成

自定义typeHandler

对于自定义typeHandler来说,需要在配置文件中注册typeHandlers 然后需要实现TypeHandler接口,

一个例子

首先编写调度的处理类

package com.ming.MyBatis;import org.apache.ibatis.type.JdbcType;import org.apache.ibatis.type.TypeHandler;import org.apache.logging.log4j.LogManager;import org.apache.logging.log4j.Logger;import java.sql.CallableStatement;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;public class StringTypeHandler implements TypeHandler { private static Logger logger = LogManager.getLogger(); /** * 对预编译的Sql语句进行设置的时候, * @param ps * @param i * @param parameter * @param jdbcType * @throws SQLException */ @Override public void setParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException { logger.info("使用TypeHandler"); // 设置预编译的sql对象,的string ps.setString(i, parameter); } /** * 获得结果的时候,获取到列名的时候,调度此方法 * @param rs * @param columnName * @return * @throws SQLException */ @Override public String getResult(ResultSet rs, String columnName) throws SQLException { logger.info("使用自定义类型,结果获取列名字符串"); return rs.getString(columnName); } /** * 获取结果集中的index * @param rs * @param columnIndex * @return * @throws SQLException */ @Override public String getResult(ResultSet rs, int columnIndex) throws SQLException { logger.info("在结果集中获取columnIndex"); return rs.getString(columnIndex); } /** * 获取结果集中的下标对应的字符串 * @param cs * @param columnIndex * @return * @throws SQLException */ @Override public String getResult(CallableStatement cs, int columnIndex) throws SQLException { logger.info("结果集中,下标获取到字符串"); return cs.getString(columnIndex); }}

再次编写配置文件

传入数据库的为的VARCHAR类型,javaType类型为string类型,调度的类为com.ming.MyBatis.StringTypeHandler

修改映射文件,说明那些需要对结果进行修改

<?xml version="1.0" encoding="UTF-8" ?>SELECT id, role_name, note FROM t_role4 WHERE id = #{id}

其中传入的参数为int类型,由于结果中mybatis没有int类型,对应的是INTEGER类型,在mysql中两者类型相同,所以修改如上所示,表类型

2e204b7ceed1f96b88d31d8660160dbb.png

书写index.jsp

Hello World!

long startTime = System.currentTimeMillis(); //获取开始时间

SqlSession sqlSession = null;

Role role = null;

for(int i = 0; i < 10; i++) {

try {

sqlSession = SqlSessionFactoryUtil.openSqlSesion();

RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);

role = roleMapper.getRole(100);

sqlSession.commit();

} catch (Exception e) {

e.printStackTrace();

sqlSession.rollback();

} finally {

if (sqlSession != null) {

sqlSession.close();

}

}

}

long endTime = System.currentTimeMillis(); //获取结束时间

%>

已经查询成功

c79d899bfb47abbc1a7fc139e4b3c13e.png

查看日志文件,日志文件已经输出相关信息

2019-04-13 05:03:33.181 [DEBUG] org.apache.ibatis.transaction.jdbc.JdbcTransaction.openConnection(JdbcTransaction.java:136) - Opening JDBC Connection2019-04-13 05:03:33.181 [DEBUG] org.apache.ibatis.datasource.pooled.PooledDataSource.popConnection(PooledDataSource.java:397) - Checked out connection 197673257 from pool.2019-04-13 05:03:33.182 [DEBUG] org.apache.ibatis.transaction.jdbc.JdbcTransaction.setDesiredAutoCommit(JdbcTransaction.java:100) - Setting autocommit to false on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@bc84129]2019-04-13 05:03:33.235 [DEBUG] org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:143) - ==> Preparing: SELECT id, role_name, note FROM t_role4 WHERE id = ? 2019-04-13 05:03:33.236 [DEBUG] org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:143) - ==> Parameters: 100(Integer)2019-04-13 05:03:33.275 [INFO ] com.ming.MyBatis.StringTypeHandler.getResu
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值