二,MyBatis BaseTypehandler使用

【二,MyBatis BaseTypehandler使用】当 MyBatis 将一个 Java 对象作为输入参数执行 INSERT 语句操作时,它会创建一个 PreparedStatement 对象,并且
使用 setXXX()方式对占位符设置相应的参数值。这里,XXX 可以是 Int,String,Date 等 Java 对象属性类型的任意一个。

INSERT INTO STUDENT(ID,NAME,EMAIL) VALUES(#{id},#{name},#{email})

为了执行上面的语句,mybatis会使用PreparedStatement接口,创建如下的语句
PreparedStatement pstmt = connection.prepareStatement ("INSERT INTO STUDENT(ID,NAME,EMAIL) VALUES(?,?,?)");

之后再通过pstmt.setString()的方法为该对象赋值
pstmt.setInt(1,student.getId()); pstmt.setString(2,student.getName()); .....

但 MyBatis 是怎么知道对于 Integer 类型属性使用 setInt() 和 String 类型属性使用 setString()方法呢?
其实 MyBatis 是通过使用类型处理器(type handlers)来决定这么做的。
给出一个自定义的对象类型,来存储到数据库中,示例如下:
package com.mybatis.entities; public class PhoneNumber {private String countryCode; private String stateCode; private String number; getter and setter ... }

package com.mybatis.entities; public class User {private Integer id; private String name; private String email; private PhoneNumber phone; getter and setter ... }

为PhoneNumber创建一个自定义的类型处理器
public class PhoneTypehandler extends BaseTypeHandler{@Override public void setNonNullParameter(PreparedStatement ps, int i, PhoneNumber parameter, JdbcType jdbcType) throws SQLException { // TODO Auto-generated method stub ps.setString(i, parameter.getAsString()); }@Override public PhoneNumber getNullableResult(ResultSet rs, String columnName) throws SQLException { // TODO Auto-generated method stub return new PhoneNumber(rs.getString(columnName)); }@Override public PhoneNumber getNullableResult(ResultSet rs, int columnIndex) throws SQLException { // TODO Auto-generated method stub return new PhoneNumber(rs.getString(columnIndex)); }@Override public PhoneNumber getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { // TODO Auto-generated method stub return new PhoneNumber(cs.getString(columnIndex)); }}

测试代码:
public class UserService {@Test public void insertUser(){ SqlSession session = MyBatisUtil.openSession(); UserMapper userMapper = session.getMapper(UserMapper.class); User user = new User(); user.setName("wangwu"); user.setEmail("wangwu@email.com"); PhoneNumber phone = new PhoneNumber(); phone.setCountryCode("86"); phone.setStateCode("1599"); phone.setNumber("1234567"); user.setPhone(phone); userMapper.insertUser(user); session.commit(); session.close(); } }

需要在配置文件中加入:

在配置文件中configuration中子元素配置顺序应该要符合下面的顺序,要不然会报错。
“configuration” 的内容必须匹配 “(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,plugins?,environments?,databaseIdProvider?,mappers?)”。
文件地址https://github.com/ConjaneJiang/mybatis00.git

    推荐阅读