`
什么向往
  • 浏览: 80231 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

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如下

 

package com.someapp.model; 
public class User { 
private int id; 
private String username; 
private String hashedPassword; 

//set和get方法。。。。
}

 

 

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

 

分享到:
评论
2 楼 sj5455718 2015-12-24  
突然想起来,where里面的条件都不符合的时候,用1=1来结束
1 楼 1069355234 2015-07-09  
      

相关推荐

    MyBatis SQL映射文件

    MyBatis 真正的强大在于映射语句,专注于SQL,功能强大,SQL映射的配置却是相当简单 SQL映射文件的几个顶级元素(按照定义的顺序) 1.mapper - namespace 2.cache - 配置给定命名空间的缓存 3.cache-ref – 从其他...

    MyBatis执行SQL并将结果映射成Java对象.docx

    1. MyBatis配置文件 包括MyBatis全局配置文件和MyBatis映射文件 其中全局配置文件配置了数据源 事务等信息 映射文件配置了SQL执行相关的信息 2. MyBatis通过读取配置文件 构造出SqlSessionFactory 即会话工厂 3. ...

    mybatis动态sqlSQL 映射 XML 文件是所有 sql 语句

    mybatis动态sql:SQL 映射 XML 文件是所有 sql 语句放置的地方。需要定义一个 workspace,一般定义为对应的接口类的路径。写好 SQL 语句映射文件后需要在 MyBAtis 配置文件 mappers 标签中引用。

    Mybatis-03 SQL映射文件

    详解MyBatis框架中SQL映射文件的具体配置,包括实现增删改查操作、根据主键生成方式获取主键值、针对单个参数、多个参数和命名参数的处理与参数值获取以及select标签中resultMap的详解

    MyBatis主配置文件

    MyBatis学习 之 一、MyBatis简介与配置MyBatis+Spring+MySql MyBatis学习 之 二、SQL语句映射文件(1)resultMap MyBatis学习 之 二、SQL语句映射文件(2)增删改查、参数、缓存 ...MyBatis学习 之 四、MyBatis配置文件

    深入探索MyBatis:全局配置文件解析及应用优化策略

    MyBatis作为一个广泛使用的Java持久层框架,其全局配置文件的解析对于理解和优化MyBatis应用至关重要。这篇文章深入分析了MyBatis配置文件的解析流程和关键元素。MyBatis配置文件主要包含数据库连接池配置、SQL语句...

    mybatisGenerator配置文件示例

    mybatisGenerator配置文件示例, java开发利器, 使用mybatisGenerator可以快速根据数据库表定义生成java实体类mapper.xml映射文件或者注解sql代码, 强烈推荐.

    SQL语句映射文件

    SQL 映射XML 文件是所有sql语句放置的地方。需要定义一个workspace,一般定义为对应的接口类的路径。写好SQL语句映射文件后,需要在MyBAtis配置文件mappers标签中引用。

    SSM框架的学习与应用-Java EE企业级应用开发学习记录(第四天)Mybatis的关联映射和缓存机制

    深度对MyBatis关联映射进行深入学习,包括MyBatis缓存机制、配置文件、映射文件的使用。 本文可以归类为MyBatis框架的学习教程,其核心主题是带领读者深入掌握MyBatis的配置与使用。 包含文件: 1.项目所需的所有架包...

    MyBatis:适用于Java的MyBatis SQL映射器框架-开源

    MyBatis是一流的持久性框架,支持自定义SQL,存储过程和高级映射。 MyBatis消除了几乎所有的JDBC代码以及参数的手动设置和结果检索。 MyBatis可以使用简单的XML或注释进行配置,并将图元,映射接口和Java POJO(普通...

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

    主要介绍了Java的MyBatis框架中SQL语句映射部分的编写,文中分为resultMap和增删查改实现两个部分来讲解,需要的朋友可以参考下

    数据库到Mybatis的映射

    压缩包下面有是java代码,配置你数据库地址,用户名等信息后,执行代码,可以在设置的路径下面得到关于SSM框架的文件目录以及对应的bean和mapper.xml,主要提高开发效率。

    Java的MyBatis框架中Mapper映射配置的使用及原理解析

    Mapper用于映射SQL语句,可以说是MyBatis操作数据库的核心特性之一,这里我们来讨论Java的MyBatis框架中Mapper映射配置的使用及原理解析,包括对mapper的xml配置文件的读取流程解读.

    基于Java的Pndao框架:自动化MyBatis SQL语句生成工具源码

    - XML配置文件:5个,用于配置MyBatis映射和数据库连接。 - Ensime配置文件:3个,提供Scala IDE支持。 - SQL脚本:2个,包含示例SQL语句。 - .gitignore文件:1个,用于Git版本控制忽略配置。 - LICENSE文件:...

    Mybatis核心组成部分之SQL映射文件揭秘详解

    MyBatis真正的力量是在映射语句中,下面这篇文章主要给大家介绍了关于Mybatis核心组成部分之SQL映射文件揭秘的相关资料,现在分享给大家,给大家做个参考。一起跟随小编过来看看吧

    mybatis笔记.zip

    mybatis-config.xml是MyBatis的主配置文件,其中包含了数据库连接信息、类型别名、映射器配置等。 配置项如数据源、事务管理器、缓存配置、全局设置等可在配置文件中进行定义。 3. 映射器文件: 映射器文件(Mapper...

    mybatis知识点总结.docx

    mybatis-config.xml是MyBatis的主配置文件,其中包含了数据库连接信息、类型别名、映射器配置等。 配置项如数据源、事务管理器、缓存配置、全局设置等可在配置文件中进行定义。 3. 映射器文件: 映射器文件(Mapper...

    MyBatis基本使用总结

    MyBatis基本使用总结 Mybatis 的核心配置文件于实体类的映射文件,mapper 代理动态代理的调用方法。

    mybatis-3-mybatis-3.5.13.zip

    2. 配置解析: MyBatis的配置文件(通常是mybatis-config.xml)包含了框架的各种配置信息,如数据库连接、映射文件路径等。MyBatis会通过解析这些配置文件来构建整个框架的运行环境。 3. 映射文件解析: 映射文件...

    Java后端+数据库+Mybatis

    MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数...映射文件配置: MyBatis 的配置信息通常存储在 XML 文件中,也可以使用注解进行配置。

Global site tag (gtag.js) - Google Analytics