Mybatis输入输出映射及动态SQL Review

一、输入映射

通过parameterType指定输入参数的类型,可以是简单类型、pojo包装类、HashMap等

1、输入简单类型

<select id="findUserById" parameterType="int" resultType="com.mybatis.po.User">
    select * from user where id=#{id}
</select> 

2、输入pojo包装类

<select id="findUserById" parameterType="om.mybatis.po.User" resultType="com.mybatis.po.User">
    select * from user where username like ‘%{user.username}%'
</select>

Pojo类可根据业务需求,创建某单一实体的扩展实体,User类的扩展类-User和订单实体的综合实体。

3、输入HashMap类型

<select id="findUserById" parameterType="hashmap" resultType="com.mybatis.po.User">
    select * from user where id=#{id} and username like ‘%{username}%'
</select> 

参数id 和username 对应hashmap中的key-value

二、输出映射

1、resultType类型输出

使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。适用于单表查询,级联查询时使用该类型输出需要重新创建关联pojo扩展类进行映射。

如果查询出来的列名和pojo中的属性名全部不一致,就不会创建该pojo对象。只要查询出来的列名和pojo中的属性有一个一致,就会创建pojo对象。映射失败的查询字段返回为空。

2、resultMap类型输出

如果查询出来的列名和pojo的属性名不一致时,可使用resultMap,通过定义一个resultMap列名和pojo属性名之间作一个映射关系。得以映射输出结果。

1)定义resultMap

<!-- 定义resultMap
将SELECT id id_,username username_ FROM USER 和User类中的属性作一个映射关系
type:resultMap最终映射的java对象类型,可以使用别名
id:对resultMap的唯一标识
 -->
 <resultMap type="user" id="userResultMap">
  <!-- id表示查询结果集中唯一标识
  column:查询出来的列名
  property:type指定的pojo类型中的属性名
  最终resultMap对column和property作一个映射关系 (对应关系)
  -->
  <id column="id_" property="id"/>
  <!-- result:对普通名映射定义
  column:查询出来的列名
  property:type指定的pojo类型中的属性名
  最终resultMap对column和property作一个映射关系 (对应关系)
   -->
  <result column="username_" property="username"/>
 </resultMap> 

2)使用resultMap作为statement的输出映射类型

<!-- 使用resultMap进行输出映射
resultMap:指定定义的resultMap的id,如果这个resultMap在其它的mapper文件,前边需要加namespace
-->
<select id="findUserByIdResultMap" parameterType="int" resultMap="userResultMap">
  SELECT id id_,username username_ FROM USER WHERE id=#{value}
</select> 

三、动态SQL

Mybatis核心 对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接、组装。

 1、动态SQL示例

首先创建pojo类,提供该pojo对应的mapper映射文件,对crud方法分别配置

<update id="updateByExampleSelective" parameterType="map" >
  update items
  <set >
   <if test="record.id != null" >
    id = #{record.id,jdbcType=INTEGER},
   </if>
   <if test="record.name != null" >
    name = #{record.name,jdbcType=VARCHAR},
   </if>
   <if test="record.price != null" >
    price = #{record.price,jdbcType=REAL},
   </if>
   <if test="record.pic != null" >
    pic = #{record.pic,jdbcType=VARCHAR},
   </if>
   <if test="record.createtime != null" >
    createtime = #{record.createtime,jdbcType=TIMESTAMP},
   </if>
   <if test="record.detail != null" >
    detail = #{record.detail,jdbcType=LONGVARCHAR},
   </if>
  </set>
  <if test="_parameter != null" >
   <include refid="Update_By_Example_Where_Clause" />
  </if>
 </update> 

2、SQL片段

将SQL中的判断条件进行封装,提高复用

1)定义sql片段

