MyBatis的动态Sql查询(七)上

简介: MyBatis的动态Sql查询(七)

一. 动态Sql 查询


在数据库的持久化操作的过程中,最复杂最常用的就是查询 select 语句, 主要是后面跟着各种各样的 条件判断语句。而MyBatis很好的提供了这一点。 体现了Mybatis的灵活性,高度可配置性和可维护性。


具有的sql动态元素有:


1.if 判断 单分支的语句

2.choose (when otherwise) 多条件分支

3.trim 去除前缀和后缀的第一个符号

4.where 辅助元素, 代替 sql中的 1=1

5.set 更新元素

6.foreach 循环判断

7.bind 绑定元素


下面 老蝴蝶 会讲解这些元素的使用。


二. if元素


二.一 以前不带参数的查询


老蝴蝶 以前常写的 查询全部:


接口:


User getById(int id);
List<User> findAllF1();


sql 语句配置:


<!-- 定义map形式 -->
  <resultMap type="user" id="userResultMap">
    <id property="id" column="id"/>
    <result property="name" column="name"/>
    <result property="sex" column="sex"/>
    <result property="age" column="age"/>
    <result property="description" column="description"/>
  </resultMap>
  <select id="getById"  parameterType="int" resultType="user">
    <!-- 设置别名 -->
    select * from user where id=#{id}
  </select>
  <select id="findAllF1" resultMap="userResultMap">
    select * from user t
  </select>


测试方法:


  @Test
  public void findAllF1Test(){
    SqlSession sqlSession=SqlSessionFactoryUtils.getSession();
    UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
    List<User> allList=userMapper.findAllF1();
    allList.forEach(n ->System.out.println(n));
  }


20190703193739218.png


二.二 带参数的简单查询


上面的都是没有传入条件的,下面传入条件。 按照 名称进行查询,其中,名称可填可不填。 即,如果名称有值,则按照名称进行查询,如果没有传入名称值,则查询全部。


接口:


List<User> findAllF2(User user);


sql 元素: 用mybatis提供的 if 元素 进行单分支判断。


