Mapper XML文件介绍
Mybatis的强大只处在于它提供的强大的映射语句,和具有相同功能的JDBC代码对比,能大大减少重复代码。
insert
<insert id="insertStudent" parameterType="Student" useGeneratedKeys="true" keyColumn="id">
insert into student (student_name,student_age,student_phone,interests) values
(#{student_name},#{student_age},#{student_phone},#{interests,javaType=[Ljava.lang.String;,jdbcType=VARCHAR})
</insert>
- keyProperty
selectKey 语句结果应该被设置的目标属性。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。 - keyColumn
匹配属性的返回结果集中的列名称。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。 - resultType
结果的类型。MyBatis 通常可以推算出来,但是为了更加确定写上也不会有什么问题。MyBatis 允许任何简单类型用作主键的类型,包括字符串。如果希望作用于多个生成的列,则可以使用一个包含期望属性的 Object 或一个 Map。 - order
这可以被设置为 BEFORE 或 AFTER。如果设置为 BEFORE,那么它会首先选择主键,设置 keyProperty 然后执行插入语句。如果设置为 AFTER,那么先执行插入语句,然后是 selectKey 元素 - 这和像 Oracle 的数据库相似,在插入语句内部可能有嵌入索引调用。 - statementType
与前面相同,MyBatis 支持 STATEMENT,PREPARED 和 CALLABLE 语句的映射类型,分别代表 PreparedStatement 和 CallableStatement 类型。
delete
<delete id="deleteById" parameterType="int">
delete * from student where student_id = #{id}
</delete>
update
<update id = "updateById">
update student set
student_name = #{student_name},
student_age = #{student_age},
student_phone = #{student_phone},
interests = #{interests}
where student_id = #{student_id}
</update>
select
<select id="selectStudentById" parameterType="int" resultType="Student">
<![CDATA[
select * from student where student_id = #{id}
]]>
</select>
- id
命名空间中的唯一标识符,可被用来代表这条语句。 - parameterType
将要传入语句的参数的完全限定类名或别名。这个属性是可选的,因为 MyBatis 可以通过 TypeHandler 推断出具体传入语句的参数,默认值为 unset。 - flushCache
将其设置为 true,任何时候只要语句被调用,都会导致本地缓存和二级缓存都会被清空,默认值:true(对应插入、更新和删除语句)。 - timeout
这个设置是在抛出异常之前,驱动程序等待数据库返回请求结果的秒数。默认值为 unset(依赖驱动)。 - statementType
STATEMENT,PREPARED 或 CALLABLE 的一个。这会让 MyBatis 分别使用 Statement,PreparedStatement 或 CallableStatement,默认值:PREPARED。 - useGeneratedKeys
(仅对 insert 和 update 有用)这会令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键(比如:像 MySQL 和 SQL Server 这样的关系数据库管理系统的自动递增字段),默认值:false。 - keyProperty
(仅对 insert 和 update 有用)唯一标记一个属性,MyBatis 会通过 getGeneratedKeys 的返回值或者通过 insert 语句的 selectKey 子元素设置它的键值,默认:unset。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。 - keyColumn
(仅对 insert 和 update 有用)通过生成的键值设置表中的列名,这个设置仅在某些数据库(像 PostgreSQL)是必须的,当主键列不是表中的第一列的时候需要设置。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。 - databaseId
如果配置了 databaseIdProvider,MyBatis 会加载所有的不带 databaseId 或匹配当前 databaseId 的语句;如果带或者不带的语句都有,则不带的会被忽略。
sql
这个元素可以被用来定义可重用的SQL代码段,可以包含在其他语句中。可以被静态的参数化。
<sql id = "studentSql">
student_id,student_name,student_age,student_phone,interests,teacher_id
</sql>
<select id="findById" parameterType="int" resultMap="studentResult">
select
<include refid="studentSql"/>
from student where student_id = #{id}
</select>
resultMap
结果映射集,将数据表列数据映射成java对象,下面将提供一个两表级联查询的例子作为参考。
- 数据格式
- java映射对象
public class Teacher {
private Integer teacherId;
private String teacherName;
private String teacherAge;
private String teacherPhone;
private List<Student> students;
public Integer getTeacherId() {
return teacherId;
}
public void setTeacherId(Integer teacherId) {
this.teacherId = teacherId;
}
public String getTeacherName() {
return teacherName;
}
public void setTeacherName(String teacherName) {
this.teacherName = teacherName;
}
public String getTeacherAge() {
return teacherAge;
}
public void setTeacherAge(String teacherAge) {
this.teacherAge = teacherAge;
}
public String getTeacherPhone() {
return teacherPhone;
}
public void setTeacherPhone(String teacherPhone) {
this.teacherPhone = teacherPhone;
}
public List<Student> getStudents() {
return students;
}
public void setStudents(List<Student> students) {
this.students = students;
}
@Override
public String toString() {
return "Teacher{" +
"teacherId=" + teacherId +
", teacherName='" + teacherName + '\'' +
", teacherAge='" + teacherAge + '\'' +
", teacherPhone='" + teacherPhone + '\'' +
", students=" + students +
'}';
}
}
- resultMap配置
<resultMap id="teacherResult" type="com.yongssu.mybatis.demo1.Teacher">
<id column="teacher_id" property="teacherId"/>
<result column="teacher_name" property="teacherName"/>
<result column="teacher_age" property="teacherAge"/>
<result column="teacher_phone" property="teacherPhone"/>
<association property="students" javaType="com.yongssu.mybatis.demo1.Student">
<id column="student_id" property="studentId"/>
<result column="student_name" property="studentName"/>
<result column="student_age" property="studentAge"/>
<result column="student_phone" property="studentPhone"/>
<result column="interests" property="interests" javaType="[Ljava.lang.String;"/>
</association>
</resultMap>
用association表示teacher和学生是1对1的关系,在Teacher中的Student只有一个学生,应该声明为Student student。
<resultMap id="studentResult" type="Student">
<id column="student_id" property="studentId"/>
<result column="student_name" property="studentName"/>
<result column="student_age" property="studentAge"/>
<result column="student_phone" property="studentPhone"/>
<result column="interests" property="interests" javaType="[Ljava.lang.String;"/>
</resultMap>
<resultMap id="teacherResult" type="com.yongssu.mybatis.demo1.Teacher">
<id column="teacher_id" property="teacherId"/>
<result column="teacher_name" property="teacherName"/>
<result column="teacher_age" property="teacherAge"/>
<result column="teacher_phone" property="teacherPhone"/>
<collection property="students" ofType="Student" resultMap="studentResult"/>
</resultMap>
用collection表示老师和学生是1对N的关系,在Teacher类中学生是一个列表。
- sql多表联合查询语句
<select id="selectTeacher" parameterType="int" resultMap="teacherResult">
select * from teacher
left join student on student.teacher_id = teacher.teacher_id
where teacher.teacher_id = #{id}
</select>
cache
mybatis包含了了一个非常强大的缓存特性,可以非常方便的配置和定制。在默认的情况下是没有开启缓存的。要开启缓存,需要在SQL映射文件中添加一行
<cache/>
缓存的效果如下
- 映射语句文件中的所有 select 语句将会被缓存。
- 映射语句文件中的所有 insert,update 和 delete 语句会刷新缓存。
- 缓存会使用 Least Recently Used(LRU,最近最少使用的)算法来收回。
- 根据时间表(比如 no Flush Interval,没有刷新间隔), 缓存不会以任何时间顺序 来刷新。
- 缓存会存储列表集合或对象(无论查询方法返回什么)的 1024 个引用。
- 缓存会被视为是 read/write(可读/可写)的缓存,意味着对象检索不是共享的,而 且可以安全地被调用者修改,而不干扰其他调用者或线程所做的潜在修改。
缓存的属性可以通过缓存元素的属性来修改。比如:
<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>
这个更高级的配置创建了一个 FIFO 缓存,并每隔 60 秒刷新,存数结果对象或列表的 512 个引用,而且返回的对象被认为是只读的,因此在不同线程中的调用者之间修改它们会 导致冲突。
- 可用的收回策略有:
- LRU – 最近最少使用的:移除最长时间不被使用的对象。
- FIFO – 先进先出:按对象进入缓存的顺序来移除它们。
- SOFT – 软引用:移除基于垃圾回收器状态和软引用规则的对象。
- WEAK – 弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。
- 默认的是 LRU。
- flushInterval(刷新间隔)可以被设置为任意的正整数,而且它们代表一个合理的毫秒 形式的时间段。默认情况是不设置,也就是没有刷新间隔,缓存仅仅调用语句时刷新。
- size(引用数目)可以被设置为任意正整数,要记住你缓存的对象数目和你运行环境的 可用内存资源数目。默认值是 1024。
- readOnly(只读)属性可以被设置为 true 或 false。只读的缓存会给所有调用者返回缓 存对象的相同实例。因此这些对象不能被修改。这提供了很重要的性能优势。可读写的缓存 会返回缓存对象的拷贝(通过序列化) 。这会慢一些,但是安全,因此默认是 false。
更详细的内容请参考文档:http://www.mybatis.org/mybatis-3/zh/sqlmap-xml.html