1.MyBatis XML映射文件
1.1Mapper XML文件
MyBatis的真正强大在于它的映射语句,也是它的魔力所在。映射器的XML文件显得相对简单。如果拿它根具有相同功能的JDBC代码进行对比,你会立即发现省掉了将近95%的代码。MyBatis就是针对SQL构建的,并且比普通的方法做的更好。
SQL映射文件偶很少几个顶级元素(按照它们应该被定义的顺序):
- cache:给定命名空间的缓存配置。
- cache-ref:其他命名空间缓存配置的引用。
- resultMap:是最复杂也是最强大的元素,用来描述如果从数据库结果集中来加载对象。
- sql:可被其他语句引用的可重用语句块。
- insert:映射插入语句。
- update:映射更新语句。
- delete:映射删除语句。
- select:映射查询语句。
下一部分将从语句本身开始来表述每个元素的细节。
1.2select
查询语句是 MyBatis 中最常用的元素之一,光能把数据存到数据库中价值并不大,如果还能重新取出来才有用,多数应用也都是查询比修改要频繁。对每个插入、更新或删除操作,通常对应多个查询操作。这是 MyBatis 的基本原则之一,也是将焦点和努力放到查询和结果映射的原因。简单查询的 select 元素是非常简单的。比如:
这个语句被称作selectStudent,,返回一个Student的对象集合。
这就告诉MyBatis创建一个预处理语句参数,通过JDBC,这样的一个参数在SQL中会由一个“?”来标识,并被传递到一个新的预处理语句中。select还有许多其它属性,部分属性如下:
1.3insert, update 和 delete
数据变更语句 insert,update 和 delete 的实现非常接近:
1.4sql
这个元素可以被用来定义可重用的SQL代码段,可以包含在其他语句中。它可以静态地(在加载阶段)参数化。不同的属性值可以在include实例中有所不同。比如:
这个SQL片段可以被包含在其他语句中,比如:
1.5参数(parameter)
<insert id="insertUser" parameterType="User">
insert into users (id, username, password)
values (#{id}, #{username}, #{password})
</insert>
如果 User 类型的参数对象传递到了语句中,id、username 和 password 属性将会被查找,然后将它们的值传入预处理语句的参数中。这点对于向语句中传参是比较好的而且又简单。
1.6Result Maps
resultMap元素是MyBatis中最重要最强大的元素。它就是让你远离90%的需要从结果集中取出数据的JDBC代码的那个东西,而且在一些情形下允许你做一些JDBC不支持的事情。事实上,编写相似于对复杂语句联合映射这些等同的代码,也许可以跨过上千行的代码。ResultMap的设计就是简单语句不需要明确的结果映射,而很多复杂语句确实需要描述它们的关系。
<select id="selectUsers" resultType="map">
select id, username, hashedPassword
from some_table
where id = #{id}
</select>
这样一个语句简单作用于所有列被自动映射到HashMap的键上,这由resultType属性指定。这在很多情况下是有用的。基于JavaBean的规范,若某个类有三个属性:id, username, hashedPassword。这些在select语句中会精确匹配到列名。
这样的一个JavaBean可以被映射到结果集,就像映射到HashMap一样简单。
<select id="selectUsers" resultType="com.someapp.model.User">
select id, username, hashedPassword
from some_table
where id = #{id}
</select>
如果列名没有精确匹配,你可以在列名上使用select字句的别名(一个基本的SQL特性)来匹配标签。比如:
<select id="selectUsers" resultType="User">
select
user_id as "id",
user_name as "userName",
hashed_password as "hashedPassword"
from some_table
where id = #{id}
</select>