栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

mybatis6 动态sql

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

mybatis6 动态sql

1.动态SQL中的元素

动态SQL是MyBatis的强大特性之一,MyBatis3采用了功能强大的基于OGNL的表达式来完成动态SQL,它消除了之前版本中需要了解的大多数元素,使用不到原来一半的元素就能完成所需工作。

MyBatis动态SQL中的主要元素,如表1所示。

表1 MyBatis的动态SQL元素

元素说明
判断语句,用于单条件分支判断
相当于Java中的switch...case...default语句,用于多条件分支判断
辅助元素,用于处理一些SQL拼装、特殊字符问题
循环语句,常用于in语句等列举条件中
从OGNL表达式中创建一个变量,并将其绑定到上下文,常用于模糊查询的sql中

表1列举了MyBatis动态SQL的一些主要元素,并分别对其作用进行了简要介绍。

动态sql,查询条件不确定有多少可以用HashMap来存储,也可以用一个类来封装所有可能的条件

用HashMap

优点:无需单独定义查询条件类

缺点:向HashMap中添加数据时的key要和sql语句查询时一致

用一个查询条件类

优点:在sql语句获取参数时直接使用属性名,不用担心命名不一致问题

缺点:需要单独定义一个类

@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class StudentSearchCondition {
    private String gender;
//整形使用int在判断时不能用null,而用0
//使用Integer对象类型时用null
    private Integer age;
    private String name;
}
//动态sql,查询条件不确定可以用HashMap
public List searchStudent(HashMap params);
//动态sql,查询条件不确定也可以用一个类来封装所有可能的条件
public List searchStudent(StudentSearchCondition params);
HashMap params=new HashMap<>();
params.put("gender","女");
params.put("age",18);

StudentDAO studentDAO=mybatisUtils.getMapper(StudentDAO.class);

List studentList=studentDAO.searchStudent(params);

studentList.forEach(System.out::println);
StudentSearchCondition params=new StudentSearchCondition();
params.setGender("女");
params.setAge(18);
StudentDAO studentDAO=mybatisUtils.getMapper(StudentDAO.class);

List studentList=studentDAO.searchStudent(params);

studentList.forEach(System.out::println);
    
        select sid,sname,sgender,sage,scid
        from students

        where 1=1

        
             and sgender=#{gender}
        
        
            and sage=#{age}
        
    

 

2.元素可多条件组合

在MyBatis中,元素是最常用的判断语句,它类似于Java中的if语句,主要用于实现某些简单的条件选择。

    
        select sid,sname,sgender,sage,scid
        from students
        where sage in
        
            #{age}
        
    

在上述代码中,使用了元素对传入的集合进行遍历并进行了动态SQL组装。关于元素中使用的几种属性的描述具体如下:

● item:配置的是循环中当前的元素。

● index:配置的是当前元素在集合的位置下标。

● collection:配置的list是传递过来的参数类型(首字母小写),它可以是一个array、list(或collection)、Map集合的键、POJO包装类中数组或集合类型的属性名等。

● open和close:配置的是以什么符号将这些集合元素包装起来。

● separator:配置的是各个元素的间隔符。

注意:

你可以将任何可迭代对象(如列表、集合等)和任何的字典或者数组对象传递给作为集合参数。当使用可迭代对象或者数组时,index是当前迭代的次数,item的值是本次迭代获取的元素。当使用字典(或者Map.Entry对象的集合)时,index是键,item是值。

在使用时最关键也是最容易出错的就是collection属性,该属性是必须指定的,而且在不同情况下,该属性的值是不一样的。主要有以下3种情况:

  1. 如果传入的是单参数且参数类型是一个数组或者List的时候,collection属性值分别为array和list(或collection);

  2. 如果传入的参数是多个的时候,就需要把它们封装成一个Map了,当然单参数也可以封装成Map集合,这时候collection属性值就为Map的键。

  3. 如果传入的参数是POJO包装类的时候,collection属性值就为该包装类中需要进行遍历的数组或集合的属性名。

所以在设置collection属性值的时候,必须按照实际情况配置,否则程序就会出现异常。

4. 元素只选择一个条件执行

 当多个条件都成立时,只根据第一个成立的条件查询;当一个条件成立时就根据这一个查询;当没有条件成立时根据otherwise查询

      
                
    select * from t_customer 
where 
    username like #{pattern_username}

上述配置代码中,使用元素定义了一个name为pattern_username的变量,元素中value的属性值就是拼接的查询字符串,其中_parameter.getUsername()表示传递进来的参数(也可以直接写成对应的参数变量名,如username)。在SQL语句中,直接引用元素的name属性值即可进行动态SQL组装。

测试:

    //模糊查询,防止sql注入
    public List searchStudentByName(String name);
    @Test
    public void searchStudentByName() {
        StudentDAO studentDAO=mybatisUtils.getMapper(StudentDAO.class);
        List studentList=studentDAO.searchStudentByName("刚");
        studentList.forEach(System.out::println);
    }
    
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/872050.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号