typeHandler作用:
1.传参时将javaType类型转换成jdbcType
2.结果集中ResultSet中取值时,jdbcType转换为javaType;
系统自定义的typeHandler:
mybatis系统内部定义了一系列的typeHandler;基本涵盖了我们正常使用的类型转换;如下

选取一个系统自定义的typeHandler看看;
在包org.apache.ibatis.type下有一个StringTypeHandler.java
源码如下:
View Code
StringTypeHandler继承了BaseTypeHandler;而BaseTypeHandler实现了接口TypeHandler,
BaseTypeHandler中代码
View Code
getResult分别用columnName和columnIndex从ResultSet中获取数据,CallableStatement表示从存储过程中获取结果及数据的方法;
下面我们创建自定义typeHandler

RoleMapper.java
View Code
Role.java
View Code
SqlSessionFactoryUtil.java
View Code
log4j.properties
log4j.rootLogger=debug,stdout log4j.logger.org.mybatis=debug log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%5p %d %C:%m%n
mybatis-config.xml
1 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> 2 <configuration> 3 <typeHandlers> 4 <typeHandler handler="com.learn.charter2.util.MyStringTypeHandler" javaType="string" jdbcType="VARCHAR"/> 5 <typeHandler handler="com.learn.charter2.util.MyIntergerTypeHandler" javaType="int" jdbcType="VARCHAR"/> 6 </typeHandlers> 7 <environments default="development"> 8 <environment id="development"> 9 <transactionManager type="JDBC"> 10 <property name="autoCommit" value="false" /> 11 </transactionManager> 12 <dataSource type="POOLED"> 13 <property name="driver" value="com.mysql.jdbc.Driver" /> 14 <property name="url" value="jdbc:mysql://localhost:3306/mybatis" /> 15 <property name="username" value="root" /> 16 <property name="password" value="gys" /> 17 </dataSource> 18 </environment> 19 </environments> 20 <mappers> 21 <mapper resource="com/learn/charter2/mapper/roleMapper.xml" /> 22 </mappers> 23 </configuration>
roleMapper.xml
1 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
2 <mapper namespace="com.learn.charter2.mapper.RoleMapper">
3
4 <resultMap type="com.learn.charter2.po.Role" id="roleMap">
5 <id column="id" property="id" javaType="long" jdbcType="BIGINT"/>
6 <result column="role_name" property="roleName" javaType="string" jdbcType="VARCHAR"/>
7 <result column="note" property="note" typeHandler="com.learn.charter2.util.MyStringTypeHandler"/>
8 <result column="pk" property="pk" typeHandler="com.learn.charter2.util.MyIntergerTypeHandler"/>
9 </resultMap>
10
11
12 <select id="getRole" parameterType="long" resultMap="roleMap">
13 select id,role_name as roleName,note from t_role where id=#{id}
14 </select>
15
16 <select id="findRole" parameterType="com.learn.charter2.po.Role" resultMap="roleMap">
17 select id,role_name as roleName,note,pk from t_role
18 <where>
19 <if test="roleName !=null">
20 role_name like concat('%',#{roleName,javaType=string,jdbcType=VARCHAR,typeHandler=com.learn.charter2.util.MyStringTypeHandler},'%')
21 </if>
22 <if test="pk !=null">
23 and pk =#{pk,javaType=int,jdbcType=VARCHAR,typeHandler=com.learn.charter2.util.MyIntergerTypeHandler}
24 </if>
25 </where>
26
27
28 </select>
29
30 <insert id="insertRole" parameterType="com.learn.charter2.po.Role">
31 insert into t_role
32 (role_name,note)
33 values
34 (#{roleName},#{note})
35 </insert>
36 <delete id="deleteRole" parameterType="long">
37 delete from t_role where id=#{id}
38 </delete>
39 </mapper>
MyIntergerTypeHandler.java
1 package com.learn.charter2.util;
2
3
4 import java.sql.CallableStatement;
5 import java.sql.PreparedStatement;
6 import java.sql.ResultSet;
7 import java.sql.SQLException;
8
9 import org.apache.ibatis.type.JdbcType;
10 import org.apache.ibatis.type.MappedJdbcTypes;
11 import org.apache.ibatis.type.MappedTypes;
12 import org.apache.ibatis.type.TypeHandler;
13 import org.apache.log4j.Logger;
14
15 import sun.security.action.GetIntegerAction;
16
17
18 /**
19 * @MappedTypes({Integer.class})
20 @MappedJdbcTypes(JdbcType.VARCHAR)
21 *
22 */
23 public class MyIntergerTypeHandler implements TypeHandler<Integer> {
24
25 private Logger log=Logger.getLogger(MyIntergerTypeHandler.class);
26
27 private int getInt(String v){
28 if("a".equals(v)){
29 return 10;
30 }else if("b".equals(v)){
31 return 20;
32 }else if("c".equals(v)){
33 return 30;
34 }else{
35 return 60;
36 }
37 }
38 @Override
39 public Integer getResult(CallableStatement cs, int index)
40 throws SQLException {
41 log.info("使用我的IntegerTypeHandler,CallbleStatment下表获取字符串");
42 return getInt(cs.getString(index));
43 }
44
45 @Override
46 public Integer getResult(ResultSet rs, int index) throws SQLException {
47 log.info("使用我的IntegerTypeHandler,ResultSet下标获取字符串");
48 return getInt(rs.getString(index));
49 }
50
51 @Override
52 public Integer getResult(ResultSet rs, String colName) throws SQLException {
53 log.info("使用我的IntegerTypeHandler,ResultSet 列名获取字符串");
54 return getInt(rs.getString(colName));
55 }
56
57 @Override
58 public void setParameter(PreparedStatement ps, int index, Integer value,JdbcType jt) throws SQLException {
59 log.info("使用我的IntegerTypeHandler==index:"+index+";value:"+value);
60 String v="";
61 if(value==1){
62 v="a";
63 }else if(value==2){
64 v="b";
65 }else if(value==3){
66 v="c";
67 }else {
68 v="guoyansi";
69 }
70 ps.setString(index, v);
71 }
72 }
MyStringTypeHandler.java
1 package com.learn.charter2.util;
2
3
4 import java.sql.CallableStatement;
5 import java.sql.PreparedStatement;
6 import java.sql.ResultSet;
7 import java.sql.SQLException;
8
9 import org.apache.ibatis.type.JdbcType;
10 import org.apache.ibatis.type.MappedJdbcTypes;
11 import org.apache.ibatis.type.MappedTypes;
12 import org.apache.ibatis.type.TypeHandler;
13 import org.apache.log4j.Logger;
14
15
16 @MappedTypes({String.class})
17 @MappedJdbcTypes(JdbcType.INTEGER)
18 public class MyStringTypeHandler implements TypeHandler<String> {
19 private Logger log=Logger.getLogger(MyStringTypeHandler.class);
20
21 @Override
22 public String getResult(CallableStatement cs, int index)
23 throws SQLException {
24 log.info("使用我的StringTypeHandler,CallbleStatment下表获取字符串");
25 return cs.getString(index);
26 }
27
28 @Override
29 public String getResult(ResultSet rs, int index) throws SQLException {
30 log.info("使用我的StringTypeHandler,ResultSet下标获取字符串");
31 return rs.getString(index);
32 }
33
34 @Override
35 public String getResult(ResultSet rs, String colName) throws SQLException {
36 log.info("使用我的StringTypeHandler,ResultSet 列名获取字符串");
37 return rs.getString(colName);
38 }
39
40 @Override
41 public void setParameter(PreparedStatement ps, int index, String value,
42 JdbcType jt) throws SQLException {
43 value=value+"m";
44 log.info("使用我的StringTypeHandler==index:"+index+";value:"+value);
45 ps.setString(index, value);
46 }
47
48
49 }
Charter2Main.java
1 package com.learn.charter2.main;
2
3 import java.util.List;
4
5 import org.apache.ibatis.session.SqlSession;
6
7 import com.learn.charter2.mapper.RoleMapper;
8 import com.learn.charter2.po.Role;
9 import com.learn.charter2.util.SqlSessionFactoryUtil;
10
11 public class Charter2Main {
12 public static void main(String[] args) {
13 SqlSession sqlSession = null;
14 try {
15 sqlSession = SqlSessionFactoryUtil.openSqlSession();
16 RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);
17 Role role = new Role();
18 role.setPk(10);
19 List<Role> list=roleMapper.findRole(role);
20 for(Role r:list){
21 System.out.println("id:"+r.getId()+";roleName:"+r.getRoleName()+";note:"+r.getNote()+";pk:"+r.getPk());
22 }
23 } catch (Exception e) {
24 System.err.println(e.getMessage());
25 sqlSession.rollback();
26 }finally{
27 if(sqlSession!=null){
28 sqlSession.close();
29 }
30 }
31 }
32
33 }
自定义typeHandler的三个步骤:
1.定义typeHandler(MyIntergerTypeHandler.java MyStringTypeHandler.java)
2.配置typeHandler(mybatis-config.xml中3-6行)
3.指定入参中哪个字段使用typeHandler(mapper.xml中19-24行)
4.指定出参中哪个字段使用typeHandler(mapper.xml中7-8行)
以MyIntergerTypeHandler为例,运行一下Charter2Main.java

Charter2Main 中传入的pk参数是10,被typeHandler默默的转换成了guoyansi; 因为guoyansi在数据库中找到了值,在被返回到java中,guoyansi又被typeHandler转化成了60; 这个例子展示的就是Integer和String之间的转换。
MyBatis自定义TypeHandler
本文介绍MyBatis框架中自定义TypeHandler的方法及其应用案例。通过定义和配置TypeHandler,实现Java类型与数据库类型之间的转换。
7115

被折叠的 条评论
为什么被折叠?



