SSM-动态SQL

ssm框架 Mybatis 

动态SQL主要是解决同一类SQL语句匹配不同的问题,举个栗子:

加入我要执行一个查询语句,但是是一个不确定的查询语句,可能会根据ID去查,如果ID没有就可能根据名字去查,或者说同时根据两个去查。那么这时候SQL语句就是不确定的,就要用到mybatis动态SQL语句了,同时Mybatis是基于OGNL表达式的。

动态SQL语句

  • if
  • where
  • choose
    • when
    • otherwise
  • set
  • trim
  • foreach
  • sql
  • include
  • bind

数据形式

id the_name flower
1 小明 小红花

if

if很简单的知道,就是判断条件的。
xml映射文件配置文件

<!--动态SQL if语句-->
<select id="query1" resultType="com.weno.pojo.Girl">
select * from Girl where
<if test= "the_name != null">
the_name = #{the_name}
</if>
<if test= "flower != null">
and flower = #{flower};
</if>
</select>
@Test
public void m006() {
SqlSession sqlSession = MybatisUtil.getSession(); GirlMapper mapper = sqlSession.getMapper(GirlMapper.class); Girl g= new Girl(); g.setName("小明");
// g.setFlower("小红花");
Girl girl=mapper.query1(g); sqlSession.commit();
sqlSession.close();
System.out.printf(girl.toString());
}

如果此时我们将小红花注释掉查看一下运行结果:

DEBUG [main] - ==>  Preparing: select * from Girl where the_name = ?
DEBUG [main] - ==> Parameters: 小明(String)
TRACE [main] - <== Columns: id, the_name, flower
TRACE [main] - <== Row: 1, 小明, 小红花
DEBUG [main] - <== Total: 1

在SQL语句中并没有加上flower语句。但是此时却有一个问题,如果the_namenull,而flower不为null,那么在SQL语句中岂不是多了一个and,变成了:

DEBUG [main] - ==>  Preparing: select * from Girl where and flower = ?;

这时候程序肯定报错,那么我们该如何处理呢?那么接下来说一下where标签。

where

任然使用上面的例子:

<select id="query2" resultType="com.weno.pojo.Girl">
select * from Girl
<where>
<if test="the_name != null">
and the_name = #{the_name}
</if>
<if test="flower != null">
and flower = #{flower}
</if>
</where>
</select>

这个跟上面的区别就是将where改成了<where>标签。
<where>在这里的作用就是当标签中有返回值时,就插入一个where,同时,如果标签是以ANDOR【不区分大小写】开头时,就剔除。

choose

choose语句有点类似Java中的switch,当有一个符合时,就选择那一个并跳出。
映射文件

<select id="query3" resultType="com.weno.pojo.Girl">
select * from Girl where
<choose>
<when test="id != null and id!=''">
id = #{id}
</when>
<when test="the_name != null and the_name != ''">
the_name = #{the_name}
</when> <otherwise>
flower = #{flower}
</otherwise>
</choose>
</select>

在这种情况下,如果id符合的话,就不会再考虑下面的了。

@Test
public void m008() {
SqlSession sqlSession = MybatisUtil.getSession();
GirlMapper mapper = sqlSession.getMapper(GirlMapper.class);
Girl g= new Girl();
g.setId(1);
g.setName("小明");
g.setFlower("小红花");
Girl girl=mapper.query3(g);
sqlSession.commit();
sqlSession.close();
System.out.printf(girl.toString());
}

SQL语句,在其中并没有选择the_name

DEBUG [main] - ==>  Preparing: select * from Girl where id = ?

set

set是一个更新数据的标签

<update id="update1">
update Girl set the_name=#{the_name},flower=#{flower} where id=#{id};
</update>

java代码:

@Test
public void m009() {
SqlSession sqlSession = MybatisUtil.getSession();
GirlMapper mapper = sqlSession.getMapper(GirlMapper.class);
Girl g= new Girl();
g.setId(1);
g.setName("小红");
// g.setFlower("小明花");
mapper.update1(g);
sqlSession.commit();
sqlSession.close();
}

如果此时这样执行,那么在数据库表里面,flower的数据即为null。假如此时,使用if标签

