二,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

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

相关文章推荐

Spring+Mybatis多数据源配置(二)——databaseIdProvider的使用

在上一篇同系列的博文中,讲到配置多数据源,然后根据config.properties配置不同的数据库,进行切换。而且需要根据不同的数据库,配置不同的mybatis sql映射配置文件,如下: ...

mybatis入门之二、使用接口interface

2.1 为何使用接口 interface 来编程**上一章用SqlSession实例来直接执行已映射的SQL语句: session.selectOne(“com.yihaomen.mybatis.m...

Mybatis 框架使用的最核心内容(二):mapper.xml中常用的标签详解

接上篇,对Mybatis的特点和映射管理介绍,本篇将详解介绍mapper.xml中的常用标签和它们各自的功能及使用方式 一、SQL语句标签: [html] view plain c...
  • KunGe_
  • KunGe_
  • 2017年11月06日 09:32
  • 30

C#:使用MVC和Mybatis(IBatis.Net)搭建项目(二)

第一步:config文件配置完成之后就该创建数据库了,不然没法进行了。 下边是数据库代码: create database BlogDemo use BlogDemo CREATE TABLE...

Mybatis 框架使用的最核心内容(二):mapper.xml中常用的标签详解

本篇将详解介绍mapper.xml中的常用标签和它们各自的功能及使用方式 一、SQL语句标签: [html] view plain copy ...

MyBatis之使用XML配置SQL映射(二)CRUD映射配置

对于不同的声明风格,MyBatis提供了多个同的参数,例如:SELECT、INSERT、UPDATE和DELETE。让我们看看这些是如何配置的。 1. 声明INSERT 我们在Mapper XML的文...

Mybatis 框架使用的最核心内容(二):mapper.xml中常用的标签详解

mybaits中的常用标签

MYBATIS的使用(二【Annation方式实现】)

上面实现了xml方式,接下来Annation方式实现。 二、Annation实现方式 1、代码结构 2、配置文件 (1)jdbc.properties #******************** ...
  • wrs1226
  • wrs1226
  • 2015年11月03日 17:39
  • 214

【系列】使用springmvc+mybatis创建Web应用(二)—— 数据库、配置和测试

上一篇文章简单地介绍了如何从零开始构建一个Spring MVC应用,如果我们仅仅需要做一些静态页面或者数据不变化的Web应用,那么其实这样就足够了。这当然是不现实的,我们的页面中的数据需要不断地变化,...

05.Mybatis初级使用-Mapper映射器(二)

Mapper映射器
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:二,MyBatis BaseTypehandler使用
举报原因:
原因补充:

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