1.1 typeHandlers类型转换器
每当MyBatis 设置参数到PreparedStatement 或者从ResultSet 结果集中取得值时,就会使用TypeHandler 来处理数据库类型与java 类型之间转换。下表描述了默认
TypeHandlers
1.1.1 自定义类型转换器
假设表中字段是int类型,而实体类与之对应的属性是boolean类型,此时可以采用自定义类型转换器进行对应
(1)实体类
1 package com.chenyanbin.beans; 2 3 public class Dept { 4 private Integer deptNo; 5 private String dname; 6 private String loc; 7 private boolean flag; 8 public Integer getDeptNo() { 9 return deptNo; 10 } 11 public boolean isFlag() { 12 return flag; 13 } 14 public void setFlag(boolean flag) { 15 this.flag = flag; 16 } 17 public void setDeptNo(Integer deptNo) { 18 this.deptNo = deptNo; 19 } 20 public String getDname() { 21 return dname; 22 } 23 public void setDname(String dname) { 24 this.dname = dname; 25 } 26 public String getLoc() { 27 return loc; 28 } 29 public void setLoc(String loc) { 30 this.loc = loc; 31 } 32 }
(2) 表中字段
(3) 开发自定义类型转换器:MyTypeHandler.java
继承并实现接口:TypeHandler.java
1 package com.chenyanbin.util; 2 3 import java.sql.CallableStatement; 4 import java.sql.PreparedStatement; 5 import java.sql.ResultSet; 6 import java.sql.SQLException; 7 8 import org.apache.ibatis.jdbc.Null; 9 import org.apache.ibatis.type.JdbcType; 10 import org.apache.ibatis.type.TypeHandler; 11 /* 12 * setParameter:这个方法在生成SQL语句时才被调用 13 * 14 * getResult:查询结束之后,在将ResultSet数据行转换为实体类对象时,通知TypeHandler将当前数据行某个字段转换为何种类型 15 * 16 * 17 */ 18 public class MyTypeHandler implements TypeHandler { 19 20 public void setParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException { 21 if (parameter==null) { //dept.flag=null insertsql flag设置0 22 ps.setInt(i, 0); 23 return; 24 } 25 Boolean flag=(Boolean)parameter; 26 if (flag==true) { 27 ps.setInt(i, 1); 28 } 29 else { 30 ps.setInt(i, 0); 31 } 32 } 33 34 public Object getResult(ResultSet rs, String columnName) throws SQLException { 35 int flag = rs.getInt(columnName); //1 or 0 36 Boolean myFlag=Boolean.FALSE; 37 if (flag==1) { 38 myFlag=Boolean.TRUE; 39 } 40 return myFlag; 41 } 42 43 public Object getResult(ResultSet rs, int columnIndex) throws SQLException { 44 // TODO Auto-generated method stub 45 return null; 46 } 47 48 public Object getResult(CallableStatement cs, int columnIndex) throws SQLException { 49 // TODO Auto-generated method stub 50 return null; 51 } 52 53 }
(4) 在MyBatis核心配置文件注册自定义类型转换器:
myBatis-config.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE configuration 3 PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-config.dtd"> 5 <configuration> 6 <!-- 属性配置 --> 7 <properties resource="config.properties"></properties> 8 <!-- 别名配置 --> 9 <typeAliases> 10 <package name="com.chenyanbin.beans" /> 11 <package name="com.chenyanbin.dao" /> 12 </typeAliases> 13 <!-- 类型处理器 --> 14 <typeHandlers> 15 <!-- 从java中的Boolean转jdbc中的NUMERIC --> 16 <typeHandler handler="com.chenyanbin.util.MyTypeHandler" 17 javaType="Boolean" jdbcType="NUMERIC" /> 18 </typeHandlers> 19 <!-- 环境配置 --> 20 <environments default="development"> 21 <!-- 环境配置 --> 22 <environment id="development"> 23 <!-- 事务管理器 --> 24 <transactionManager type="JDBC"></transactionManager> 25 <!-- 数据源 --> 26 <dataSource type="pooled"> 27 <property name="driver" value="${jdbc.driver}" /> 28 <property name="url" value="${jdbc.url}" /> 29 <property name="username" value="${jdbc.username}" /> 30 <property name="password" value="${jdbc.password}" /> 31 </dataSource> 32 </environment> 33 </environments> 34 <!-- 映射器 --> 35 <mappers> 36 <package name="com.chenyanbin.dao" /> 37 </mappers> 38 </configuration>
config.properties
1 jdbc.driver=com.mysql.jdbc.Driver 2 jdbc.url=jdbc:mysql://localhost:3306/sam 3 jdbc.username=root 4 jdbc.password=root
(5) 创建接口:DeptMapper.java
1 package com.chenyanbin.dao; 2 3 import java.util.List; 4 import com.chenyanbin.beans.Dept; 5 6 public interface DeptMapper { 7 public void deptSave(Dept dept); 8 9 public List<Dept> deptFind(); 10 }
(6) DeptMapper.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE mapper 3 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 5 <mapper namespace="com.chenyanbin.dao.DeptMapper"> 6 <insert id="deptSave"> 7 insert into dept (DEPTNO,DNAME,LOC,flag) 8 values(#{deptNo},#{dname},#{loc},#{flag}) 9 </insert> 10 <select id="deptFind" resultType="Dept"> 11 select deptNo,dname,loc,flag from dept 12 </select> 13 </mapper>
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE configuration 3 PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-config.dtd"> 5 <configuration> 6 <!-- 属性配置 --> 7 <properties resource="config.properties"></properties> 8 <!-- 别名配置 --> 9 <typeAliases> 10 <package name="com.chenyanbin.beans" /> 11 <package name="com.chenyanbin.dao" /> 12 </typeAliases> 13 <!-- 环境配置 --> 14 <environments default="development"> 15 <!-- 环境配置 --> 16 <environment > 17 <!-- 事务管理器 --> 18 <transactionManager type="JDBC"></transactionManager> 19 <!-- 数据源 --> 20 <dataSource type="pooled"> 21 <property name="driver" value="${jdbc.driver}" /> 22 <property name="url" value="${jdbc.url}" /> 23 <property name="username" value="${jdbc.username}" /> 24 <property name="password" value="${jdbc.password}" /> 25 </dataSource> 26 </environment> 27 </environments> 28 <!-- 映射器 --> 29 <mappers> 30 <package name="com.chenyanbin.dao" /> 31 </mappers> 32 </configuration>