什么是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); }
相关推荐
TypeHandler 是 MyBatis 中的类型处理器,该对象负责将 Java 对象转换成 SQL 语句中可用的类型。 3.6 对象包装器工厂 对象包装器工厂是 MyBatis 中的核心对象之一,该对象负责将 Java 对象转换成 SQL 语句中可用的...
MyBatis是一个优秀的Java持久层框架,它支持定制化SQL、存储过程以及高级映射。在深入探讨MyBatis 3.2.6版本的源码之前,我们首先需要了解MyBatis的基本概念和功能。 MyBatis的核心部分主要包括SqlSessionFactory、...
MyBatis3是一款轻量级的Java持久层框架,它实现了SQL映射功能,使得开发者可以直接编写SQL语句,同时又不失对象与关系数据库之间的...通过仔细阅读和实践,开发者可以熟练地运用MyBatis3进行数据持久化,提升开发效率。
MyBatis 是一款著名的 Java 持久层框架,它简化了数据库操作,将 SQL 查询与 Java 代码紧密结合。在 MyBatis 中,TypeHandler 起着至关重要的作用,它是 MyBatis 中处理 Java 类型与 JDBC 类型之间转换的桥梁。了解...
MyBatis3是一款深受开发者喜爱的持久层框架,它简化了Java应用与数据库之间的交互,提供了灵活的SQL映射机制和强大的事务管理。本指南旨在深入解析MyBatis3的各项功能,帮助开发者更好地理解和运用这一工具。 ...
MyBatis3是一款知名的Java持久层框架,它简化了数据库操作与对象之间的映射工作,提供了灵活的SQL构建和执行机制。深入理解MyBatis3的源码有助于开发者更好地掌握其内部工作原理,提高开发效率,并能进行定制化的...
MyBatis是一个优秀的Java持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解进行配置和原始映射,将接口和Java的...
MyBatis是一个基于Java的持久层框架,提供了强大的数据持久化功能,而TypeHandler是MyBatis中一个非常重要的组件,负责将Java类型转换为数据库类型,反之亦然。在实际开发中,我们常常需要根据业务需求自定义Type...
9. **自定义类型处理器**:如果需要处理Mybatis默认不支持的数据类型,可以编写自定义的TypeHandler,使Mybatis能正确地序列化和反序列化这些类型。 10. **SqlSession管理**:在自定义持久层框架中,对SqlSession的...
MyBatis 是一款著名的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使你更好地将关注点集中在你的应用程序上。通过提供一个...
MyBatis是一个优秀的Java持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解进行配置和原始映射,将接口和Java的...
MyBatis 是一款著名的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使你更好地专注于使用 SQL 来编写业务逻辑,而不需要...
MyBatis是一个优秀的Java持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解来配置和映射原生信息,将接口和Java...
- 如果参数对象本身可以直接通过TypeHandler转换为JDBC类型,则直接使用参数对象。 - 如果参数对象是一个复杂的对象,则通过MetaObject获取其属性值。 - 如果参数对象为空,则设置参数值为null。 5. **类型处理*...
MyBatis是一款优秀的持久层框架,它的源码分析对于深入理解其工作原理和优化数据库操作至关重要。MyBatis的核心设计理念是简化SQL操作,通过XML或注解的方式将SQL与Java代码分离,同时提供强大的动态SQL功能。 首先...
MyBatis3是一款著名的Java持久层框架,它简化了数据库操作并与对象映射相结合,使得开发者可以更加专注于SQL语句的编写,而无需处理繁琐的JDBC代码。本篇文章将深入探讨MyBatis3的核心概念、设计模式以及关键源码。 ...
MyBatis是一个优秀的Java持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解进行配置和原始映射,将接口和Java的...
MyBatis是一个优秀的Java持久层框架,它支持定制化SQL、存储过程以及高级映射。在深入探讨MyBatis 3.4.1的源码之前,先了解一下MyBatis的基本概念和工作原理。 MyBatis的核心是SqlSessionFactory,它是通过...
该插件的工作原理是在数据被持久化到数据库之前进行加密,并在从数据库读取数据后进行解密。这样,即使数据在数据库中被非法获取,其原始内容也难以被解析,从而提高了数据的安全性。为了使用这个插件,你需要满足...