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. ABP 权限拦截 第二篇

    由于访问人数过多,我今天从新整理一下ABP权限认证机制,帮助大家更容易读懂 1.Abp 的权限拦截主要通过过滤器,    public class AbpAuthorizationFilter : I ...

  2. python_day12_css

    目录: 简介 选择器(selecttor) 常用属性 页面布局 一.简介 1.CSS 定义 CSS是Cascading Style Sheets的简称,中文称为层叠样式表. CSS 规则由两个主要的部 ...

  3. The current state of generics in Delphi( 转载)

    The current state of generics in Delphi   To avoid duplication of generated code, the compiler build ...

  4. Mybatis的针对于同一个有自己父类或子类的递归查询 (如商品分类)

    1.pojo代码 private Integer categoryId; private Integer superId; private String name; private Byte leve ...

  5. 74.CocoaPods安装和使用教程

    CocoaPods安装和使用教程  Code4App 原创文章.转载请注明出处:http://code4app.com/article/cocoapods-install-usage 第一: Coco ...

  6. IntelliJ IDEA 2017版 spring-boot2.0.2 搭建 JPA springboot DataSource JPA sort排序方法使用方式, 添加关联表的 order by

    1.sort可以直接添加在命名格式的字段中 List<BomMain> findAllByDeleted(Integer deleted, Sort sort); 2.可以作为pageab ...

  7. MFC开发中添加自定义消息和消息响应函数

    (1)在.h或.cpp文件定义一个消息 #define CLICK_MESSAGE_BOX WM_USER+1001 //add by 20180612 给主窗口ctrl.cpp发送消息 //自定义消 ...

  8. Redis 基础、高级特性与性能调优

    本文将从Redis的基本特性入手,通过讲述Redis的数据结构和主要命令对Redis的基本能力进行直观介绍.之后概览Redis提供的高级能力,并在部署.维护.性能调优等多个方面进行更深入的介绍和指导. ...

  9. liunx----配置搜狗输入法

    话不多说直接看步骤 * 系统版本: ubuntu 18.04.1 // 查看命令为: # cat /etc/issue 1. 先查看当前系统是否存在 fcitx 框架: # dpkg -l | gre ...

  10. 动态页面技术EL

    1.EL概述: EL表达式可以嵌入再JSP页面内部,减少JSP脚本的编写 EL出现的目的是要替代JSP页面中脚本的编写 EL最重要的作用就是从域中取出数据: 引入: JSP中<%=request ...