mybatis的SQL映射配置文件

SQL映射文件有很少的几个顶级元素(按照他们应该被定义的顺序如下)。

  • cache -  配置给定命名空间的缓存
  • cache-ref –  从其他命名空间引用缓存配置。
  • resultMap –  最复杂,也是最有力量的元素,用来描述如何从数据库结果集中来加载你的对象。
  • parameterMap –  已经被废弃了!老式风格的参数映射。内联参数是首选,这个元素可能在将来被移除。
  • sql –  可以重用的SQL块,也可以被其他语句引用。
  • insert –  映射插入语句
  • update –  映射更新语句
  • delete -映射删除语句
  • select - 映射查询语句

SELECT

简单的SELECT 语句如下:

写道

<select id=”selectPerson” parameterType=”int” resultType=”hashmap”> 
SELECT * FROM PERSON WHERE ID = #{id} 
</select>

这个语句被称作selectPerson,使用一个int (或Integer)类型的参数,并返回一个HashMap类型的对象

#{id}告诉mybatis创建了一个PreparedStatement(预处理语句)参数。在JDBC中,类似的代码如下

写道

String selectPerson = “SELECT * FROM PERSON WHERE ID=?”; 
PreparedStatement ps = conn.prepareStatement(selectPerson); 
ps.setInt(1,id);

SELECT的属性还有很多的属性可以配置,具体的如下:

  • id        在命名空间中唯一的标识符,可以被用来引用这条语句。
  • parameterType    将会传入这条语句的参数类的完全限定名或别名。
  • resultType  从这条语句中返回的期望类型的类的完全限定名或别名。注意集合情形,那应该是集合可以包含的类型,而不能是集合本身。使用resultType或resultMap,但不能同时使用。
  • resultMap 命名引用外部的resultMap。返回map是MyBatis最具力量的特性,对其有一个很好的理解的话,许多复杂映射的情形就能被解决了。使用resultMap 或resultType,但不能同时使用
  • flushCache  将其设置为true,无论语句什么时候被调用,都会导致缓存被清空。默认值:false。
  • useCache  将其设置为true,将会导致本条语句的结果被缓存。默认值:true。
  • timeout  这个设置驱动程序等待数据库返回请求结果,并抛出异常时间的最大等待值。默认不设置(驱动自行处理)。
  • fetchSize 这是暗示驱动程序每次批量返回的结果行数。默认不设置(驱动自行处理)。
  • statementType   STATEMENT,PREPARED或CALLABLE的一种。这会让MyBatis使用选择使用Statement,PreparedStatement或CallableStatement。默认值:PREPARED。
  • resultSetType FORWARD_ONLY|SCROLL_SENSITIVE|SCROLL_INSENSITIVE中的一种。默认是不设置(驱动自行处理)。

insert,update,delete

数据修改语句insert,update和delete在它们的实现中非常相似。

写道

<insert 
id="insertAuthor" 
parameterType="domain.blog.Author" 
flushCache="true" 
statementType="PREPARED" 
keyProperty="" 
useGeneratedKeys="" 
timeout="20000">

SQL

这个元素可以被用来定义可重用的SQL代码段,可以包含在其他语句中,例如

写道

<sql id=”userColumns”> id,username,password </sql> 
这个SQL片段可以被包含在其他语句中,例如: 
<select id=”selectUsers” parameterType=”int” resultType=”hashmap”> 
select <include refid=”userColumns”/> 
from some_table 
where id = #{id} 
</select>

Parameters

这个元素说的直白点就是定义参数。注意一个语句中只能有一个参数。所以参数类型在以后的使用中,可能需要复杂的类型,比如hashmap,一个复杂的对象等。例如:

写道

