热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MyBatisDynamicSQL

MyBatis的动态SQL使用OGNL表达式http:commons.apache.orgpropercommons-ognllanguage-guide.html在XML中的一些

MyBatis 的动态 SQL 使用 OGNL 表达式

http://commons.apache.org/proper/commons-ognl/language-guide.html

在 XML 中的一些特殊字符需要转义,参考 HTML ISO-8859-1 手册

http://www.w3school.com.cn/tags/html_ref_entities.html

 

https://www.cnblogs.com/jhxxb/p/10637219.html

<select id="selectMyUserByIF" resultType="myUser" parameterType="myUser">
    select * from myuser where
    <if test="id != null">
      id = #{id}
    if>
    <if test="name != null && name != """>
      and name like #{name}
    if>
    <if test="age == 0 or age == 1">
      and age = #{age}
    if>
select>

入参没有ID属性时会报错,会拼接成 where and,解决:可以在 where 后添加一个恒成立,如 1=1。或者使用 where 标签,会自动去除 SQL 中多出来的 and 或 or

MyBatis Dynamic SQL

 

二、WHERE

<select id="selectMyUserByIF" resultType="myUser" parameterType="myUser">
    select * from myuser
    <where>
        <if test="id != null">
          id = #{id}
        if>
        <if test="name != null and name != ''.toString()">
          and name like #{name}
        if>
        <if test="age == 0 or age == 1">
          and age = #{age}
        if>
    where>
select>

where 标签只能去除第一个 and 或 or,所以不能把条件符号写多个或写在后面

MyBatis Dynamic SQLMyBatis Dynamic SQL

 

三、SET

<update id="updateMyUser" parameterType="myUser">
    update myuser
    
    <set>
        <if test="name != null">
          name = #{name},
        if>
        <if test="age != null">
          age = #{age}
        if>
    set>
    where id = #{id}
update>

 

四、TRIM

<select id="selectMyUserByIF" resultType="myUser" parameterType="myUser">
    select * from myuser
    
    <trim prefix="where" prefixOverrides="AND | OR" suffixOverrides="and">
        <if test="id != null">
            id = #{id} and
        if>
        <if test="name != null and name.trim() != ''">
            name like #{name}
        if>
    trim>
select>

trim 标签可以替代 where 标签


<trim prefix="WHERE" prefixOverrides="AND |OR ">
    ...
trim>

trim 标签也可以替代 set 标签


<trim prefix="set" suffixOverrides=",">
  ...
trim>

 

五、CHOOSE

<select id="selectMyUserByIF" resultType="myUser" parameterType="myUser">
    select * from myuser
    <where>
        
        <choose>
            <when test="id != null">
              id = #{id}
            when>
            <when test="name != null and name.trim() != ''">
              name like #{name}
            when>
            <otherwise>
              age = 22
            otherwise>
        choose>
    where>
select>

 

六、FOREACH

Map 入参


<select id="selectMyUserByArray" resultType="myUser">
    select * from myuser where id in
    
    <foreach collection="ids" item="item" index="index" separator="," open="(" close=")">
        #{item}
    foreach>
select>

测试代码

public static void main(String[] args) {
    SqlSession session = null;
    try {
        InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        session = sqlSessionFactory.openSession();

        MyUserMapper mapper = session.getMapper(MyUserMapper.class);
        Map ids = new HashMap<>(10);
        ids.put("ids",Arrays.asList(7,8,9,10));
        ids.put("b",8);
        System.out.println(mapper.selectMyUserByArray(ids));
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (session != null) {
            session.close();
        }
    }
}

MyBatis Dynamic SQL

List 入参


<select id="selectMyUserByArray" resultType="myUser">
    select * from myuser where id in
    <foreach collection="list" item="item" index="index" separator="," open="(" close=")">
      #{item}
    foreach>
select>

Array 入参


<select id="selectMyUserByArray" resultType="myUser">
    select * from myuser
    <foreach collection="array" item="item" index="index" separator="," open="where id in (" close=",20)">
      #{item}
    foreach>
select>

 

七、内置参数


<select id="selectMyUserById" resultType="myUser">
    <if test="_databaseId == 'mysql'">
        select * from myuser
        <if test="_parameter != null">
            where id = #{_parameter}
        if>
    if>
    <if test="_databaseId == 'oracle'">
        select * from oracle_myuser
        <if test="_parameter != null">
            where name = #{_parameter.name}
        if>
    if>
select>

 

八、BIND

<select id="selectMyUserByNameLike" resultType="myUser" parameterType="string">
    select * from myuser where name like #{name}
select>

例 SQL 映射想变为模糊查询有几种方式

1.传入参数时加上 %

2.改用 ${name} 来取值。name 取值会报错,用 _parameter 取值

<select id="selectMyUserByNameLike" resultType="myUser">
    select * from myuser where name like '%${_parameter}%'
select>

3.使用 bind 标签

<select id="selectMyUserByNameLike" resultType="myUser">
  
    <bind name="_name" value="'%'+_parameter+'%'"/>
    select * from myuser where name like #{_name}
select>

 

九、SQL 复用


<sql id="columnNames">
    <if test="_databaseId=='mysql'">
        ${id},name,age
    if>
    <if test="_databaseId=='oracle'">
        xxx,xxx,xxx
    if>
sql>
<select id="selectMyUserByNameLike" resultType="myUser" parameterType="string">
    select
    <include refid="columnNames">
      <property name="id" value="id"/>
    include>
    from myuser where name like #{name}
select>

 


可以使用其他语言来写动态 SQL:MyBatis-Velocity、MyBatis-FreeMarker 和自带的 XML

http://www.mybatis.org/velocity-scripting/

http://www.mybatis.org/freemarker-scripting/

https://www.jianshu.com/p/cecc187410be

https://mybatis.org/mybatis-dynamic-sql/


推荐阅读
  • 本文总结和分析了JDK核心源码(2)中lang包下的基础知识,包括常用的对象类型包和异常类型包。在对象类型包中,介绍了Object类、String类、StringBuilder类、StringBuffer类和基本元素的包装类。在异常类型包中,介绍了Throwable类、Error类型和Exception类型。这些基础知识对于理解和使用JDK核心源码具有重要意义。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了一种在PHP中对二维数组根据某个字段进行排序的方法,以年龄字段为例,按照倒序的方式进行排序,并给出了具体的代码实现。 ... [详细]
  • Todayatworksomeonetriedtoconvincemethat:今天在工作中有人试图说服我:{$obj->getTableInfo()}isfine ... [详细]
  • Java如何导入和导出Excel文件的方法和步骤详解
    本文详细介绍了在SpringBoot中使用Java导入和导出Excel文件的方法和步骤,包括添加操作Excel的依赖、自定义注解等。文章还提供了示例代码,并将代码上传至GitHub供访问。 ... [详细]
  • 本文介绍了在实现了System.Collections.Generic.IDictionary接口的泛型字典类中如何使用foreach循环来枚举字典中的键值对。同时还讨论了非泛型字典类和泛型字典类在foreach循环中使用的不同类型,以及使用KeyValuePair类型在foreach循环中枚举泛型字典类的优势。阅读本文可以帮助您更好地理解泛型字典类的使用和性能优化。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
author-avatar
蕶ok薍
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有