二,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 BaseTypehandler使用

当 MyBatis 将一个 Java 对象作为输入参数执行 INSERT 语句操作时,它会创建一个 PreparedStatement 对象,并且 使用 setXXX()方式对占位符设置相应的参数值...

MYBATIS的使用(一【xml方式实现】)

自MYBATIS从BATIS奔向Google后,一直在蜕化,大方向实现分xml和注解Annation。接下来分别为初学者推出xml和注解Annation两种Demo。 一、第一种实现方式:xml 1...

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

Mybatis类型转换

Mybatis类型转换 1.1     目录 1.2     建立TypeHandler 1.2.1    TypeHandler接口 1.2.2  ...

Mybatis Generator插件的手动安装及插件的使用

MyBatis Generator(MBG)是通过一个XML配置文件驱动的。配置文件告诉MBG: 如何连接数据库 什么表应该用于对象生成 要生成什么对象,以及如何生成它们

mybatis入门使用1:mybatis框架搭建和增删改查

一、mybatis简单介绍      MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架,为ibatis的升级版。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及...

MyBatis(二) 使用MyBatis改写及SqlSession

MyBatis中的SqlSession 作用: 1.向SQL语句传入参数 2.执行SQL语句 3.获取执行SQL语句的结果 4.事务的控制 获取SqlSession 1.通过配置文件获取数据库...

使用Redis做MyBatis的二级缓存

转载地址:  http://www.cnblogs.com/springlight/p/6374372.html 1. 介绍   使用mybatis时可以使用二级缓存提高查询速度,进而改善用户体验...

mybatis常见问题处理:批量操作,传递多个参数,like语句写法等等

mybatis常见问题处理:批量操作,传递多个参数,like语句写法等等

Mybatis的ResultMap的使用

本篇文章通过一个实际工作中遇到的例子开始吧:  工程使用Spring+Mybatis+Mysql开发。具体的业务逻辑很重,对象之间一层一层的嵌套。和数据库表对应的是大量的model类,而和前端交...

Mybatis 示例之 SelectKey

SelectKey在Mybatis中是为了解决Insert数据时不支持主键自动生成的问题,他可以很随意的设置生成主键的方式。 不管SelectKey有多好,尽量不要遇到这种情况吧,毕竟很麻烦。 ...
  • hj7jay
  • hj7jay
  • 2016-03-17 11:11
  • 1029
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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