`
bit1129
  • 浏览: 1069956 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

【持久化框架MyBatis3七】MyBatis3定义typeHandler

 
阅读更多

什么是typeHandler?

typeHandler用于将某个类型的数据映射到表的某一列上,以完成MyBatis列跟某个属性的映射

 

内置typeHandler

MyBatis内置了很多typeHandler,这写typeHandler通过org.apache.ibatis.type.TypeHandlerRegistry进行注册,比如对于日期型数据的typeHandler,

 

    register(java.sql.Date.class, new SqlDateTypeHandler());
    register(java.sql.Time.class, new SqlTimeTypeHandler());
    register(java.sql.Timestamp.class, new SqlTimestampTypeHandler());

 

 SqlDateTypeHandler的定义

 

/*
 *    Copyright 2009-2012 The MyBatis Team
 *
 *    Licensed under the Apache License, Version 2.0 (the "License");
 *    you may not use this file except in compliance with the License.
 *    You may obtain a copy of the License at
 *
 *       http://www.apache.org/licenses/LICENSE-2.0
 *
 *    Unless required by applicable law or agreed to in writing, software
 *    distributed under the License is distributed on an "AS IS" BASIS,
 *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *    See the License for the specific language governing permissions and
 *    limitations under the License.
 */
package org.apache.ibatis.type;

import java.sql.CallableStatement;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class SqlDateTypeHandler extends BaseTypeHandler<Date> {

  @Override
  public void setNonNullParameter(PreparedStatement ps, int i, Date parameter, JdbcType jdbcType)
      throws SQLException {
    ps.setDate(i, parameter); //将指定类型设置到PreparedStatement
  }

  @Override
  public Date getNullableResult(ResultSet rs, String columnName)
      throws SQLException {
    return rs.getDate(columnName);//返回结果
  }

  @Override
  public Date getNullableResult(ResultSet rs, int columnIndex)
      throws SQLException {
    return rs.getDate(columnIndex);
  }

  @Override
  public Date getNullableResult(CallableStatement cs, int columnIndex)
      throws SQLException {
    return cs.getDate(columnIndex);
  }
}

 

举例:

  

package com.mybatis3.domain;

import java.io.Serializable;

/**
 * @author Siva
 *
 */
public class PhoneNumber  implements Serializable
{
	private static final long serialVersionUID = 1L;
	
	private String countryCode;
	private String stateCode;
	private String number;
	
	public PhoneNumber() {
	}

	public PhoneNumber(String countryCode, String stateCode, String number) {
		super();
		this.countryCode = countryCode;
		this.stateCode = stateCode;
		this.number = number;
	}

	public PhoneNumber(String string) {
		if(string != null){
			String[] parts = string.split("-");
			if(parts.length>0) this.countryCode=parts[0];
			if(parts.length>1) this.stateCode=parts[1];
			if(parts.length>2) this.number=parts[2];
			
		}
	}
	
	@Override
	public String toString() {
		return this.getAsString();
	}

	public String getAsString() {
		return countryCode+"-"+stateCode+"-"+number;
	}
	
	public String getCountryCode() {
		return countryCode;
	}

	public void setCountryCode(String countryCode) {
		this.countryCode = countryCode;
	}

	public String getStateCode() {
		return stateCode;
	}

	public void setStateCode(String stateCode) {
		this.stateCode = stateCode;
	}

	public String getNumber() {
		return number;
	}

	public void setNumber(String number) {
		this.number = number;
	}
	
}

 

 

package com.mybatis3.domain;

import java.io.Serializable;

/**
 * @author Siva
 *
 */
public class Student implements Serializable
{
	private static final long serialVersionUID = 1L;
	private Integer studId;
	private String name;
	private String email;
	private PhoneNumber phone;
	private Address address;
	
	@Override
	public String toString() {
		return "Student [studId=" + studId + ", name=" + name + ", email=" + email
				+ ", phone=" + (phone==null?null:phone.getAsString()) + ", address=" + address + "]";
	}
	public Student()
	{
	}
	public Student(Integer id)
	{
		this.studId = id;
	}
	public Integer getStudId()
	{
		return studId;
	}
	public void setStudId(Integer id)
	{
		this.studId = id;
	}
	public String getName()
	{
		return name;
	}
	public void setName(String name)
	{
		this.name = name;
	}
	public String getEmail()
	{
		return email;
	}
	public void setEmail(String email)
	{
		this.email = email;
	}
	public Address getAddress() {
		return address;
	}
	public void setAddress(Address address) {
		this.address = address;
	}
	public PhoneNumber getPhone() {
		return phone;
	}
	public void setPhone(PhoneNumber phone) {
		this.phone = phone;
	}
	
}

 

Student的phone属性是PhoneNumber类型,而在数据表中,phone属性对应的字段是String类型,这就需要注册一个typeHandler,实现Student对象持久化到数据库表中时,将PhoneNumber对象转换为字符串,而在读取数据库时,将String类型的phone信息反序列化为PhoneNumber对象

 

PhoneNumberTypeHandler

 

package com.mybatis3.typehandlers;

import com.mybatis3.domain.PhoneNumber;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * @author Siva
 *
 */
public class PhoneTypeHandler extends BaseTypeHandler<PhoneNumber>{

	@Override
	public void setNonNullParameter(PreparedStatement ps, int i,
			PhoneNumber parameter, JdbcType jdbcType) throws SQLException {
		ps.setString(i, parameter.getAsString());//将PhoneNumber序列化为字符串,持久化到数据库中
	}

	@Override
	public PhoneNumber getNullableResult(ResultSet rs, String columnName)
			throws SQLException {
		return new PhoneNumber(rs.getString(columnName)); //根据列名,从数据库中读取字符串,反序列化为PhoneNumber对象
	}

	@Override
	public PhoneNumber getNullableResult(ResultSet rs, int columnIndex)
			throws SQLException {
		return new PhoneNumber(rs.getString(columnIndex));
	}

	@Override
	public PhoneNumber getNullableResult(CallableStatement cs, int columnIndex)
			throws SQLException {
		return new PhoneNumber(cs.getString(columnIndex));///根据列的序号,从数据库中读取字符串,反序列化为PhoneNumber对象
	}

}

 

主配置文件

	<typeHandlers>
		<typeHandler handler="com.mybatis3.typehandlers.PhoneTypeHandler" />
	</typeHandlers>

 

SQL映射

    <insert id="insertStudent" parameterType="Student" useGeneratedKeys="true" keyProperty="studId">
  		insert into STUDENTS(name,email,addr_id, phone)
  		values(#{name},#{email},#{address.addrId},#{phone})<!--#{phone}是字符串类型,根据typeHandler的转换规则,提供符合规则的phone字符串-->
    </insert>

 

测试代码

 

	public void testCreateStudentWithMap() 
	{
		Map<String, Object> studMap = new HashMap<String, Object>();
		long ts = System.currentTimeMillis();
		studMap.put("name","stud_"+ts);
		studMap.put("email","stud_"+ts+"@gmail.com");
		studMap.put("phone","123-456-789");
		studentService.createStudentWithMap(studMap);
	}

 

 

分享到:
评论

相关推荐

    mybatis3.x源码深度解析与最佳实践.pdf

    TypeHandler 是 MyBatis 中的类型处理器,该对象负责将 Java 对象转换成 SQL 语句中可用的类型。 3.6 对象包装器工厂 对象包装器工厂是 MyBatis 中的核心对象之一,该对象负责将 Java 对象转换成 SQL 语句中可用的...

    mybatis-3-mybatis-3.2.6

    MyBatis是一个优秀的Java持久层框架,它支持定制化SQL、存储过程以及高级映射。在深入探讨MyBatis 3.2.6版本的源码之前,我们首先需要了解MyBatis的基本概念和功能。 MyBatis的核心部分主要包括SqlSessionFactory、...

    mybatis3文档

    MyBatis3是一款轻量级的Java持久层框架,它实现了SQL映射功能,使得开发者可以直接编写SQL语句,同时又不失对象与关系数据库之间的...通过仔细阅读和实践,开发者可以熟练地运用MyBatis3进行数据持久化,提升开发效率。

    Typehandler mybatis

    MyBatis 是一款著名的 Java 持久层框架,它简化了数据库操作,将 SQL 查询与 Java 代码紧密结合。在 MyBatis 中,TypeHandler 起着至关重要的作用,它是 MyBatis 中处理 Java 类型与 JDBC 类型之间转换的桥梁。了解...

    mybatis-3-mybatis-3.5.8.zip源码

    MyBatis是一个优秀的Java持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解进行配置和原始映射,将接口和Java的...

    MyBatis3用户指南中文版

    MyBatis3是一款深受开发者喜爱的持久层框架,它简化了Java应用与数据库之间的交互,提供了灵活的SQL映射机制和强大的事务管理。本指南旨在深入解析MyBatis3的各项功能,帮助开发者更好地理解和运用这一工具。 ...

    mybatis3 源码

    MyBatis3是一款知名的Java持久层框架,它简化了数据库操作与对象之间的映射工作,提供了灵活的SQL构建和执行机制。深入理解MyBatis3的源码有助于开发者更好地掌握其内部工作原理,提高开发效率,并能进行定制化的...

    MyBatis自定义typeHandler的完整实例

    MyBatis是一个基于Java的持久层框架,提供了强大的数据持久化功能,而TypeHandler是MyBatis中一个非常重要的组件,负责将Java类型转换为数据库类型,反之亦然。在实际开发中,我们常常需要根据业务需求自定义Type...

    Mybatis系列教程自定义持久层框架共15页.pdf.z

    9. **自定义类型处理器**:如果需要处理Mybatis默认不支持的数据类型,可以编写自定义的TypeHandler,使Mybatis能正确地序列化和反序列化这些类型。 10. **SqlSession管理**:在自定义持久层框架中,对SqlSession的...

    mybatis-3-mybatis-3.5.7.tar.gz

    MyBatis是一个优秀的Java持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解进行配置和原始映射,将接口和Java的...

    mybatis-3.5.9 源码(mybatis-3-mybatis-3.5.9.tar.gz)

    MyBatis 是一款著名的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使你更好地将关注点集中在你的应用程序上。通过提供一个...

    mybatis-3.5.9 源码(mybatis-3-mybatis-3.5.9.zip)

    MyBatis 是一款著名的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使你更好地专注于使用 SQL 来编写业务逻辑,而不需要...

    mybatis-3-mybatis-3.4.5.rar

    MyBatis是一个优秀的Java持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解来配置和映射原生信息,将接口和Java...

    后端开发框架 MyBatis四大核心对象之ParameterHandler.pdf

    - 如果参数对象本身可以直接通过TypeHandler转换为JDBC类型,则直接使用参数对象。 - 如果参数对象是一个复杂的对象,则通过MetaObject获取其属性值。 - 如果参数对象为空,则设置参数值为null。 5. **类型处理*...

    Mybatis源码分析.pdf

    MyBatis是一款优秀的持久层框架,它的源码分析对于深入理解其工作原理和优化数据库操作至关重要。MyBatis的核心设计理念是简化SQL操作,通过XML或注解的方式将SQL与Java代码分离,同时提供强大的动态SQL功能。 首先...

    mybatis3源码

    MyBatis3是一款著名的Java持久层框架,它简化了数据库操作并与对象映射相结合,使得开发者可以更加专注于SQL语句的编写,而无需处理繁琐的JDBC代码。本篇文章将深入探讨MyBatis3的核心概念、设计模式以及关键源码。 ...

    mybatis-3-mybatis-3.4.5 源码

    MyBatis是一个优秀的Java持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解进行配置和原始映射,将接口和Java的...

    mybatis3.x源码包中文注释版.zip

    MyBatis 是一款著名的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使你更好地将关注点集中在你的应用程序上。通过 XML 或...

    mybatis-3-mybatis-3.4.1源码

    MyBatis是一个优秀的Java持久层框架,它支持定制化SQL、存储过程以及高级映射。在深入探讨MyBatis 3.4.1的源码之前,先了解一下MyBatis的基本概念和工作原理。 MyBatis的核心是SqlSessionFactory,它是通过...

Global site tag (gtag.js) - Google Analytics