Mybatis中Mapper标签总结大全

一、标签分类

定义SQL语句

  • insert
  • delete
  • update
  • select

配置关联关系

  • collection
  • association

配置java对象属性与查询结果集中列名的对应关系

  • resultMap

控制动态SQL拼接

  • foreach
  • if
  • choose

格式化输出

  • where
  • set
  • trim

定义常量

  • sql

其他

  • include

二、标签总结

1. 基础SQL标签

1.1 查询select

标签属性

  • id 唯一的名称,对应dao中mapper的接口名称
  • paramterType 定义传入的参数类型
  • resultType  返回数据类型对应实体类
  • resultMap 外部 resultMap 的命名引用。结果集的映射是 MyBatis 最强大的特性,对其有一个很好的理解的话,许多复杂映射的情形都能迎刃而解。使用 resultMap 或 resultType,但不能同时使用
  • flushCache 将其设置为 true,任何时候只要语句被调用,都会导致本地缓存和二级缓存都会被清空,默认值:false
  • useCache 将其设置为 true,将会导致本条语句的结果被二级缓存,默认值:对 select 元素为 true
  • timeout 这个设置是在抛出异常之前,驱动程序等待数据库返回请求结果的秒数。默认值为 unset(依赖驱动)
  • fetchSize 这是尝试影响驱动程序每次批量返回的结果行数和这个设置值相等。默认值为 unset(依赖驱动)。
  • statementType  STATEMENT,PREPARED 或 CALLABLE 的一个。这会让 MyBatis 分别使用 Statement,PreparedStatement 或 CallableStatement,默认值:PREPARED。
  • resultSetType  FORWARD_ONLY,SCROLL_SENSITIVE 或 SCROLL_INSENSITIVE 中的一个,默认值为 unset (依赖驱动)。
  • databaseId 如果配置了 databaseIdProvider,MyBatis 会加载所有的不带 databaseId 或匹配当前 databaseId 的语句;如果带或者不带的语句都有,则不带的会被忽略。
  • resultOrdered 这个设置仅针对嵌套结果 select 语句适用:如果为true,就是假设包含了嵌套结果集或是分组了,这样的话当返回一个主结果行的时候,就不会发生有对前面结果集的引用的情况。这就使得在获取嵌套的结果集的时候不至导致内存不够用。默认值:false。
  • resultSets 这个设置仅对多结果集的情况适用,它将列出语句执行后返回的结果集并每个结果集给一个名称,名称是逗号分隔的。
  /**
   * 根据条件查询用户集合
   */
  List<User> selectUsers(@Param("cond")Map<String, Object> map);
