MyBatis之动态sql

简介: 如果使用JDBC或者Hibernate等ORM框架,很多时候你要根据需要去拼接sql,这是一个很麻烦的事情。而MyBatis提供对动态sql的组装能力,而且它只有为数不多的几个基本元素,简单明了,大量的判断可以在MyBatis的映射文件xml进行配置,以达到我们需要编写大量代码才能实现的需求。

如果使用JDBC或者Hibernate等ORM框架,很多时候你要根据需要去拼接sql,这是一个很麻烦的事情。而MyBatis提供对动态sql的组装能力,而且它只有为数不多的几个基本元素,简单明了,大量的判断可以在MyBatis的映射文件xml进行配置,以达到我们需要编写大量代码才能实现的需求。动态sql减少了很多编写代码量的工作。

这从中又体现了MyBatis的优点,可配置性,灵活性和可维护性。

 

注意该例子在MyBatis+Hibernate+JDBC分析对比的文章上基础进行的

下面进行对上述表中的例子进行演示:

package cn.mybatis;

import org.apache.ibatis.annotations.Param;

public interface UserMapper {

    
    User getUserById(Integer Id);
    //注意@Param 适用场景针对于参数n<=5的情况下进行,如果参数n大于5以上建议将参数改为JavaBean
    User getUserByName(@Param("userName") String userName);
}

if演示示例:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.mybatis.UserMapper">
    <!--如果一部分字段查询比较频繁,建议使用sql标签,将查询过频繁的字段放进去,这样方面管理和修改-->    
    <sql id="user">
    id,user_name
    </sql>
    
    <select id="getUserById" parameterType="Integer" resultMap="users">
        select <include refid="user"/> from `user` where id=#{Id}
    </select>    
    
    <!--
    if标签主要适用于多条件查询,例如分页查询,比如博客,比如时间日期,标签类型,时间类型等等
   单个条件可以使用下面的例子