<!-- 定义sql片段
  id:sql片段的唯 一标识
  最好基于单表来定义sql片段,这样话这个sql片段可重用性才高
  在sql片段中不要包括 where
   -->
  <sql id="query_user_where">
    <if test="userCustom!=null">
      <if test="userCustom.sex!=null and userCustom.sex!=''">
        and user.sex = #{userCustom.sex}
      </if>
      <if test="userCustom.username!=null and userCustom.username!=''">
        and user.username LIKE '%${userCustom.username}%'
      </if>
      <if test="ids!=null">
      <!-- 使用 foreach遍历传入ids
      collection:指定输入 对象中集合属性
      item:每个遍历生成对象中
      open:开始遍历时拼接的串
      close:结束遍历时拼接的串
      separator:遍历的两个对象中需要拼接的串
       -->
       <!-- 使用实现下边的sql拼接:
       AND (id=1 OR id=10 OR id=16)
       -->
      <foreach collection="ids" item="user_id" open="AND (" close=")" separator="or">
        <!-- 每个遍历需要拼接的串 -->
        id=#{user_id}
      </foreach>
      <!-- 实现 “ and id IN(1,10,16)”拼接 -->
      <!-- <foreach collection="ids" item="user_id" open="and id IN(" close=")" separator=",">
        每个遍历需要拼接的串
        #{user_id}
      </foreach> -->
      </if>
    </if>
  </sql> 

2)引用sql片段

<!-- 用户信息综合查询
  #{userCustom.sex}:取出pojo包装对象中性别值
  ${userCustom.username}:取出pojo包装对象中用户名称
   -->
<select id="findUserList" parameterType="cn.itcast.mybatis.po.UserQueryVo" resultType="cn.itcast.mybatis.po.UserCustom">
  SELECT * FROM USER
  <!--
  where可以自动去掉条件中的第一个and
   -->
  <where>
    <!-- 引用sql片段 的id,如果refid指定的id不在本mapper文件中,需要前边加namespace -->
    <include refid="query_user_where"></include>
    <!-- 在这里还要引用其它的sql片段 -->
  </where>
</select> 

注:在使用动态sql时注意

1、#{}和${}的不同

#{}表示一个占位符号,#{}接收输入参数,类型可以是简单类型,pojo、hashmap。当使用#{}接收简单类型参数时,#{}中可以写成value或其它名称。当接收pojo对象值,写入对象的属性值,形如对象.属性.属性.属性...的方式获取。

${}${}表示一个拼接符号,接收输入参数,类型可以是简单类型,pojo、hashmap。接收简单类型,${}中只能写成value。接受pojo对象时,与#{}相同。注意使用$拼接,会引用sql注入,所以不建议使用${}。

2、使用where 标签,第一个and 条件为空时,自动跳过。所以可以不添加where 1=1 保证sql语法正确。

3、使用sql执行insert之后返回主键id-selectKey元素的使用&SELECT LAST_INSERT_ID() 函数的使用

1)id为自增类型

<!-- 添加用户
parameterType:指定输入 参数类型是pojo(包括 用户信息)
#{}中指定pojo的属性名,接收到pojo对象的属性值,mybatis通过OGNL获取对象的属性值
-->
<insert id="insertUser" parameterType="cn.itcast.mybatis.po.User">
  <!--
  将插入数据的主键返回,返回到user对象中
  SELECT LAST_INSERT_ID():得到刚insert进去记录的主键值,只适用与自增主键
  keyProperty:将查询到主键值设置到parameterType指定的对象的哪个属性
  order:SELECT LAST_INSERT_ID()执行顺序,相对于insert语句来说它的执行顺序
  resultType:指定SELECT LAST_INSERT_ID()的结果类型
   -->
  <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
    SELECT LAST_INSERT_ID()
  </selectKey>
  insert into user(username,birthday,sex,address) value(#{username},#{birthday},#{sex},#{address})
</insert> 

2)id非自增,uuid类型-mysql select uuid()函数

<!--
使用mysql的uuid()生成主键
执行过程:
首先通过uuid()得到主键,将主键设置到user对象的id属性中
其次在insert执行时,从user对象中取出id属性值
 -->
<selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String">
  SELECT uuid()
