二,MyBatis BaseTypehandler使用

原创 2016年08月29日 16:57:39

当 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();
    }
}

需要在配置文件中加入:

    <typeHandlers>
        <typeHandler handler="com.mybatis.typehandlers.PhoneTypehandler"/>
    </typeHandlers>

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

关于mybatis中typeHandler的两个案例

在做开发时,我们经常会遇到这样一些问题,比如我有一个Java中的Date数据类型,我想将之存到数据库的时候存成一个1970年至今的毫秒数,怎么实现?再比如我有一个User类,User类中有一个属性叫做...
  • u012702547
  • u012702547
  • 2017年02月08日 22:28
  • 13152

Mybatis类型转换TypeHandler介绍

1.1     目录 1.2     建立TypeHandler 1.2.1    TypeHandler接口 1.2.2    BaseTypeHandler抽象类 1.3     注册Ty...
  • yuolligeng
  • yuolligeng
  • 2015年09月23日 18:53
  • 6847

关于mybatis中typeHandler的两个案例

在做开发时,我们经常会遇到这样一些问题,比如我有一个Java中的Date数据类型,我想将之存到数据库的时候存成一个1970年至今的毫秒数,怎么实现?再比如我有一个User类,User类中有一个属性叫做...
  • weinichendian
  • weinichendian
  • 2017年06月07日 16:28
  • 436

mybatis学习笔记--typehandler自定义类型转换

原文地址:http://www.360doc.com/content/12/0428/00/1542811_207167041.shtml 有这样一个需求: 有一个布尔型的字段需要保存到数据库中...
  • nich002
  • nich002
  • 2013年04月23日 15:43
  • 3438

Mybatis 示例之 TypeHandler

关于TypeHandler的基础内容可以参考官方中文文档: http://mybatis.github.io/mybatis-3/zh/configuration.html#typeHandler...
  • isea533
  • isea533
  • 2015年02月28日 16:34
  • 28721

spring+mybatis中typehandler怎么配置

我们在不使用spring来管理的时候通常把typehandler的配置放到mybatis-config.xml中,如下: ...
  • zhaoyf7746
  • zhaoyf7746
  • 2017年05月03日 17:55
  • 1274

MyBatis_typeHandlers

typeHandlers是类型处理器,每当SQL的PreparedStatement设置值或者从一个 结果集中取得某个值的时候,都需要通过typeHandlers进行处理,mybatis有自己的一些...
  • dearday
  • dearday
  • 2013年07月24日 20:51
  • 1684

二,MyBatis BaseTypehandler使用

当 MyBatis 将一个 Java 对象作为输入参数执行 INSERT 语句操作时,它会创建一个 PreparedStatement 对象,并且 使用 setXXX()方式对占位符设置相应的参数值...
  • u010871004
  • u010871004
  • 2016年08月29日 16:57
  • 379

mybatis源码之BaseStatementHandler

/** * @author Clinton Begin */ public abstract class BaseStatementHandler implements StatementHand...
  • qq924862077
  • qq924862077
  • 2016年01月07日 20:08
  • 1064

Spring整合MyBatis后引入自定义类型转化器TypeHandler

MyBatis预定义了许多类型转化器,并不一定能满足所有的需求,如笔者遇到这么个问题:数据库字段类型为datetime时间戳类型,项目组规定ResultMap映射实体时间必须是String类型,MyB...
  • u014513883
  • u014513883
  • 2017年03月27日 08:52
  • 999
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:二,MyBatis BaseTypehandler使用
举报原因:
原因补充:

(最多只允许输入30个字)