传送门:mybatis官方文档 Mapper XML 文件详解

一. 数据查询语句

1. select

<select
id="selectPerson"
parameterType="int" 这个属性是可选的,因为 MyBatis 可以通过 TypeHandler 推断出具体传入语句的参数,默认值为 unset。
parameterMap="deprecated"
resultType="hashmap"
resultMap="personResultMap"
flushCache="false" 将其设置为 true,任何时候只要语句被调用,都会导致本地缓存和二级缓存都会被清空,默认值:false。
useCache="true"  将其设置为 true,将会导致本条语句的结果被二级缓存,默认值:对 select 元素为 true。
timeout="10000"
fetchSize="256"
statementType="PREPARED"  STATEMENT,PREPARED 或 CALLABLE 的一个。这会让 MyBatis 分别使用 Statement,PreparedStatement 或 CallableStatement,默认值:PREPARED。
resultSetType="FORWARD_ONLY">
  • resultType="hashmap"时,返回一个 HashMap 类型的对象,其中的键是列名,值便是结果行中的对应值;
  • resultType="java bean"时,返回对象所有的属性值;
  • resultMap="resultMap.id"时,根据resultMap的配置返回对象的指定属性值;

二. 数据变更语句

<insert
id="insertAuthor"
parameterType="domain.blog.Author"  这个属性是可选的,因为 MyBatis 可以通过 TypeHandler 推断出具体传入语句的参数,默认值为 unset。
flushCache="true"            将其设置为 true,任何时候只要语句被调用,都会导致本地缓存和二级缓存都会被清空,默认值:true
statementType="PREPARED"
keyProperty=""
keyColumn=""
useGeneratedKeys=""
timeout="20"> <update
id="updateAuthor"
parameterType="domain.blog.Author"
flushCache="true"
statementType="PREPARED"
timeout="20"> <delete
id="deleteAuthor"
parameterType="domain.blog.Author"
flushCache="true"
statementType="PREPARED"
timeout="20">

1. 自动生成主键字段(创建表时设置主键自动增长)

  useGeneratedKeys:数据库内部生成主键

  keyProperty:主键字段