</selectKey>
insert into user(id,username,birthday,sex,address) value(#{id},#{username},#{birthday},#{sex},#{address}) 

以上所述是小编给大家介绍的Mybatis输入输出映射及动态SQL Review,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • MyBatis动态SQL标签用法实例详解

    1.动态SQL片段 通过SQL片段达到代码复用 <!-- 动态条件分页查询 --> <sql id="sql_count"> select count(*) </sql> <sql id="sql_select"> select * </sql> <sql id="sql_where"> from icp <dynamic prepend="where&quo

  • mybatis教程之动态sql语句_动力节点Java学院整理

    有些时候,sql语句where条件中,需要一些安全判断,例如按某一条件查询时如果传入的参数是空,此时查询出的结果很可能是空的,也许我们需要参数为空时,是查出全部的信息.使用Oracle的序列.mysql的函数生成Id.这时我们可以使用动态sql. 下文均采用mysql语法和函数(例如字符串链接函数CONCAT). selectKey 标签 在insert语句中,在Oracle经常使用序列.在MySQL中使用函数来自动生成插入表的主键,而且需要方法能返回这个生成主键.使用myBatis的selec

  • 详解Java的MyBatis框架中动态SQL的基本用法

    有些时候,sql语句where条件中,需要一些安全判断,例如按某一条件查询时如果传入的参数是空,此时查询出的结果很可能是空的,也许我们需要参数为空时,是查出全部的信息.使用Oracle的序列.mysql的函数生成Id.这时我们可以使用动态sql.下文均采用mysql语法和函数(例如字符串链接函数CONCAT). selectKey 标签 在insert语句中,在Oracle经常使用序列.在MySQL中使用函数来自动生成插入表的主键,而且需要方法能返回这个生成主键.使用myBatis的select

  • MyBatis实践之动态SQL及关联查询

    序言 MyBatis,大家都知道,半自动的ORM框架,原来叫ibatis,后来好像是10年apache软件基金组织把它托管给了goole code,就重新命名了MyBatis,功能相对以前更强大了.它相对全自动的持久层框架Hibernate,更加灵活,更轻量级,这点我还是深有体会的. MyBatis的一个强大特性之一就是动态SQL能力了,能省去我们很多串联判断拼接SQL的痛苦,根据项目而定,在一定的场合下使用,能大大减少程序的代码量和复杂程度,不过还是不是过度太过复杂的使用,以免不利于后期的维护

  • Mybatis入门教程(四)之mybatis动态sql

    推荐阅读: MyBatis入门学习教程(一)-MyBatis快速入门  什么是动态SQL? 动态SQL有什么作用? 传统的使用JDBC的方法,相信大家在组合复杂的的SQL语句的时候,需要去拼接,稍不注意哪怕少了个空格,都会导致错误.Mybatis的动态SQL功能正是为了解决这种问题, 其通过 if, choose, when, otherwise, trim, where, set, foreach标签,可组合成非常灵活的SQL语句,从而提高开发人员的效率. 下面就去感受Mybatis动态SQL

  • mybatis的动态sql详解(精)

    MyBatis 的一个强大的特性之一通常是它的动态 SQL 能力.如果你有使用 JDBC 或其他 相似框架的经验,你就明白条件地串联 SQL 字符串在一起是多么的痛苦,确保不能忘了空 格或在列表的最后省略逗号.动态 SQL 可以彻底处理这种痛苦. 通常使用动态SQL不可能是独立的一部分,MyBatis当然使用一种强大的动态SQL语言来改进这种情形,这种语言可以被用在任意映射的SQL语句中. 动态SQL元素和使用 JSTL或其他相似的基于XML的文本处理器相似.在MyBatis之前的版本中,有很多

  • 详解Mybatis动态sql

    1.什么是mybatis动态sql 看到动态,我们就应该想到,这是一个可以变化的sql语句 MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑 2.mybatis动态sql使用前准备 a.数据库表 b.创建类 3.使用mybatis动态sql,得先知道一些属性值 一,插入 selectKey:在sql语句前后或后执行的sql语句 keyColumn:对应字段名或别名 keyProperty:对应实体类的属性名或map的key值 order:在执行语句

  • MyBatis使用动态SQL标签的小陷阱

    MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录. 现在MyBatis越来越受大家的喜爱了,它的优势大家都知道,我就不多说了,直接说重点. MyBatis中提供动态SQL功能,我们可以使用<if><when&

  • Mybatis输入输出映射及动态SQL Review

    一.输入映射 通过parameterType指定输入参数的类型,可以是简单类型.pojo包装类.HashMap等 1.输入简单类型 <select id="findUserById" parameterType="int" resultType="com.mybatis.po.User"> select * from user where id=#{id} </select> 2.输入pojo包装类 <select

  • Mybatis高级映射、动态SQL及获得自增主键的解析

    MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis .下文给大家介绍Mybatis高级映射.动态SQL及获得自增主键的内容,具体详情请参考本文. 一.动态SQL 相信大家在用mybatis操作数据库时时都会碰到一个问题,假如现在我们有一个关于作者的list authorList,需要根据authorList里已有的作者信息在数据库中查询相应作者的博客信息.

  • Mybatis中输入输出映射与动态Sql图文详解

    一.输入映射 我们通过配置parameterType的值来指定输入参数的类型,这些类型可以是简单数据类型.POJO.HashMap等数据类型 1.简单类型 2.POJO包装类型 ①这是单表查询的时候传入的POJO包装类型,即可以直接传入实体类,但是当多表查询的时候,就需要自定义POJO类型 ②我们使用自定义POJO类型来具体的了解一下 先设计 包装类型如下,其中UserPOJO是除了User本身之外的添加的其他跟User相关的属性的包装类,UserVo是用于视图层面的包装类型,同样也是作为Map

  • SpringBoot使用Mybatis注解实现分页动态sql开发教程

    目录 一.环境配置 二.Mybatis注解 三.方法参数读取 1.普通参数读取 2.对象参数读取 四.分页插件的使用 五.动态标签 六.完整示例 一.环境配置 1.引入mybatis依赖 compile( //SpringMVC 'org.springframework.boot:spring-boot-starter-web', "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.9.3", //Mybatis依赖及分页

  • Mybatis超级强大的动态SQL语句大全

    目录 1. If 语句 2. Where语句 2.1 和 where 元素等价的自定义 trim 元素 3. Set语句 3.1 与 set 元素等价的自定义 trim 元素 4. Choose语句 5. Foreach语句 6. SQL片段 7. Bind元素 附:MyBatis配置动态SQL语句 总结 1. If 语句 需求:根据作者名字和博客名字来查询博客!如果作者名字为空,那么只根据博客名字查询,反之,则根据作者名来查询 <!--需求1: 根据作者名字和博客名字来查询博客! 如果作者名字

  • Mybatis中xml的动态sql实现示例

    目录 动态SQL简介 一.#{}与${}区别#{}表示一个占位符,使用占位符可以防止sql注入, 二.传递包装类型 三.动态sql—类型 四.动态sql—详解 (一)if 语句处理 (二)choose (when,otherwize)语句处理 (三)trim 语句处理 (四)where 语句处理 (五)foreach 语句处理 动态SQL简介 动态 SQL 是 MyBatis 的强大特性之一. 如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接

  • Mybatis模糊查询和动态sql语句的用法

    Mybatis 模糊查询和动态sql语句 模糊查询 对数据库最常用的操作就是查询了,但是如何使用Mybatis进行模糊查询呢?下面先看一个简单的模糊查询 <select id="select01" resultMap="BasicResultMap"> SELECT * FROM oa_employee WHERE emp_name LIKE #{asd} </select> 这是一条伪模糊查询, 因为没有实现真正的模糊 "%&qu

  • Spring Boot整合mybatis使用注解实现动态Sql、参数传递等常用操作(实现方法)

    前面介绍了Spring Boot 整合mybatis 使用注解的方式实现数据库操作,介绍了如何自动生成注解版的mapper 和pojo类. 接下来介绍使用mybatis 常用注解以及如何传参数等数据库操作中的常用操作. 其实,mybatis 注解方式 和 XML配置方式两者的使用基本上相同,只有在构建 SQL 脚本有所区别,所以这里重点介绍两者之间的差异,以及增删改查,参数传递等注解的常用操作. 详解SpringBoot 快速整合Mybatis(去XML化+注解进阶)已经介绍过了,不清楚的朋友可

  • MyBatis 超详细讲解动态SQL的实现

    目录 情景: 概述: SQL元素: <if>: <choose>: <where>: <trim>: <set>: <foreach>: <bind>: 情景: 我们在使用JDBC或者其他类似的框架开发进行数据库开发时,通常要根据需求动手组装SQL,不用想都觉得是件很痛苦的事情了,而Mybatis框架提供的对SQL语句动态组装的功能,能很好地解决这个麻烦. 概述: 动态SQL是MyBatis框架的一个强大特性,MyBati

  • MyBatis 超详细讲解动态SQL的实现

    目录 情景: 概述: SQL元素: <if>: <choose>: <where>: <trim>: <set>: <foreach>: <bind>: 情景: 我们在使用JDBC或者其他类似的框架开发进行数据库开发时,通常要根据需求动手组装SQL,不用想都觉得是件很痛苦的事情了,而Mybatis框架提供的对SQL语句动态组装的功能,能很好地解决这个麻烦. 概述: 动态SQL是MyBatis框架的一个强大特性,MyBati

随机推荐