自定义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中两者类型相同,所以修改如上所示,表类型
书写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(); //获取结束时间
%>
已经查询成功
查看日志文件,日志文件已经输出相关信息
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