<select id="findAllF2" parameterType="user" resultMap="userResultMap">
    select * from user t where 
    <if test="name!=null and name!=''">
      t.name like concat('%',#{name},'%')
    </if>
  </select>


测试方法:


@Test
  public void findAllF2Test(){
    SqlSession sqlSession=SqlSessionFactoryUtils.getSession();
    UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
    User user=new User();
    user.setName("蝴蝶飞");  
    List<User> allList=userMapper.findAllF2(user);
    allList.forEach(n ->System.out.println(n));
  }


可以填写查询的值为 蝴蝶飞, 可以查询出结果。


20190704191202131.png


但如果此时 没有传入 name值呢?

即将 user.setName(“蝴蝶飞”); 注释掉:


20190704191252404.png

是错误的。


二.三 添加1=1 避免sql语句组装不正确


所以,常见的写法就是在where 后面添加一个 1=1, 避免在没有传入参数时,sql 语句组装不正确。


<select id="findAllF2" parameterType="user" resultMap="userResultMap">
    select * from user t where 1=1
    <if test="name!=null and name!=''">
      and t.name like concat('%',#{name},'%')
    </if>
  </select>


当然,也可以传入多个参数, 如按照name 和age 进行查询。 接口是不变的。


sql 语句也按照 上面 if 的写法。 后面加上1=1 就避免了sql语句出现错误


<select id="findAllF2" parameterType="user" resultMap="userResultMap">
    select * from user t where 1=1
    <if test="name!=null and name!=''">
      and t.name like concat('%',#{name},'%')
    </if>
    <if test="age!=null">
      and t.age>#{age}
    </if>
  </select>


测试方法:


@Test
  public void findAllF2Test(){
    SqlSession sqlSession=SqlSessionFactoryUtils.getSession();
    UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
    User user=new User();
    //两个条件时
    user.setName("蝴蝶飞");
    user.setAge(24);
    List<User> allList=userMapper.findAllF2(user);
    allList.forEach(n ->System.out.println(n));
  }


2019070419163278.png


传入一个name 参数,传入一个age 参数, 不传参数, 都是正确的, 只是拼接的sql 语句不一样而已。


三. where 语句


在if 中 写的 1=1 虽然避免了错误,但总是不合理的, 应该直接对参数进行相应的解析。如果没有传入值,应该是 select * from user, 而不是 后面再跟上 where 1=1 , 故可以用where 语句进行。 where 语句中条件正确成立后,才会加上 where 语句。


故 接口为:


List<User> findAllF3(User user);


sql语句:


 <select id="findAllF3" parameterType="user" resultMap="userResultMap">
    select * from user t
    <where>
      <if test="name!=null and name!=''">
        and t.name like concat('%',#{name},'%')
      </if>
      <if test="age!=null">
        and t.age>#{age}
      </if>
    </where>
  </select>


测试方法:


@Test
  public void findAllF3Test(){
    SqlSession sqlSession=SqlSessionFactoryUtils.getSession();
    UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
    User user=new User();
    //user.setName("蝴蝶飞");  //填写时, 不填写时不又其作为查询条件。
    //两个条件时
    user.setName("蝴蝶飞");
    user.setAge(24);
    List<User> allList=userMapper.findAllF3(user);
    allList.forEach(n ->System.out.println(n));
  }


传入两个参数是:


2019070419163278.png


传入一个 name 参数为:


20190704192256986.png


传入一个 age 参数为:


20190704192327411.png


不传入参数为:


20190704192348996.png


这样,就可以达到 去除 1=1 的效果了。

相关文章
|
7天前
|
SQL NoSQL Java
Java使用sql查询mongodb
通过使用 MongoDB Connector for BI 和 JDBC,开发者可以在 Java 中使用 SQL 语法查询 MongoDB 数据库。这种方法对于熟悉 SQL 的团队非常有帮助,能够快速实现对 MongoDB 数据的操作。同时,也需要注意到这种方法的性能和功能限制,根据具体应用场景进行选择和优化。
32 9
|
28天前
|
SQL 存储 人工智能
Vanna:开源 AI 检索生成框架,自动生成精确的 SQL 查询
Vanna 是一个开源的 Python RAG(Retrieval-Augmented Generation)框架,能够基于大型语言模型(LLMs)为数据库生成精确的 SQL 查询。Vanna 支持多种 LLMs、向量数据库和 SQL 数据库,提供高准确性查询,同时确保数据库内容安全私密,不外泄。
99 7
Vanna:开源 AI 检索生成框架,自动生成精确的 SQL 查询
|
14天前
|
SQL XML Java
mybatis实现动态sql
MyBatis的动态SQL功能为开发人员提供了强大的工具来应对复杂的查询需求。通过使用 `<if>`、`<choose>`、`<foreach>`等标签,可以根据不同的条件动态生成SQL语句,从而提高代码的灵活性和可维护性。本文详细介绍了动态SQL的基本用法和实际应用示例,希望对您在实际项目中使用MyBatis有所帮助。
45 11
|
12天前
|
XML Java 数据库连接
Mybatis实现RBAC权限模型查询
通过对RBAC权限模型的理解和MyBatis的灵活使用,我们可以高效地实现复杂的权限管理功能,为应用程序的安全性和可维护性提供有力支持。
45 5
|
2月前
|
SQL Java
使用java在未知表字段情况下通过sql查询信息
使用java在未知表字段情况下通过sql查询信息
39 8
|
1月前
|
SQL Java 数据库连接
spring和Mybatis的各种查询
Spring 和 MyBatis 的结合使得数据访问层的开发变得更加简洁和高效。通过以上各种查询操作的详细讲解,我们可以看到 MyBatis 在处理简单查询、条件查询、分页查询、联合查询和动态 SQL 查询方面的强大功能。熟练掌握这些操作,可以极大提升开发效率和代码质量。
54 3
|
2月前
|
SQL 缓存 Java
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
本文详细介绍了MyBatis的各种常见用法MyBatis多级缓存、逆向工程、分页插件 包括获取参数值和结果的各种情况、自定义映射resultMap、动态SQL
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
|
2月前
|
SQL 安全 Java
MyBatis-Plus条件构造器:构建安全、高效的数据库查询
MyBatis-Plus 提供了一套强大的条件构造器(Wrapper),用于构建复杂的数据库查询条件。Wrapper 类允许开发者以链式调用的方式构造查询条件,无需编写繁琐的 SQL 语句,从而提高开发效率并减少 SQL 注入的风险。
38 1
MyBatis-Plus条件构造器:构建安全、高效的数据库查询
|
2月前
|
SQL 安全 PHP
PHP开发中防止SQL注入的方法,包括使用参数化查询、对用户输入进行过滤和验证、使用安全的框架和库等,旨在帮助开发者有效应对SQL注入这一常见安全威胁,保障应用安全
本文深入探讨了PHP开发中防止SQL注入的方法,包括使用参数化查询、对用户输入进行过滤和验证、使用安全的框架和库等,旨在帮助开发者有效应对SQL注入这一常见安全威胁,保障应用安全。
63 4
|
2月前
|
SQL 监控 关系型数据库
SQL语句当前及历史信息查询-performance schema的使用
本文介绍了如何使用MySQL的Performance Schema来获取SQL语句的当前和历史执行信息。Performance Schema默认在MySQL 8.0中启用,可以通过查询相关表来获取详细的SQL执行信息,包括当前执行的SQL、历史执行记录和统计汇总信息,从而快速定位和解决性能瓶颈。