详解Java的MyBatis框架中SQL语句映射部分的编写(2)

一个完整的类名,或者是一个类型别名。如果你匹配的是一个JavaBean,那MyBatis 通常会自行检测到。然后,如果你是要映射到一个HashMap,那你需要指定javaType 要达到的目的。

     

jdbcType

 

数据表支持的类型列表。这个属性只在insert,update 或delete 的时候针对允许空的列有用。JDBC 需要这项,但MyBatis 不需要。如果你是直接针对JDBC 编码,且有允许空的列,而你要指定这项。

     

typeHandler

 

使用这个属性可以覆写类型处理器。这项值可以是一个完整的类名,也可以是一个类型别名。

 

支持的JDBC类型

为了将来的引用,MyBatis 支持下列JDBC 类型,通过JdbcType 枚举:
BIT,FLOAT,CHAR,TIMESTAMP,OTHER,UNDEFINED,TINYINT,REAL,VARCHAR,BINARY,BLOB,NVARCHAR,SMALLINT,DOUBLE,LONGVARCHAR,VARBINARY,CLOB,NCHAR,INTEGER,NUMERIC,DATE,LONGVARBINARY,BOOLEAN,NCLOB,BIGINT,DECIMAL,TIME,NULL,CURSOR
 
1.1.2 constructor
我们使用id、result时候,需要定义java实体类的属性映射到数据库表的字段上。这个时候是使用JavaBean实现的。当然 我们也可以使用实体类的构造方法来实现值的映射,这个时候是通过构造方法参数的书写的顺序来进行赋值的。使用construcotr功能有限(例如使用 collection级联查询)。上面使用id、result实现的功能就可以改为:

<resultMap type="StudentEntity" >

<constructor>

<idArg javaType="String" column="STUDENT_ID"/>

<arg javaType="String" column="STUDENT_NAME"/>

<arg javaType="String" column="STUDENT_SEX"/>

<arg javaType="Date" column="STUDENT_BIRTHDAY"/>

</constructor>

</resultMap>

当然,我们需要定义StudentEntity实体类的构造方法:

public StudentEntity(String studentID, String studentName, String studentSex, Date studentBirthday){

this.studentID = studentID;

this.studentName = studentName;

this.studentSex = studentSex;

this.studentBirthday = studentBirthday;

}

1.1.3 association联合

联合元素用来处理“一对一”的关系。需要指定映射的Java实体类的属性,属性的javaType(通常MyBatis 自己会识别)。对应的数据库表的列名称。如果想覆写的话返回结果的值,需要指定typeHandler。

不同情况需要告诉MyBatis 如何加载一个联合。MyBatis 可以用两种方式加载:

(1). select: 执行一个其它映射的SQL 语句返回一个Java实体类型。较灵活;

(2). resultsMap: 使用一个嵌套的结果映射来处理通过join查询结果集,映射成Java实体类型。

例如,一个班级对应一个班主任。

首先定义好班级中的班主任属性:

private TeacherEntity teacherEntity;

1.1.3.1使用select实现联合

例:班级实体类中有班主任的属性,通过联合在得到一个班级实体时,同时映射出班主任实体。

这样可以直接复用在TeacherMapper.xml文件中定义好的查询teacher根据其ID的select语句。而且不需要修改写好的SQL语句,只需要直接修改resultMap即可。

ClassMapper.xml文件部分内容:

<resultMap type="ClassEntity">
<id property="classID" column="CLASS_ID" />
<result property="className" column="CLASS_NAME" />
<result property="classYear" column="CLASS_YEAR" />
<association property="teacherEntity" column="TEACHER_ID" select="getTeacher"/>
</resultMap>
<select parameterType="String" resultMap="classResultMap">
SELECT * FROM CLASS_TBL CT
WHERE CT.CLASS_ID = #{classID};
</select>

TeacherMapper.xml文件部分内容

<resultMap type="TeacherEntity">

<id property="teacherID" column="TEACHER_ID" />

<result property="teacherName" column="TEACHER_NAME" />

<result property="teacherSex" column="TEACHER_SEX" />

<result property="teacherBirthday" column="TEACHER_BIRTHDAY"/>

<result property="workDate" column="WORK_DATE"/>

<result property="professional" column="PROFESSIONAL"/>

</resultMap>

<select parameterType="String" resultMap="teacherResultMap">

SELECT *

FROM TEACHER_TBL TT

WHERE TT.TEACHER_ID = #{teacherID}

</select>

1.1.3.2使用resultMap实现联合

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/f351fe2df817a72409de323bb87a45ca.html