如果条件多的话,建议在<if></if>外嵌套<where>标签
    --> <select id="getUserByName" parameterType="String" resultMap="users"> select id,user_name from `user` where <if test="userName!=null and userName !=''"> user_name like concat ('%',#{userName},'%') </if> </select>

<resultMap type="User" id="users"> <id column="id" property="Id"/> <result column="user_name" property="userName"/> </resultMap> </mapper>

 

 

choosey演示示例:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.mybatis.UserMapper"> 
      
     <!-- 
     Choose相当于Java中的
     if(..){
     }else if(..){
     }else{
     
     }
     otherwise这里就不做演示了,otherwise相当于否则的意思,可以说就是else
      
      注意 在外层必须嵌套<where>标签,否则会一直显示sql错误
      -->
      
           <select id="getUserByName" parameterType="Map" resultMap="users">
           select * from `user`
           <where>
           <choose>
           <when test="Id!=null and Id!=''">
               and id = #{Id}
           </when>
            <when test="userName != null and userName != ''">
               and  user_name = #{userName}
            </when>     
           </choose>
           </where>
          
     </select>
     
    <resultMap type="User" id="users">
    <id column="id" property="Id"/>
    <result column="user_name" property="userName"/>
    </resultMap>

</mapper>

 

接口类

package cn.mybatis;

import java.util.List;
import java.util.Map;

import org.apache.ibatis.annotations.Param;

public interface UserMapper {

    
    User getUserByName(Map<String,Object> map);
}

测试类

package cn.mybatis;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.ibatis.session.SqlSession;

public class TestMyBatis {

    public static void main(String[] args) {
        SqlSession sqlSession = null;
        sqlSession = MyBatisExample.getSqlSessionFactory().openSession();
        
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        User users = new User();
        users.setId(1);
        users.setUserName(null);
        Map<String,Object> map = new HashMap<String,Object>();
        map.put("user", users);
        User user = userMapper.getUserByName(map);
        System.out.println(user.getUserName());
        
        
        

    }
}

 

trim演示示例:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.mybatis.UserMapper">
     
     <!-- 
     trim意味着去掉一些特殊字符
     trim prefix表示前缀 通常加上where的话,表示已经将where写进前缀,这时就不用写where了
     prefixOverrides 表示将第一個and或者or去掉 
      -->
      <select id="getUserByName" parameterType="String" resultMap="users">
         select id,user_name from `user`
         <trim prefix="where" prefixOverrides="and|or">
            <if test="userName!=null">
             and user_name = #{userName}    
             </if>
         </trim>
     </select>
  
     
    <resultMap type="User" id="users">
    <id column="id" property="Id"/>
    <result column="user_name" property="userName"/>
    </resultMap>

</mapper>

 

接口类:

package cn.mybatis;



import org.apache.ibatis.annotations.Param;

public interface UserMapper {

    
    
    User getUserByName(@Param ("userName") String userName);
}

 

测试类:

package cn.mybatis;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.ibatis.session.SqlSession;

public class TestMyBatis {

    public static void main(String[] args) {
        SqlSession sqlSession = null;
        sqlSession = MyBatisExample.getSqlSessionFactory().openSession();
        
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        User user = userMapper.getUserByName("张飞");
        System.out.println(user.getUserName());
        
        
        

    }
}

 

set

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.mybatis.UserMapper">


     
      

     <!--
set 当满足条件时继续下一个,否则报错,这里也相当于做一个判断验证
--> <!-- <update id="updateUserInfo" parameterType="User"> update `user` <set> <if test="userName != null and userName !='' "> user_name = #{userName} </if> </set> where id = #{Id} </update> -->
<!--
trim在这里也可以应用
--> <update id="updateUserInfo" parameterType="User"> update `user` <trim prefix="set" prefixOverrides=","> <if test="userName !=null and userName !=''"> user_name = #{userName} </if> </trim> where id= #{Id} </update> <resultMap type="User" id="users"> <id column="id" property="Id"/> <result column="user_name" property="userName"/> </resultMap> </mapper>

 

接口类:

package cn.mybatis;

import java.util.List;
import java.util.Map;

import org.apache.ibatis.annotations.Param;

public interface UserMapper {

    
    
    int updateUserInfo(User user);
    
}

 

测试类:

package cn.mybatis;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.ibatis.session.SqlSession;

public class TestMyBatis {

    public static void main(String[] args) {
        SqlSession sqlSession = null;
        sqlSession = MyBatisExample.getSqlSessionFactory().openSession(true);
        
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        User user = new User();
        user.setId(1);
        user.setUserName("张好s");
        int lines =userMapper.updateUserInfo(user);
        if(lines==1) {
            System.out.println("Yes");
            
        }else {
            System.out.println("No");
        }
        
        

    }
}

 

foreach这里就不演示了,参照我的博文批量更新,那里写的比较详细

当然接下来还有bind,不过这个不常用,以上说的包括没说的foreach是开发过程中常用的动态sql。

目录
相关文章
|
3月前
|
SQL XML Java
通过MyBatis的XML配置实现灵活的动态SQL查询
总结而言,通过MyBatis的XML配置实现灵活的动态SQL查询,可以让开发者以声明式的方式构建SQL语句,既保证了SQL操作的灵活性,又简化了代码的复杂度。这种方式可以显著提高数据库操作的效率和代码的可维护性。
281 18
|
8月前
|
SQL Java 数据库连接
【YashanDB知识库】解决mybatis的mapper文件sql语句结尾加分号";"报错
【YashanDB知识库】解决mybatis的mapper文件sql语句结尾加分号";"报错
|
7月前
|
SQL Java 数据库连接
MyBatis动态SQL字符串空值判断,这个细节99%的程序员都踩过坑!
本文深入探讨了MyBatis动态SQL中字符串参数判空的常见问题。通过具体案例分析,对比了`name != null and name != &#39;&#39;`与`name != null and name != &#39; &#39;`两种写法的差异,指出后者可能引发逻辑混乱。为避免此类问题,建议在后端对参数进行预处理(如trim去空格),简化MyBatis判断逻辑,提升代码健壮性与可维护性。细节决定成败,严谨处理参数判空是写出高质量代码的关键。
1026 0
|
3月前
|
SQL Java 数据库连接
SSM相关问题-1--#{}和${}有什么区别吗?--Mybatis都有哪些动态sql?能简述一下动 态sql的执行原理吗?--Spring支持的几种bean的作用域 Scope
在MyBatis中,`#{}`是预处理占位符,可防止SQL注入,适用于大多数参数传递场景;而`${}`是直接字符串替换,不安全,仅用于动态表名、列名等特殊场景。二者在安全性、性能及使用场景上有显著区别。
82 0
|
6月前
|
SQL XML Java
菜鸟之路Day35一一Mybatis之XML映射与动态SQL
本文介绍了MyBatis框架中XML映射与动态SQL的使用方法,作者通过实例详细解析了XML映射文件的配置规范,包括namespace、id和resultType的设置。文章还对比了注解与XML映射的优缺点,强调复杂SQL更适合XML方式。在动态SQL部分,重点讲解了`&lt;if&gt;`、`&lt;where&gt;`、`&lt;set&gt;`、`&lt;foreach&gt;`等标签的应用场景,如条件查询、动态更新和批量删除,并通过代码示例展示了其灵活性与实用性。最后,通过`&lt;sql&gt;`和`&lt;include&gt;`实现代码复用,优化维护效率。
584 5
|
8月前
|
SQL Java 数据库连接
【YashanDB 知识库】解决 mybatis 的 mapper 文件 sql 语句结尾加分号";"报错
【YashanDB 知识库】解决 mybatis 的 mapper 文件 sql 语句结尾加分号";"报错
|
8月前
|
SQL 缓存 Java
框架源码私享笔记(02)Mybatis核心框架原理 | 一条SQL透析核心组件功能特性
本文详细解构了MyBatis的工作机制,包括解析配置、创建连接、执行SQL、结果封装和关闭连接等步骤。文章还介绍了MyBatis的五大核心功能特性:支持动态SQL、缓存机制(一级和二级缓存)、插件扩展、延迟加载和SQL注解,帮助读者深入了解其高效灵活的设计理念。
|
9月前
|
SQL XML Java
九、MyBatis动态SQL
九、MyBatis动态SQL
161 2
|
10月前
|
SQL Java 数据库连接
【潜意识Java】MyBatis中的动态SQL灵活、高效的数据库查询以及深度总结
本文详细介绍了MyBatis中的动态SQL功能,涵盖其背景、应用场景及实现方式。
1112 6
|
8月前
|
SQL XML Java
六、MyBatis特殊的SQL:模糊查询、动态设置表名、校验名称唯一性
六、MyBatis特殊的SQL:模糊查询、动态设置表名、校验名称唯一性
251 0