<insert id="insertAuthor" useGeneratedKeys="true"
keyProperty="id">
insert into Author (username,password,email,bio)
values (#{username},#{password},#{email},#{bio})
</insert>

2. 手动生成主键

  keyProperty:主键字段

  order:设置主键和执行语句的先后顺序,before 表示先设置主键,再执行语句

  resultType:返回的主键类型

  selectKey中的语句只是为主键字段赋值,必须在插入语句中显示设置主键

    <insert id="setPrimaryKey" parameterType="user">
<selectKey keyProperty="id" order="BEFORE" resultType="int">
select max(id)+1 as id from user2
</selectKey>
insert into user2 (id,name,age) values (#{id},#{name},#{age})
</insert>

3. foreach

<foreach
  collection="" 传入的参数类型
  index=""    每次迭代到的位置
  item=""     表示集合中每一个元素进行迭代时的别名
  separator=""  每次进行迭代之间以什么符号作为分隔 符
  open=""    表示以什么开始
  close="">   表示以什么结束 </foreach>

在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况 下,该属性的值是不一样的,主要有一下3种情况:

  1. 如果传入的是单参数且参数类型是一个List的时候,collection属性值为list
  2. 如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array
  3. 如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了

  如果 你的传入参数 就是list或者array, colletion="list" 或者 collection="array"就可以了;

  如果是 传入的一个 对象或者 map, 其中有个属性是 list 或者array,colletion=“属性名”。

List 示例: 

  Java中定义的查询方法

List<DeviceFileRefVO> selectByFileIds(List<Long> fileIds);

   mapperXML中定义的查询语句

  <!--通过文件ID集合查询记录-->
<select id="selectByFileIds" resultMap="BaseResultMap">
SELECT <include refid="fields"/>
FROM t_device_file_ref
WHERE file_id in
<foreach collection="list" item="item" open="(" close=")" separator=",">
#{item,jdbcType=BIGINT}
</foreach>
</select>

三. 可重用的SQL

  用来定义可重用的 SQL 代码段,可以包含在其他语句中。它可以被静态地(在加载参数) 参数化. 不同的属性值通过包含的实例变化.

    <sql id="usersql">
insert into user (name,age) values (#{name},#{age})
</sql> <insert id="addsql" parameterType="user">
<include refid="usersql">
<property name="user" value="user"></property>
</include>
</insert>

四. Result Maps

  ResultMap 的设计思想是,简单的语句不需要明确的结果映射,而复杂一点的语句只需要描述它们的关系就行了。

class user{
private int id;
private String name;
private Card card;
private List<Authors> authors;
}
    <resultMap type="user" id="userResultMap">
<id property="id" column="id"/>        主键字段的映射
<result property="name" column="name"/>      普通字段的映射
<association property="card" column="card"/>   对象类型的映射
<collection property="authors" column="authors"/> 集合类型的映射
</resultMap>

  这里描述的只是常用的一些属性,更加详细的描述请参考官方文档。

五. 缓存

  默认情况下是没有开启缓存的,除了局部的 session 缓存,可以增强变现而且处理循环 依赖也是必须的。要开启二级缓存,你需要在你的 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"/>    只读属性

  可用的收回策略有:

  • LRU – 最近最少使用的:移除最长时间不被使用的对象。 默认值LRU
  • FIFO – 先进先出:按对象进入缓存的顺序来移除它们。
  • SOFT – 软引用:移除基于垃圾回收器状态和软引用规则的对象。
  • WEAK – 弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。

mybatis Mapper XML 映射文件的更多相关文章

  1. Mybatis学习--Mapper.xml映射文件

    简介 Mapper.xml映射文件中定义了操作数据库的sql,每个sql是一个statement,映射文件是mybatis的核心. 映射文件中有很多属性,常用的就是parameterType(输入类型 ...

  2. Mybatis中的Mapper.xml映射文件sql查询接收多个参数

    ​ 我们都知道,在Mybatis中的Mapper.xml映射文件可以定制动态SQL,在dao层定义的接口中定义的参数传到xml文件中之后,在查询之前mybatis会对其进行动态解析,通常使用#{}接收 ...

  3. Mapper.xml映射文件

    查询订单关联查询用户: 使用resultType,ordersCustom可以通过继承orders获得其属性,再添加我们需要的用户字段. 使用resultMap,orders表中通过封装user对象来 ...

  4. MyBatis 的 XML 映射文件使用说明

    简介 文档参考地址:http://www.mybatis.org/mybatis-3/zh/index.html MyBatis 的真正强大在于它的映射语句,也是它的魔力所在.由于它的异常强大,映射器 ...

  5. Maven项目无法找到mybatis的xml映射文件

    通常我们的xml映射文件会放在源码中,普通的java项目在编译时可以将src下的xml放到classes文件中. 但maven项目编译时是不会将xml放到classes文件中,从而导致我们的mybat ...

  6. Mybatis 的 Xml 映射文件中,不同的 Xml 映射文件,id 是否可以重复?

    不同的 Xml 映射文件,如果配置了 namespace,那么 id 可以重复:如果没有配 置 namespace,那么 id 不能重复: 原因就是 namespace+id 是作为 Map<S ...

  7. MyBatis - 3.Mapper XML映射文件

    SQL 映射文件有很少的几个顶级元素(按照它们应该被定义的顺序): cache – 给定命名空间的缓存配置. cache-ref – 其他命名空间缓存配置的引用. resultMap – 是最复杂也是 ...

  8. MyBatis学习存档(3)——mapper.xml映射文件

    MyBatis 真正的强大在于映射语句,专注于SQL,功能强大,SQL映射的配置却是相当简单 所以我们来看看映射文件的具体结构 一.xml节点结构 mapper为根节点 - namespace命名空间 ...

  9. MyBatis—mapper.xml映射配置

    SQL文件映射(mapper文件),几个顶级元素的配置: mapper元素:根节点只有一个属性namespace(命名空间)作用: 1:用于区分不同的mapper,全局唯一. 2:绑定DAO接口,即面 ...

随机推荐

  1. Django+Uwsgi+Nginx项目部署文档

    一.基本环境搭建 1)查看服务器 [root@Myjumpserver ~]# cat /etc/sysconfig/selinux SELINUX=disabled SELINUXTYPE=targ ...

  2. kbmmw 中虚拟文件操作入门

    kbmmw 中一直有一个功能,但是基本上都没有提过,但是在实际应用中,却非常有用,这个功能就是 虚拟文件包功能,他可以把一大堆文件保存到一个文件里面,方便后台管理. kbmmw 的虚拟文件在单元kbm ...

  3. Maven手动将jar包放入本地仓库

    mvn install:install-file -Dfile=jar包的位置 -DgroupId=上面的groupId -DartifactId=上面的artifactId -Dversion=上面 ...

  4. MySql常用命令集

    MySql 常用命令集 Mysql常用命令 show databases; 显示数据库 create database name; 创建数据库 use databasename; 选择数据库 drop ...

  5. 2018.12.15 spoj Substrings(后缀自动机)

    传送门 后缀自动机基础题. 求长度为iii的子串出现次数的最大值. 对原串建出samsamsam,然后用sizsizsiz更新每个maxlenmaxlenmaxlen的答案. 然后由于后缀链接将其转化 ...

  6. NodeList类型

    NodeList近亲NameNodeMap.HTMLCollection是从整体上透彻理解DOM的关键所在.这三个集合都是'动态的' 换句话说,每当文档结构发生变化时,它们都会更新. 所以它们始终都会 ...

  7. 好文推荐系列---------(4)使用Yeoman自动构建Ember项目

    好文原文地址:http://segmentfault.com/a/1190000000368881 我决定学习前端开发的效率工具Yeoman.本文将首先介绍Yeoman的基本情况,接着我们会使用Yeo ...

  8. java通过sftp对linux服务器文件夹进行操作

    本文主要讲sftp对linux服务器的文件和文件夹进行操作,windows server 服务器不支持. package com.lx.ftp; import java.io.File; import ...

  9. 1.gil全局解释器锁, 2. 死锁与递归锁 3. 信号量 4. Event事件 5. 线程queue

    gil本质就是一把互斥锁,相当于执行权限,每个进程都会存在一把gil,同一进程内的多个线程必须抢到gil 之后才能使用cpython解释器来执行自己的代码,同一进程下的多线程不能并行,但可以实现并发 ...

  10. POJ3320 Jessica's Reading Problem 2017-05-25 19:55 38人阅读 评论(0) 收藏

    Jessica's Reading Problem Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12346   Accep ...