<!-- 返回的是List,resultType给定的值是List里面的实体类而不是list,mybatis会自动把结果变成List -->
  <select id="selectUsers" parameterType="map" resultType="con.it.bean.User">
    select id, username, password, sex, birthday, address from user u
    <where>
      <trim suffixOverrides=",">
        <if test="cond.username != null and cond.username != ''">
          u.username = #{cond.username},
        </if>
        <if test="cond.sex != null">
          and u.sex = #{cond.sex},
        </if>
         <if test="cond.beginTime != null">
          <![CDATA[ and DATE_FORMAT(u.birthday, '%Y-%m-%d %H:%T:%s') >= DATE_FORMAT(#{beginTime}, '%Y-%m-%d %H:%T:%s'),  ]]>
        </if>
        <if test="cond.endTime != null">
          <![CDATA[ and DATE_FORMAT(u.birthday, '%Y-%m-%d %H:%T:%s') <= DATE_FORMAT(#{endTime}, '%Y-%m-%d %H:%T:%s'),  ]]>
        </if>
        <if test="cond.address != null and cond.address != ''">
          and u.addrerss like '%' || #{cond.address} || '%',
        </if>
      </trim>
    </where>
  </select>

1.2 增删改

标签属性

  • id 唯一的名称,对应dao中mapper的接口名称
  • 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这样的关系数据库管理系统的自动递增字段, oracle使用序列是不支持的,通过selectKey可以返回主键),默认值:false。
  • keyProperty (仅对 insert 和 update 有用)唯一标记一个属性,MyBatis 会通过 getGeneratedKeys 的返回值或者通过 insert 语句的 selectKey子元素设置它的键值,默认:unset。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。
  • keyColumn(仅对 insert 和 update 有用)通过生成的键值设置表中的列名,这个设置仅在某些数据库(像PostgreSQL)是必须的,当主键列不是表中的第一列的时候需要设置。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。
  • databaseId 如果配置了 databaseIdProvider,MyBatis 会加载所有的不带 databaseId 或匹配当前 databaseId 的语句;如果带或者不带的语句都有,则不带的会被忽略。
  <insert id="insert" parameterType="com.it.bean.User">

    <!-- 使用序列插入oracle数据库返回主键,MYSQL数据库无需添加selectKey -->
    <selectKey resultType="long" order="BEFORE" keyProperty="id">
      SELECT user_seq.NEXTVAL as id from DUAL
    </selectKey>

    insert into User (ID, USERNAME, PASSWORD, SEX, ADRESS, CREATED_BY, CREADTED_DATE)
    values (#{id}, #{username}, #{password}, #{sex}, #{adress}, #{createdBy}, SYSDATE)
  </insert>

1.3 其他基础标签

1.3.1 sql 标签

定义一些常用的sql语句片段

<sql id="selectParam">
  id, username, password, sex, birthday, address
</sql>

1.3.2 include 标签

引用其他的常量,通常和sql一起使用

<select>
  select <include refid="selectParam"></include>
  from user
</select>

1.3.3 if 标签

基本都是用来判断值是否为空,注意Integer的判断,mybatis会默认把0变成 ‘'

<if test="item != null and item != ''"></if>

<!-- 如果是Integer类型的需要把and后面去掉或是加上or-->
<if test="item != null"></if>
<if test="item != null and item != '' or item == 0"></if>

1.3.4 别名

经常使用的类型可以定义别名,方便使用,mybatis也注册了很多别名方便我们使用,详情见底部附录

<typeAliases>
   <typeAlias type="com.it.bean.User" alias="User"/>
</typeAliases>

2. collection与association标签

collection与association的属性一样,都是用于resultMap返回关联映射使用,collection关联的是集合,而association是关联单个对象

标签属性

  • property resultMap返回实体类中字段和result标签中的property一样
  • column 数据库的列名或者列标签别名,是关联查询往下一个语句传送值。注意: 在处理组合键时,您可以使用column=“{prop1=col1,prop2=col2}”这样的语法,设置多个列名传入到嵌套查询语句。这就会把prop1和prop2设置到目标嵌套选择语句的参数对象中。
  • javaType 一般为ArrayList或是java.util.List
  • ofType java的实体类,对应数据库表的列名称,即关联查询select对应返回的类
  • select 执行一个其他映射的sql语句返回一个java实体类型
/**
 *问题表
 */
public class Question {

  private Long id; //问题id

  private String question; //问题

  private Integer questionType; //问题类型

  private List<QuestionAnswer> answerList; //问题选项集合

  //Getter和Setter省略
}

/**
 *问题选项表
 */
public class QuestionAnswer {

  private Long id; //选项id

  private Long questionId; //问题id

  private String answer; //选项

  //Getter和Setter省略
}
<!-- 具体可参考下面ResultMap -->
<collection property="answerList" javaType="java.util.List"
        ofType="com.it.bean.QuestionAnswer" column="id"
        select="setlectQuestionAnswerByQuestionId"/>

3. resultMap标签

resultMap属性

  • id  唯一标识
  • type  返回类型
  • extends  继承别的resultMap,可选

关联其他标签

  • id 设置主键使用,使用此标签配置映射关系(可能不止一个)
  • result 一般属性的配置映射关系,一般不止一个
  • association 关联一个对象使用
  • collection 关联一个集合使用
<!-- 返回关联查询的问题 -->
<resultMap id="detail_result" type="com.it.bean.Question">
  <id column="id" property="id" />
  <result column="question" property="question" />
  <result column="question_type" property="questionType" />
  <collection property="answerList" javaType="java.util.List"
        ofType="com.it.bean.QuestionAnswer" column="id"
        select="setlectQuestionAnswerByQuestionId"/>
</resultMap>

<!-- 查询问题集 -->
<select id="selectQuestions" parameterType="map" resultMap="detail_result">
  select q.id, q.question, q.question_type
  from question q
  <where>
    <if test="cond.id != null">
      q.id = #{cond.id}
    </if>
    <if test="cond.idList != null and cond.idList.size() != 0">
      q.id in
      <foreach collection="cond.idList" item="id" open="(" separator="," close=")">
        #{id}
      </foreach>
    </if>
  </where>
</select>

<!-- 查询对应问题的答案集 -->
<select id="setlectQuestionAnswerByQuestionId" parameterType="long" resultType="com.it.bean.QuestionAnswer">
  select a.id, a.answer from question_answer a where a.question_id = #{id}
</select>

4. foreach标签

foreach属性

  • collection 循环的集合。传的是集合为list,数组为array, 如果是map为java.util.HashMap
  • item 循环的key
  • index 循环的下表顺序
  • open 循环的开头
  • close 循环结束
  • separator 循环的分隔符
<sql id="base_column">id, question_id, answer</sql>

<!-- oracle的批量插入 -->
<insert id="insertBatchOracle" parameterType="list">
  insert into question_answer ( <include refid="base_column" /> )
  select question_answer_seq.NEXTVAL, A.* from (
    <foreach collection="list" item="item" separator="union all">
      select #{item.questionId}, #{item.answer} from dual
    </foreach>
  ) A
</insert>

<!-- Mysql的批量插入,主键自增 -->
<insert id="insertBatchMysql" parameterType="list">
  insert into question_answer ( <include refid="base_column" /> )
  values
    <foreach collection="list" item="item" open="(" separator="union all" close=")">
      #{item.id}, #{item.questionId}, #{item.answer}
    </foreach>
</insert>

5. where标签

where用来去掉多条件查询时,开头多余的and

  <select id="selectUserList" parameterType="com.it.bean.User" resultType="com.it.bean.User">
    <!-- 引用Sql片段 -->
    select <include refid="selectParam"> from user u
    <where>
      <!--where 可以自动去掉条件中的第一个and-->
      <if test="id != null">
        and u.id = #{id}
      </if>
      <if test="name != null and name != ''">
        and u.name = #{name}
      </if>
    </where>
  </select>

6. set标签

set是mybatis提供的一个智能标记,当在update语句中使用if标签时,如果前面的if没有执行,则或导致逗号多余错误。使用set标签可以将动态的配置SET 关键字,和剔除追加到条件末尾的任何不相关的逗号。
没有使用if标签时,如果有一个参数为null,都会导致错误,如下示例:

  <update id="updateUser" parameterType="com.it.bean.user">
    update user
    <set>
      <if test="username != null and username != ''">
        username = #{username},
      </if>
      <if test="sex != null and sex == 0 or sex == 1">
        sex = #{sex},
      </if>
      <if test="birthday != null ">
        birthday = #{birthday},
      </if >
      <if test="address != null and address != ''">
        address = #{address},
      </if>
      <if test="lastModifiedBy != null and lastModifiedBy != ''">
        last_modified_by = #{lastModifiedBy},
        last_modified_date = SYSDATE,
      </if>
    </set>
    <where>
      id = #{id}
    </where>
  </update>

7. trim标签

trim标记是一个格式化的标记,可以完成set或者是where标记的功能

标签属性

  • prefix、suffix 表示再trim标签包裹部分的前面或后面添加内容(注意:是没有prefixOverrides,suffixOverrides的情况下)
  • prefixOverrides,suffixOverrides 表示覆盖内容,如果只有这两个属性表示删除内容
<update id="test" parameterType="com.it.bean.User">
  update user
    <!-- 开头加上set,结尾去除最后一个逗号 -->
    <trim prefix="set" suffixOverrides=",">
      <if test="username!=null and username != ''">
        name= #{username},
      </if>

      <if test="password!=null and password != ''">
        password= #{password},
      </if>

    </trim>
    <where>
      id = #{id}
    </where>
  </update>

8. choose、when、otherwise标签

有时候我们并不想应用所有的条件,而只是想从多个选项中选择一个。MyBatis提供了choose 元素,按顺序判断when中的条件出否成立,如果有一个成立,则choose结束。当choose中所有when的条件都不满则时,则执行 otherwise中的sql。类似于Java 的switch 语句,choose为switch,when为case,otherwise则为default。if是与(and)的关系,而choose是或(or)的关系

<select id="getUserList" resultType="com.it.bean.User" parameterType="com.it.bean.User">
  SELECT <include refid="resultParam"></include> FROM User u
  <where>
    <choose>
      <when test="username !=null and username != ''">
        u.username LIKE CONCAT(CONCAT('%', #{username}),'%')
      </when >
      <when test="sex != null">
        AND u.sex = #{sex}
      </when >
      <when test="birthday != null ">
        AND u.birthday = #{birthday}
      </when >
      <otherwise>
      </otherwise>
    </choose>
  </where>
</select> 

附Mybatis已经注册好的别名表

别名 映射类型
_byte byte
_long long
_short short
_int int
_integer int
_double double
_float float
_boolean boolean
string String
byte Byte
long Long
short Short
int Integer
integer Integer
double Double
float Float
boolean Boolean
date Date
decimal BigDecimal
bigdecimal BigDecimal
map Map
hashmap HashMap
list list
arraylist ArrayList
collection Collection
iterator Iterator

二、写在后面

在网上看了很多标签的解释,但不是很全,我就自己总结了一份,搭配示例更好理解标签的含义,如有什么遗漏或是错误还望多多发言补充,我会继续完善。

注: 关于参数指定jdbcType,是因为当传参为null时候,mybatis无法自动判断类型,就必须要显示指定它的类型,多用于insert中

到此这篇关于Mybatis中Mapper标签总结大全的文章就介绍到这了,更多相关Mybatis Mapper标签内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 详解MyBatis批量插入数据Mapper配置文件的写法

    对于MyBatis配置文件的用法一直不是很熟悉,之前一直是使用注解来开发的,但是注解也有不好的地方就是如果数据库的表结构发生变化在代码中修改起来很麻烦. 其实批量插入很简单,这里做些简要的说明.请看配置文件的写法: <insert id="insertAll" parameterType="java.util.List" useGeneratedKeys="true"> <selectKey resultType="l

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

    Mapper的内置方法 model层就是实体类,对应数据库的表.controller层是Servlet,主要是负责业务模块流程的控制,调用service接口的方法,在struts2就是Action.Service层主要做逻辑判断,Dao层是数据访问层,与数据库进行对接.至于Mapper是mybtis框架的映射用到,mapper映射文件在dao层用. 下面是介绍一下Mapper的内置方法: 1.countByExample ===>根据条件查询数量 int countByExample(UserE

  • 详解Mybatis通用Mapper介绍与使用

    使用Mybatis的开发者,大多数都会遇到一个问题,就是要写大量的SQL在xml文件中,除了特殊的业务逻辑SQL之外,还有大量结构类似的增删改查SQL.而且,当数据库表结构改动时,对应的所有SQL以及实体类都需要更改.这工作量和效率的影响或许就是区别增删改查程序员和真正程序员的屏障.这时,通用Mapper便应运而生-- 什么是通用Mapper 通用Mapper就是为了解决单表增删改查,基于Mybatis的插件.开发人员不需要编写SQL,不需要在DAO中增加方法,只要写好实体类,就能支持相应的增删

  • 详解mybatis通过mapper接口加载映射文件

    通过 mapper 接口加载映射文件,这对于后面 ssm三大框架 的整合是非常重要的.那么什么是通过 mapper 接口加载映射文件呢? 我们首先看以前的做法,在全局配置文件 mybatis-configuration.xml 通过 <mappers> 标签来加载映射文件,那么如果我们项目足够大,有很多映射文件呢,难道我们每一个映射文件都这样加载吗,这样肯定是不行的,那么我们就需要使用 mapper 接口来加载映射文件 以前的做法: 改进做法:使用 mapper 接口来加载映射文件 1.定义

  • 浅谈Mybatis通用Mapper使用方法

    对单表进行增删改查是项目中不可避免的需求,Mybatis的通用Mapper插件使这些操作变得简单 添加maven依赖 在对应工程的pom.xml文件中添加 <dependency> <groupId>javax.persistence</groupId> <artifactId>persistence-api</artifactId> <version>1.0</version> </dependency> &

  • Mybatis增删改查mapper文件写法详解

      1. 插入 <mapper namespace="需要实现接口的全类名"> <insert id="需要实现的接口里的方法名" parameterType="方法参数类型,如果是对象要写全类名"> INSERT sql命令(命令里通过#{}获取对象属性) <!--注意属性名区分大小写 --> </insert> <mapper> EG: <mapper namespace=&q

  • Mybatis中Mapper标签总结大全

    一.标签分类 定义SQL语句 insert delete update select 配置关联关系 collection association 配置java对象属性与查询结果集中列名的对应关系 resultMap 控制动态SQL拼接 foreach if choose 格式化输出 where set trim 定义常量 sql 其他 include 二.标签总结 1. 基础SQL标签 1.1 查询select 标签属性 id 唯一的名称,对应dao中mapper的接口名称 paramterTy

  • mybatis中resultMap 标签的使用教程

    MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注SQL本身,而不需要花费精力去处理例如注册驱动.创建connection.创建statement.手动设置参数.结果集检索等jdbc繁杂的过程代码. MyBatis特点: 1.开源的优秀持久层框架 2.SQL语句与代码分离 3.面向配置的编程 4.良好支持复杂数据映射 5.动态SQL resultMap 标签: 用来描述如何从数据库结果集中来加载对象 (敲黑板!!)主管数据库的字段和实体类属性的匹配,

  • Mybatis中Mapper映射文件使用详解

    紧接上文所述,在这篇文章中我将对Mapper映射文件进行详细的说明. Mapper映射文件是一个xml格式文件,必须遵循相应的dtd文件规范,如ibatis-3-mapper.dtd.我们先大体上看看支持哪些配置?如下所示,从Eclipse里截了个屏: 从上图可以看出,映射文件是以<mapper>作为根节点,在根节点中支持9个元素,分别为insert.update.delete.select(增删改查);cache.cache-ref.resultMap.parameterMap.sql. 下

  • 基于mybatis中<include>标签的作用说明

    MyBatis中sql标签定义SQL片段,include标签引用,可以复用SQL片段 sql标签中id属性对应include标签中的refid属性.通过include标签将sql片段和原sql片段进行拼接成一个完整的sql语句进行执行. <sql id="sqlid"> res_type_id,res_type </sql> <select id="selectbyId" resultType="com.property.vo

  • Mybatis中foreach标签带来的空格\换行\回车问题及解决方案

    原因 在自已做的内容中通过获取多个商品Id,以此来获取多个商品详细信息.但数据库返回的商品信息的顺序与原来List中产品的id顺序并不匹配,这就导致了前端页面商品的信息显示混乱,不匹配. 通过网上找到order by排序可以有效解决这个问题,返回与查询时的产品id顺序一致.还有一点,List时有序的 这里先附带上这个sql语句(只能在数据库中成功) select prod_id, prod_name, price, `describe`, prod_date, prod_pic, integra

  • 解决Mybatis中mapper.xml文件update,delete及insert返回值问题

    最近写了几个非常简单的接口(CRUD),在单元测试的时候却出了问题,报错如下: Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'messageListener': Unsatisfied dependency expressed through field 'reviewCheckInfoService'; nested exce

  • mybatis中bind标签和concat的使用说明

    首先,二种方式都可以用来模糊查询,都能预防 SQL 注入.但是在更换数据库情况下,bind标签通用. <if test=" userName != null and userName !=""> and userName like concat('%' ,#{userName},'%') </if> 使用concat函数连接字符串,在mysql中这个函数支持多个参数,但是在oracle中这个函数只支持2个参数,由于不同数据库之间的语法差异,更换数据库,

  • Mybatis 中Mapper使用package方式配置报错的解决方案

    踩了个坑,写出来 Mybatis 中Mapper使用package方式配置报错 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found) UserDaoTest中调用了UserDao的insert方法. 1.项目结构如下 2.UserDao接口 package com.mybatis.dao; import org.apache.ibatis.annotations.Mapper; import

  • 解析 MyBatis 中 Mapper 生效的来龙去脉

    目录 一.MyBatis基本使用 1.1 编写配置文件 1.2 编写Mapper接口及测试方法 1.3 结果 二.源码分析 2.1 通过配置文件构建出 SqlSessionFactory 2.2 获取 SqlSession 对象 2.3 根据 SqlSession 获取 Mapper 代理 2.4 通过 Mapper 代理,执行方法操作数据库 2.5 整体流程图 最近闲了快有半个多月了,一直提不起兴致再去看一些书籍(没有以前疯狂吸食知识的欲望了

  • MyBatis中Mapper的注入问题详解

    在 SpringBoot 体系中,MyBatis 对 Mapper 的注入常见的方式我知道的有 2 种: 1.@MapperScan MapperScan 类是 mybatis-spring 包里面的. 通过在启动类上使用 @MapperScan,然后通过 basePackages 属性指定 Mapper 文件所在的目录来进行扫描装载,默认情况下指定目录下的所有.java文件都会被当做 Mapper 来加载处理. @MapperScan(basePackages = "com.test.spri

随机推荐