<update id="update2">
update Girl set
<if test="the_name != null and the_name != ''">
the_name=#{the_name},
</if>
<if test="flower != null and flower != ''">
flower=#{flower}
</if>
where id=#{id};
</update>

那么此时会出现一个问题,如果第一个符合,而第二个不符合,那么就会多一个,,此时使用<set>标签就可以解决这个问题

<update id="update3">
update Girl
<set>
<if test="the_name != null and the_name != ''">
the_name=#{the_name},
</if>
<if test="flower != null and flower != ''">
flower=#{flower},
</if>
</set>
where id=#{id};
</update>

<set>标签和<where>有点类似,在<set>标签中,如果结尾有逗号,就将逗号去除。

trim

<trim>就很神奇了,它既可以实现<set>的功能,也能够实现<where>的功能。

trim可以在前面增加和删除内容,也可在在后面也执行此操作。

<update id="query0">
<trim prefixOverrides="and | or">
<if test="the_name != null">
and the_name = #{the_name}
</if>
<if test="flower != null">
and flower = #{flower}
</if>
</trim>
</update>

去除第一个and或则是or

  • prefix:前缀      
  • prefixoverride:去掉第一个a
  • suffix:后缀  
  • suffixoverride:去掉最后一个

foreach

foreach 类似for循环。

改写我们用 foreach 来改写 select * from Girl where id in (1,2,3)

映射文件

    <!-- collection:指定输入对象中的集合属性,使用@Param("ids")指令名字
item:每次遍历生成的对象
open:开始遍历时的拼接字符串
close:结束时拼接的字符串
separator:遍历对象之间需要拼接的字符串
select * from Girl where id in (1,2,3) -->
<select id="queryByIDs" resultType="com.weno.pojo.Girl">
select * from Girl where
<foreach collection="ids" item="id" open="id in (" close=" ) " separator=",">
#{id}
</foreach>
</select>

sql

SQL片段主要是为了提高效率,可以讲动态SQL的判断部分独立处理,提高程序的复用率。

<!-- id是sql片段的标识,一定要唯一 -->
<sql id="sql_1">
<if test="the_name != null and the_name != ''">
the_name = #{the_name}
</if>
</sql>

注意:在SQL片段中,不要包括where

include

引用SQL片段,使用上面的例子

<select id="query2" resultType="com.weno.pojo.Girl">
select * from Girl
<where>
<include refid="sql_1"/>
<if test="flower != null">
and flower = #{flower}
</if>
</where>

就是如此简单。

bind

<bind>简单的来说,就是使值变成另外一个。

例如在模糊查询语句中要使传入的值变成%*%,那么就使用bind进行连接。

<select id="queryLikeByName" resultType="com.weno.pojo.Girl">
select * from Girl
<bind name="_name" value="'%'+the_name+'%'"/>
<!-- 如果the_name代表A,那么_name则代表%A% -->
where the_name like #{_name}
</select>

mybati的动态语句大概就这样了,如果学会了使用,那么毋庸置疑,可以大量的提高我们的效率。
不过更多的mybatis的使用,可以参考mybatis的 官方文档

妈耶,第一次写这么多的字,纪念一下!!

