【持久化框架MyBatis3七】MyBatis3定义typeHandler
编程技术  /  houtizong 发布于 3年前   75
typeHandler用于将某个类型的数据映射到表的某一列上,以完成MyBatis列跟某个属性的映射
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];}}@Overridepublic 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;@Overridepublic 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对象
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>{@Overridepublic void setNonNullParameter(PreparedStatement ps, int i,PhoneNumber parameter, JdbcType jdbcType) throws SQLException {ps.setString(i, parameter.getAsString());//将PhoneNumber序列化为字符串,持久化到数据库中}@Overridepublic PhoneNumber getNullableResult(ResultSet rs, String columnName)throws SQLException {return new PhoneNumber(rs.getString(columnName)); //根据列名,从数据库中读取字符串,反序列化为PhoneNumber对象}@Overridepublic PhoneNumber getNullableResult(ResultSet rs, int columnIndex)throws SQLException {return new PhoneNumber(rs.getString(columnIndex));}@Overridepublic PhoneNumber getNullableResult(CallableStatement cs, int columnIndex)throws SQLException {return new PhoneNumber(cs.getString(columnIndex));///根据列的序号,从数据库中读取字符串,反序列化为PhoneNumber对象}}
<typeHandlers><typeHandler handler="com.mybatis3.typehandlers.PhoneTypeHandler" /></typeHandlers>
<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);}
请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!
技术博客集 - 网站简介:
前后端技术:
后端基于Hyperf2.1框架开发,前端使用Bootstrap可视化布局系统生成
网站主要作用:
1.编程技术分享及讨论交流,内置聊天系统;
2.测试交流框架问题,比如:Hyperf、Laravel、TP、beego;
3.本站数据是基于大数据采集等爬虫技术为基础助力分享知识,如有侵权请发邮件到站长邮箱,站长会尽快处理;
4.站长邮箱:[email protected];
文章归档
文章标签
友情链接