<insert id=”insertUser” parameterType=”User” > 
insert into users (id, username, password) 
values (#{id}, #{username}, #{password}) 
</insert>

如果User类型的参数对象传递到了语句中,id、username和password属性将会被查找,

然后它们的值就被传递到预处理语句的参数中。

resultMap

resultMap 元素是MyBatis中最重要最强大的元素。它就是让你远离90%的需要从结果集中取出数据的JDBC代码的那东西,而且在一些情形下允许你做一些JDBC不支持的事情。事实上,编写相似于对复杂语句联合映射这些等同的代码,也许可以跨过上千行的代码。ResultMap的设计就是简单语句不需要明确的结果映射,而很多复杂语句确实需要描述它们的关系。

写道

<select id=”selectUsers” parameterType=”int” resultType=”hashmap”> 
select id, username, hashedPassword 
from some_table 
where id = #{id} 
</select>

这个语句查询出来的所有列将会自动映射到HashMap的键上,这个是由resultType的属性来指定的。但是HashMap不能很好描述一个领域模型。那样你的应用程序将会使用JavaBeans或POJO 来作为领域模型。

例如一个javabean如下

Java代码  

  1. package com.someapp.model;
  2. public class User {
  3. private int id;
  4. private String username;
  5. private String hashedPassword;
  6. //set和get方法。。。。
  7. }

写道

<select id=”selectUsers” parameterType=”int” 
resultType=”com.some app.model.User”> 
select id, username, hashedPassword 
from some_table 
where id = #{id} 
</select>

当然在使用的时候可以不用输入全名,只需在XML的配置文件中进行以下设置。

写道

<!-- 在XML配置文件中--> 
<typeAlias type=”com.some app.model.User” alias=”User”/> 
<!-- 在SQL映射的XML文件中--> 
<select id=”selectUsers” parameterType=”int” 
resultType=”User”> 
select id, username, hashedPassword 
from some_table 
where id = #{id} 
</select>

缓存

MyBatis包含一个非常强大的查询缓存特性,它可以非常方便地配置和定制。默认情况下是没有开启缓存的,除了局部的session 缓存。要开启二级缓存,你需要在你的SQL映射文件中添加一行: <cache/>

这个简单语句的效果如下:

1  映射语句文件中的所有select语句将会被缓存。

2  映射语句文件中的所有insert,update和delete语句会刷新缓存。

3  缓存会使用Least Recently Used(LRU,最近最少使用的)算法来收回。

4  根据时间表(比如no  Flush  Interval,没有刷新间隔),缓存不会以任何时间顺序来刷新。

5  缓存会存储列表集合或对象(无论查询方法返回什么)的1024个引用。

6  缓存会被视为是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。

动态SQL

动态SQL的元素有以下几个:

if  choose(when,otherwise)  trim(where,set)   foreach

if

写道

<select id=”findActiveBlogWithTitleLike” 
parameterType=”Blog” resultType=”Blog”> 
SELECT * FROM BLOG 
WHERE state = „ACTIVE? 
<if test=”title != null”> 
AND title like #{title} 
</if> 
</select>

choose, when, otherwise

有时我们不想应用所有的条件,相反我们想选择很多情况下的一种。和Java中的switch语句相似,MyBatis提供choose元素。

写道

<select id=”findActiveBlogLike” 
parameterType=”Blog” resultType=”Blog”> 
SELECT * FROM BLOG WHERE state = „ACTIVE? 
<choose> 
<when test=”title != null”> 
AND title like #{title} 
</when> 
<when test=”author != null and author.name != null”> 
AND title like #{author.name} 
</when> 
<otherwise> 
AND featured = 1 
</otherwise> 
</choose> 
</select>

trim, where, set

写道

<select id=”findActiveBlogLike” 
parameterType=”Blog” resultType=”Blog”> 
SELECT * FROM BLOG 
WHERE 
<if test=”state != null”> 
state = #{state} 
</if> 
<if test=”title != null”> 
AND title like #{title} 
</if> 
<if test=”author != null and author.name != null”> 
AND title like #{author.name} 
</if> 
</select>

如果这些条件都没有匹配上将会发生什么?这条SQL结束时就会成这样:

SELECT * FROM BLOG  WHERE,从而导致查询失败。

如果仅仅第二个条件匹配,这条SQL结束时就会是这样:

SELECT * FROM BLOG WHERE AND title like

MyBatis有一个简单的处理,这在90%的情况下都会有用。而在不能使用的地方,你可以自定义处理方式。加上一个简单的改变,所有事情都会顺利进行:

写道

<select id=”findActiveBlogLike” 
parameterType=”Blog” resultType=”Blog”> 
SELECT * FROM BLOG 
<where> 
<if test=”state != null”> 
state = #{state} 
</if> 
<if test=”title != null”> 
AND title like #{title} 
</if> 
<if test=”author != null and author.name != null”> 
AND title like #{author.name} 
</if> 
</ where > 
</select>

where元素知道如果由被包含的标记返回任意内容,就仅仅插入“WHERE”。而且,如果以“AND”或“OR”开头的内容,那么就会跳过WHERE不插入。

foreach

另外一个动态SQL通用的必要操作是迭代一个集合,通常是构建在IN条件中的

写道

<select id="selectPostIn" resultType="domain.blog.Post"> 
SELECT * 
FROM POST P 
WHERE ID in 
<foreac h ite m="item" inde x="index" c ollection="list" 
open="(" separator="," close=")"> 
#{item} 
</fore ach> 
</select>

foreach 元素是非常强大的,它允许你指定一个集合,声明集合项和索引变量,它们可以用在元素体内。它也允许你指定开放和关闭的字符串,在迭代之间放置分隔符。

转自:http://dejazhan.iteye.com/blog/1693516

时间: 2024-10-12 14:28:44

mybatis的SQL映射配置文件的相关文章

mybatis 中 sql 映射文件 select 标签以及 入 resultMap 标签的应用

1.自定义某个 javabean 的封装规则: 注:可以看到,select 标签中引用了 定义好的 resultMap 的值.resultMap 标签中的 type 为javabean 类型,id 为唯一标识.id 子标签定义主键(这样定义底层会有优化.)column 属性为字段名,property 属性为字段值. 注:可以看到测试结果没有出现问题,说明代码没有错误. 2.自定义某个 javabean 的级联属性封装: a.准备工作:mysql 数据库中,在之前 tbl_employees 表的

MyBatis中SQL映射的XML文件

Mappers 既然MyBatis的行为已经由上篇介绍的MyBatis配置文件的元素配置完了,我们现在就要定义SQL映射语句了.但是,首先我们需要告诉MyBatis到哪里去找到这些配置.Java在这方面没有提供一个很好的方法,所以最佳的方式是告诉MyBatis去哪里去找映射文件.你可以使用相对于类路径的资源引用,或者字符表示,或url应用的完全限定名. MyBatis架构中,POJOs对象对象一个映射器接口,映射器接口和对应的SQL映射的XML在同一包下. SQL映射的XML文件 MyBatis

【二】MyBatis的SQL映射文件 ----- 一对一的关联查询

现在假设数据库中有两张表,一张是班级表,另一张是教师表.一个班级只有一名班主任老师,而一个老师只能担任一个班的班主任,这就是我们所说的一对一关联关系.现在要求,查询班级表的同时也要查询出老师的信息.两张表的数据如下所示: 教师表: 班级表: 创建表的SQL语句如下(MySQL数据库): CREATE TABLE teacher( t_id INT PRIMARY KEY AUTO_INCREMENT, t_name VARCHAR(20) ); CREATE TABLE class( c_id

MyBatis 中XML映射配置文件

XML映射配置文件 MyBatis的XML配置文件包含了影响MyBatis行为很深的设置和属性信息.XML文档的高级层级结构如下: properties Settings 这些及其重要的调整,他会修改MyBatis在运行时的行为方式.下面这个表格描述了设置信息,他们的含义和默认值: typeAliases 类型别名是为java类型命名一个短的名字.他和XML的配置有关,只用来减少类完全限定名的多余部分.例如: typeHandlers 无论是MyBatis在预处理语句中设置一个参数,还是从结果集

MyBatis之sql映射文件

MyBatis的强大之处就在于它的sql映射文件,下面介绍sql映射文件的几个顶级元素配置 1)mapper:映射文件的根元素节点,只有一个namespace(命名空间) * 用于区分不同的mapper,全局唯一 * 绑定dao接口,即面向接口编程, 当,namespace绑定某一接口之后,可以不用写该接口的实现类,MyBatis会通过接口的完整的限定名查找到对应的mapper配置来执行sql语句,应此namespace的命名必须要跟接口同名. 2)cache:配置给定的命名空间的缓存 3)ca

