MyBatis Review——动态sql

        MyBatis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦。拼接的时候要确保不能忘了必要的空格,还要注意省掉列名列表最后的逗号。利用动态 SQL 这一特性可以彻底摆脱这种痛苦。

      通常使用动态 SQL 不可能是独立的一部分,MyBatis 当然使用一种强大的动态 SQL 语言来改进这种情形,这种语言可以被用在任意的 SQL 映射语句中。

     动态 SQL 元素和使用 JSTL 或其他类似基于 XML 的文本处理器相似。在 MyBatis 之前的版本中,有很多的元素需要来了解。MyBatis 3 大大提升了它们,现在用不到原先一半的元素就可以了。MyBatis 采用功能强大的基于 OGNL 的表达式来消除其他元素。

一,使用sql片段

定义sql片段:

<!-- 定义sql片段 id: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">
					<!-- 使用foreache遍历id
							collection:指定输入对象中集合属性
							item:每个遍历生成对象中
							open:开始遍历时候要拼接的串
							close:结束遍历需要拼接的串
							separator:遍历的两个对象中间需要拼接的串
					 -->
					 <!-- 使用下面的sql拼接:
					 	and (id=1 or id=10 or id=16)
					  -->
				<!-- 	<foreach collection="ids" item="item_id" open="and (" close=")" separator="or">
						每次遍历需要拼接的串
						id=#{item_id}
					</foreach> -->

					<!-- 实现and id in(1,10,22) -->
					<foreach collection="ids" item="item_id" open="and id in(" close=")" separator=",">
						<!-- 每次遍历需要拼接的串 -->
						#{item_id}
					</foreach>
				</if>
			</if>

	</sql>

引用sql片段:

<!-- 用户信息综合查询 #{userCustom.sex}:取出包装对象中性别的值 -->
	<select id="findUserList" parameterType="UserQueryVo"
		resultType="UserCustom">
		select id,username,birthday,sex,address from user

		<!-- where可以自动去掉条件中的第一个and -->

		<where>
			<!-- 引用sql片段的id,如果refid指定的id不在本mapper文件中,需要加上namespace -->
			<include refid="query_user_where"></include>

			<!-- 在这里还要引用其他sql片段 -->
		</where>

	</select>

 其他标签:       

  • choose (when, otherwise)
  • trim (where, set)
  • foreach
  • 。。

二,foreach标签的使用

<if test="ids!=null">
					<!-- 使用foreache遍历id
							collection:指定输入对象中集合属性
							item:每个遍历生成对象中
							open:开始遍历时候要拼接的串
							close:结束遍历需要拼接的串
							separator:遍历的两个对象中间需要拼接的串
					 -->
					 <!-- 使用下面的sql拼接:
					 	and (id=1 or id=10 or id=16)
					  -->
				<!-- 	<foreach collection="ids" item="item_id" open="and (" close=")" separator="or">
						每次遍历需要拼接的串
						id=#{item_id}
					</foreach> -->

					<!-- 实现and id in(1,10,22) -->
					<foreach collection="ids" item="item_id" open="and id in(" close=")" separator=",">
						<!-- 每次遍历需要拼接的串 -->
						#{item_id}
					</foreach>
				</if>

  定义的vo中加入list:

时间: 2024-09-28 02:33:47

MyBatis Review——动态sql的相关文章

Spring+Mybatis实现动态SQL查询

在报表类应用中,通常需要根据不同的维度去组合复杂的查询条件,然后构造SQL去执行查询.如果只是通过在程序中简单地拼接SQL语句,工作量会非常大,而且代码可能也非常难以维护.Mybatis支持动态SQL查询功能,可以通过配置动态的SQL来简化程序代码中复杂性,不过,这个颇有点XML编程的韵味,通过XML来处理复杂的数据判断.循环的功能,其实也很好理解. 准备工作 下面,我们首先创建一个MySQL示例表,如下所示: 01 CREATE TABLE `traffic_info` ( 02 `id` i

关于mybatis的动态sql问题

问题描述 关于mybatis的动态sql问题 就是在mybatis中我想写一条sql查询两种列表 想通过参数控制,想问一下查询的字段可不可以通过前台传入的参数进行if标签判断如: select <if test=""timeState !=null and timeState='month'""> to_char(trunc(co.CREATE_TIME)'yyyy-mm-dd') as createTime <if test="&quo

Mybatis解析动态sql原理分析

1.MyBatis一般使用步骤 1.1获取Configuration实例或编写配置文件 //获取Configuration实例的样例 TransactionFactory transactionFactory = new JdbcTransactionFactory();//定义事务工厂 Environment environment = new Environment("development", transactionFactory, dataSource); Configurat

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

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

MyBatis 执行动态 SQL语句详解_java

大家基本上都知道如何使用 MyBatis 执行任意 SQL,使用方法很简单,例如在一个 XXMapper.xml 中: <select id="executeSql" resultType="map"> ${_parameter} </select> 你可以如下调用: sqlSession.selectList("executeSql", "select * from sysuser where enabled

oracle+mybatis 使用动态Sql当插入字段不确定的情况下实现批量insert_oracle

最近做项目遇到一个挺纠结的问题,由于业务的关系,DB的数据表无法确定,在使用过程中字段可能会增加,这样在insert时给我造成了很大的困扰. 先来看一下最终我是怎么实现的: <insert id="batchInsertLine" parameterType="HashMap"> <![CDATA[ INSERT INTO tg_fcst_lines(${lineColumn}) select result.*,sq_fcst_lines.next

mybatis的动态sql详解(精)

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

mybatis中动态sql常用的标签

用来循环容器的标签forEach,查看例子 //mapper中我们要为这个方法传递的是一个容器,将容器中的元素一个一个的 //拼接到xml的方法中就要使用这个forEach这个标签了 public List<Entity> queryById(List<String> userids); //对应的xml中如下 <select id="queryById" resultMap="BaseReslutMap" > select *

后台(41)——MyBatis的动态SQL

探索Android软键盘的疑难杂症 深入探讨Android异步精髓Handler 详解Android主流框架不可或缺的基石 站在源码的肩膀上全解Scroller工作机制 Android多分辨率适配框架(1)- 核心基础 Android多分辨率适配框架(2)- 原理剖析 Android多分辨率适配框架(3)- 使用指南 自定义View系列教程00–推翻自己和过往,重学自定义View 自定义View系列教程01–常用工具介绍 自定义View系列教程02–onMeasure源码详尽分析 自定义View