SSM-动态SQL的更多相关文章

  1. ssm动态sql语句

    1.将上面的元素分为四组来演示,分别为:[if,where,trim],[if,set,trim],[choose,when,otherwise],[foreach] ________________ ...

  2. SSM框架开发web项目系列(四) MyBatis之快速掌握动态SQL

    前言 通过前面的MyBatis部分学习,已经可以使用MyBatis独立构建一个数据库程序,基本的增删查改/关联查询等等都可以实现了.简单的单表操作和关联查询在实际开的业务流程中一定会有,但是可能只会占 ...

  3. 【JAVA - SSM】之MyBatis动态SQL

    动态SQL就是在SQL语句中添加一些标签,以完成某些逻辑.通常用到的动态SQL标签有<if>.<choose>.<where>.<trim>.<s ...

  4. Java SSM框架之MyBatis3(八)MyBatis之动态SQL

    前言: mybatis框架中最具特色的便是sql语句中的自定义,而动态sql的使用又使整个框架更加灵活. 创建User表 /*Table structure for table `user` */ D ...

  5. SSM框架之Mybatis(6)动态SQL

    Mybatis(6)动态SQL 1.动态SQL 出现原因:有些时候业务逻辑复杂时,我们的 SQL 是动态变化的,此时在前面的学习中我们的 SQL 就不能满足要求了 1.1.if标签 我们根据实体类的不 ...

  6. MyBatis --- 动态SQL、缓存机制

    有的时候需要根据要查询的参数动态的拼接SQL语句 常用标签: - if:字符判断 - choose[when...otherwise]:分支选择 - trim[where,set]:字符串截取,其中w ...

  7. JAVAEE——Mybatis第二天:输入和输出映射、动态sql、关联查询、Mybatis整合spring、Mybatis逆向工程

    1. 学习计划 1.输入映射和输出映射 a) 输入参数映射 b) 返回值映射 2.动态sql a) If标签 b) Where标签 c) Sql片段 d) Foreach标签 3.关联查询 a) 一对 ...

  8. mybatis原理分析学习记录,mybatis动态sql学习记录

    以下个人学习笔记,仅供参考,欢迎指正. MyBatis 是支持定制化 SQL.存储过程以及高级映射的持久层框架,其主要就完成2件事情: 封装JDBC操作 利用反射打通Java类与SQL语句之间的相互转 ...

  9. 值得注意的ibatis动态sql语法格式

    一.Ibatis常用动态sql语法,简单粗暴用一例子 <select id="iBatisSelectList" parameterClass="java.util ...

  10. Mysql - 游标/动态sql/事务

    游标这个在我目前的项目里面用的还不多, 但是其功能还是很强大的. 动态sql以前都没用过, 是跟着富士康(不是张全蛋的富土康哦)过来的同事学的. 还是挺好用的. 我的数据库方面, 跟他学了不少. 在此 ...

随机推荐

  1. 深拷贝 deepAssign

    实现代码: <script type="text/javascript"> Object.deepAssign = function() { var args = Ar ...

  2. MFC程序执行后台操作时不允许操作界面的一种方法

    在使用MFC编写界面程序时,有时候会遇到像点击按钮后,后台进行大量操作后才显示处理结果这种情况,在后台处理过程中,界面不应该被允许做任何操作,这里介绍一种方法. 解决办法 点击按钮后,弹出一个模态对话 ...

  3. ABP框架系列之三十四:(Multi-Tenancy-多租户)

    What Is Multi Tenancy? "Software Multitenancy refers to a software architecture in which a sing ...

  4. Codeforces Round #546 (Div. 2) E 推公式 + 线段树

    https://codeforces.com/contest/1136/problem/E 题意 给你一个有n个数字的a数组,一个有n-1个数字的k数组,两种操作: 1.将a[i]+x,假如a[i]+ ...

  5. 02-jQuery的选择器

    我们以前在CSS中学习的选择器有: 今天来学习一下jQuery 选择器. jQuery选择器是jQuery强大的体现,它提供了一组方法,让我们更加方便的获取到页面中的元素. 1.jQuery 的基本选 ...

  6. 【repost】JavaScript 基本语法

    JavaScript 基本语法,JavaScript 引用类型, JavaScript 面向对象程序设计.函数表达式和异步编程 三篇笔记是对<JavaScript 高级程序设计>和 < ...

  7. postgresql vacuum操作

    postgresql vacuum操作 PostgreSQL数据库管理工作中,定期vacuum是一个重要的工作.vacuum的效果: 1.1释放,再利用 更新/删除的行所占据的磁盘空间. 1.2更新P ...

  8. kaldi的TIMIT实例二

    ============================================================================ MonoPhone Training & ...

  9. maya2013卸载/安装失败/如何彻底卸载清除干净maya2013注册表和文件的方法

    maya2013提示安装未完成,某些产品无法安装该怎样解决呢?一些朋友在win7或者win10系统下安装maya2013失败提示maya2013安装未完成,某些产品无法安装,也有时候想重新安装maya ...

  10. Android 从浏览器启动应用

    核心逻辑为AndroidMainfest.xml里面的指定Activity里增加配置: <intent-filter> <data android:scheme="***& ...