MyBatis的XML配置文件(三)

来源:互联网 发布:java的环境变量配置 编辑:程序博客网 时间:2024/06/07 21:06

在这一节中,笔者继续向大家介绍有关MyBatis的XML配置文件 。这里一节介绍的内容是比较重要的,也是MyBatis中较为有意思的内容。

1.  typeAliases的参数

在SQL的映射文件的配置中,我们需要在resultType和parameterType的属性中,给出完整的限定名的JavaBean对象。如下所示:

<select id="findStudentById" parameterType="int"resultType=" com.owen.mybatis.domain.Student">SELECT STUD_ID AS ID, NAME, EMAIL, DOBFROM STUDENTS WHERE STUD_ID=#{Id}</select><update id="updateStudent" parameterType="com.owen.mybatis.domain.Student">UPDATE STUDENTS SET NAME=#{name}, EMAIL=#{email}, DOB=#{dob}WHERE STUD_ID=#{id}</update>

上面的代码中,可以看到我们给出了完整的限定名com.owen.mybatis.Student的对象,配置在resultType和parameterType属性中。

如果我们每次都写出同样的完整限制名,而又是一样的,这样会很麻烦。所以我们可以定义个别名,运用别名来使用到任何地方。具体的使用如下。

<typeAliases><typeAlias alias="Student" type="com.owen.mybatis.domain.Student"/><typeAlias alias="Tutor" type="com.owen.mybatis.domain.Tutor"/><package name="com.owen.mybatis.domain"/></typeAliases>

现在我们在SQL的映射文件中,就可以如下的定义了:

<select id="findStudentById" parameterType="int" resultType="Student">SELECT STUD_ID AS ID, NAME, EMAIL, DOBFROM STUDENTS WHERE STUD_ID=#{id}</select><update id="updateStudent" parameterType="Student">UPDATE STUDENTS SET NAME=#{name}, EMAIL=#{email}, DOB=#{dob}WHERE STUD_ID=#{id}</update>

取而代之的是我们为JavaBean定义的别名,不过你也可以直接定义包名,MyBatis就会去扫描包下的所有的类,并且以类名来注册到容器中。就像下面所示的,那么使用时一样的运用Student.

 <typeAliases><package name="com.owen.mybatis.domain"/></typeAliases>

如果这里有Student.java和Tutor.java的JavaBean在包com.owen.mybatis.domain的包内,那么com.owen.mybatis.domain.Student以student名注册,而com.owen.mybatis.domain.Tutor以tutor注册。不过笔者试过了,我们使用时,首个字母的大小写是不区分的。如下的例子所示:

<typeAliases><typeAlias alias="Student" type="com.owen.mybatis.domain.Student"/><typeAlias alias="Tutor" type="com.owen.mybatis.domain.Tutor"/><package name="com.owen.mybatis.domain"/><package name="com.owen.mybatis.webservices.domain"/></typeAliases>

当然,我们还可以用其它的方法来命名别名,那就是应用注解@Alias.

@Alias("StudentAlias")public class Student{ }

需要注意的是,如果你即使用了@Alias又使用了<typeAliases>,那么将会取@Alias的别名。也就是@Alias会覆盖<typeAliases>的配置。

2. typeHandlers的参数

正如在前面的章节中,MyBatis简化了持久性逻辑通过抽象JDBC实现。MyBatis使用JDBC引擎,提供简单的方法来实现数据库操作。

当我们应用MyBatis执行一个INSERT的操作时, 我们会向java的对象放入一些参数,MyBatis将会创建一个PrepareStatrement和放入参数的值,那些占位符的参数,将会转换为setXXX()的方法。这里所说的XXX可以是Int,String,Date等,这些是Javar基础属性。如下例子。

<insert id="insertStudent" parameterType="Student">INSERT INTO STUDENTS(STUD_ID,NAME,EMAIL,DOB)VALUES(#{studId},#{name},#{email},#{dob})</insert>

为了去执行上面的语句,MyBatis将会执行下面的步骤。

1)        创建一个PreparedStatement的接口,运用占位符如下:

PreparedStatement pstmt = connection.prepareStatement("INSERT INTO STUDENTS(STUD_ID,NAME,EMAIL,DOB) VALUES(?,?,?,?)");