mybatis 的 sql 映射文件增删改查的学习

在 sql 映射文件中配置增删改查的操作:     1.增: 在 sql 映射文件中添加 insert 标签,并且增加对应的 sql 语句.(在之前博文示例的基础上添加)在 对应的接口中添加 对应的方法,方法名与 sql 映射文件中 insert 标签中的 id 属性值一致. 注:可以看到,在测试方法 test03 中更新成功.但是在 openSession 对象需要手动提交事务.(sqlSessionFactory.openSession 方法的得到的 openSession 对象,使用 sq

【三】MyBatis的SQL映射文件 ----- 一对多的关联查询

一对多关联查询的解决方案也有两种:嵌套结果和嵌套查询 在上一篇博客中已经讲了一对一的关联查询,在MySQL数据库中已经存在了班级表 class 和教师表 teacher.为了满足一对多关联查询的要求,还需要创建一张学生表 student.这样,在查询班级信息的同时,可以得到教师和学生的信息. 创建 student 表的 SQL 语句如下: CREATE TABLE student( s_id INT PRIMARY KEY AUTO_INCREMENT, s_name VARCHAR(20),

MyBatis的SQL映射文件

1.使用MyBatis实现条件查询 (1)sql映射文件 mapper:映射文件的根元素节点,只有一个属性namespace,其作用如下: <1>用于区分不同的mapper,全局唯一 <2>绑定DAO接口,即面向接口编程.当namespace绑定某一接口之后,可以不用写该接口的实现类,MyBatis会通过接口的完整限定名查找到对应的mapper配置来执行SQL语句.因此namespace的命名必须要跟接口同名. cache:配置给定命名空间的缓存 cache-ref:从其他命名空间

Mybatis二 SQL映射文件

SQL映射文件 单条件查询 1. 在ISmbmsUserDao接口添加抽象方法 //根据用户名模糊查询 List<SmbmsUser> getUserListByName(); 2. 在UserMapper.xml里添加SQL <!--根据用户名模糊查询--> <select id="getUserListByName" resultType="SmbmsUser" parameterType="String">