热门标签 | 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/


推荐阅读
  • 本文详细介绍了优化DB2数据库性能的多种方法,涵盖统计信息更新、缓冲池调整、日志缓冲区配置、应用程序堆大小设置、排序堆参数调整、代理程序管理、锁机制优化、活动应用程序限制、页清除程序配置、I/O服务器数量设定以及编入组提交数调整等方面。通过这些技术手段,可以显著提升数据库的运行效率和响应速度。 ... [详细]
  • PHP 实现多级树形结构:构建无限层级分类系统
    在众多管理系统中,如菜单、分类和部门等模块,通常需要处理层级结构。为了高效管理和展示这些层级数据,本文将介绍如何使用 PHP 实现多级树形结构,并提供代码示例以帮助开发者轻松实现无限分级。 ... [详细]
  • 本章详细介绍SP框架中的数据操作方法,包括数据查找、记录查询、新增、删除、更新、计数及字段增减等核心功能。通过具体示例和详细解析,帮助开发者更好地理解和使用这些方法。 ... [详细]
  • 本文介绍了如何在多线程环境中实现异步任务的事务控制,确保任务执行的一致性和可靠性。通过使用计数器和异常标记字段,系统能够准确判断所有异步线程的执行结果,并根据结果决定是否回滚或提交事务。 ... [详细]
  • 深入解析Java枚举及其高级特性
    本文详细介绍了Java枚举的概念、语法、使用规则和应用场景,并探讨了其在实际编程中的高级应用。所有相关内容已收录于GitHub仓库[JavaLearningmanual](https://github.com/Ziphtracks/JavaLearningmanual),欢迎Star并持续关注。 ... [详细]
  • 在 Android 开发中,通过 Intent 启动 Activity 或 Service 时,可以使用 putExtra 方法传递数据。接收方可以通过 getIntent().getExtras() 获取这些数据。本文将介绍如何使用 RoboGuice 框架简化这一过程,特别是 @InjectExtra 注解的使用。 ... [详细]
  • 探讨 HDU 1536 题目,即 S-Nim 游戏的博弈策略。通过 SG 函数分析游戏胜负的关键,并介绍如何编程实现解决方案。 ... [详细]
  • 深入解析Spring启动过程
    本文详细介绍了Spring框架的启动流程,帮助开发者理解其内部机制。通过具体示例和代码片段,解释了Bean定义、工厂类、读取器以及条件评估等关键概念,使读者能够更全面地掌握Spring的初始化过程。 ... [详细]
  • 深入解析ESFramework中的AgileTcp组件
    本文详细介绍了ESFramework框架中AgileTcp组件的设计与实现。AgileTcp是ESFramework提供的ITcp接口的高效实现,旨在优化TCP通信的性能和结构清晰度。 ... [详细]
  • JavaScript 中创建对象的多种方法
    本文详细介绍了 JavaScript 中创建对象的几种常见方式,包括对象字面量、构造函数和 Object.create 方法,并提供了示例代码和属性描述符的解释。 ... [详细]
  • This request pertains to exporting the hosted_zone_id attribute associated with the aws_rds_cluster resource in Terraform configurations. The absence of this attribute can lead to issues when integrating DNS records with Route 53. ... [详细]
  • Redux入门指南
    本文介绍Redux的基本概念和工作原理,帮助初学者理解如何使用Redux管理应用程序的状态。Redux是一个用于JavaScript应用的状态管理库,特别适用于React项目。 ... [详细]
  • 使用Powershell Studio快速构建GUI应用程序
    本文介绍了如何利用Powershell Studio创建功能强大的可视化界面。相较于传统的开发工具,Powershell Studio提供了更为简便和高效的开发体验,尤其适合需要快速构建图形用户界面(GUI)的场景。 ... [详细]
  • 深入解析SpringMVC核心组件:DispatcherServlet的工作原理
    本文详细探讨了SpringMVC的核心组件——DispatcherServlet的运作机制,旨在帮助有一定Java和Spring基础的开发人员理解HTTP请求是如何被映射到Controller并执行的。文章将解答以下问题:1. HTTP请求如何映射到Controller;2. Controller是如何被执行的。 ... [详细]
  • 本文详细介绍了一种通过MySQL弱口令漏洞在Windows操作系统上获取SYSTEM权限的方法。该方法涉及使用自定义UDF DLL文件来执行任意命令,从而实现对远程服务器的完全控制。 ... [详细]
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社区 版权所有