1)        在Student的对象中查找studId的属性,和应用setXXX的方法放入值。这里studId是Integer的类型,所以将会用setInt()的方法。

 pstmt.setInt(1,student.getStudId());

1)        相似的,name和email的属性在MyBatis中会使用setString()的方法。

pstmt.setString(2, student.getName());pstmt.setString(3, student.getEmail());

1)        关于dob的属性,MyBatis将会使用setDate()r的方法放入dob的值。

2)        MyBatis首先会使用java.util.Date的转换器,转换为java.sql.Timestamp和放入值。

 pstmt.setTimestamp(4, new Timestamp((student.getDob()).getTime()));

酷!但是MyBatis是如何知道 Integer是使用setInt()方法,String的是使用setString()方法呢?其实MyBatis确定这些也是使用typehandlers。

MyBatis内置了样式处理器,这个处理器可以处理的样式有:byte[],java.util.Date,java.sql.Date,java.sql.Time,java.sql.Timestamp,javaenums等。只要遇到这些定义的参数,Mabatis就会支执行PreparedStatement的类。但是要是我们给出了一个对象的类型呢?那么MyBatis要怎么处理呢?

如下面呈现的,我们在STUDENT的表添加了PHONE的字段,Student拥有phonenuber的参数,所以我们定义个PhoneNumber的类。

public class PhoneNumber{private String countryCode;private String stateCode;private String number;public PhoneNumber() {}public PhoneNumber(String countryCode, String stateCode, Stringnumber) {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];}}public String getAsString() {return countryCode+"-"+stateCode+"-"+number;}// Setters and getters}public class Student{private Integer id;private String name;private String email;private PhoneNumber phone;// Setters and getters}<insert id="insertStudent" parameterType="Student">insert into students(name,email,phone)values(#{name},#{email},#{phone})</insert>

这里,我们给phone参数传入的值是#{phone},这里的phone对象其实就是PhoneNumber。然而,MyBatis并不知道如何去操作它。

为了让MyBatis知道 如何去操作这个对象,像phoneNumber,我们需要创建一个操作的执行类型,如下步骤:

 

1)        MyBatis提供一个抽象的类BaseTypeHandler<T>,我们可以去继承它,创建用户的类型转换器。

importjava.sql.CallableStatement;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.SQLException;importorg.apache.ibatis.type.BaseTypeHandler;importorg.apache.ibatis.type.JdbcType;importcom.owen.mybatis.domain.PhoneNumber;public class PhoneTypeHandler extends BaseTypeHandler<PhoneNumber>{@Overridepublic void setNonNullParameter(PreparedStatement ps, int i,PhoneNumber parameter, JdbcType jdbcType) throwsSQLException {ps.setString(i, parameter.getAsString());}@Overridepublic PhoneNumber getNullableResult(ResultSet rs, StringcolumnName)throws SQLException {return new PhoneNumber(rs.getString(columnName));}@Overridepublic PhoneNumber getNullableResult(ResultSet rs, intcolumnIndex)throws SQLException {return new PhoneNumber(rs.getString(columnIndex));}@Overridepublic PhoneNumber getNullableResult(CallableStatement cs, intcolumnIndex)throws SQLException {return new PhoneNumber(cs.getString(columnIndex));}}

2)        我们使用ps.setString()和rs.getString()的方法,因为phone的数值是VARCHAR的类型。

3)        一旦我们的操作类创建了,我们需要在mybatis-config.xml中注册它。

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><properties resource="application.properties"/><typeHandlers><typeHandler handler="com.owen.mybatis.typehandlers.PhoneTypeHandler"/></typeHandlers></configuration>

之后,我们注册了PhoneTypeHandler,MyBatis将会有能力去处理Phone类型的对象,将对象以VARCHAR类型储蓄。

3.总结

在前面的几个章节中,我们学习了MyBatis的XML的配置。主要的目的就是深入了解一份文件 的配置,那些参数是什么作用的。还的我们要重点了解会是typeHandler,这个实际的项目中是很有用的。在本节开始的时候,我们有讲过,除了使用XML配置,我们也可以使用Java的API来配置。下面的章节我们将会讲到。源码下载:https://github.com/owenwilliam/mybatis.com.git
















0 0
原创粉丝点击