mybatis动态sql基础

简介: 记mybatis动态sql基础

mybatis动态sql

动态sqlsql的内容是变化的,可以根据条件获取到不同的sql语句。主要是where部分发送变化。

动态sql的实现,使用的是mybatis提供的标签,<if>,<where>,<foreach>

<if>是判断条件的,

语法<if test=”判断java对象的属性值”> 语法 </if>


mybatis动态sql-if标签

图片.png

接口

List<User> selectStudentIf(User user);

 

Mapper文件

<!--if

      <if test="使用参数java对象的属性值作为判断条件,语法规则 属性=xx">

    -->

  <select id="selectStudentIf" resultType="org.example.daomain.User">

          SELECT * FROM TEST1

          WHERE

      <if test="p_name !=null and p_name!=''">

          p_name =#{p_name}

      </if>

      <if test="address !='SS'">

           and address = #{address}

      </if>

 

  </select>

 

测试类

@Test

  public void testSelectStudents(){

      /**使用mybatis的动态代理机制,使用sqlSession.getMapper(dao接口)

       * getMapper能够获得dao接口的实现类对象

      **/

      SqlSession sqlSession = MyBatisUtils.getSqlSessionAuto();

      UserDao dao = sqlSession.getMapper(UserDao.class);

      User user =new User();

      user.setP_name("小红");

      user.setAddress("北京");

      //调用dao的方法,执行数据库的操作

      List<User> users =dao.selectStudentIf(user);

      users.forEach(u-> System.out.println("用户:"+u));

}

图片.png

执行顺序,从上往下


小问题

图片.png图片.png

当第一个if不成立,第二if成立时,会造成语法错误

小技巧

解决小技巧:图片.png


mybatis动态sql-where标签

<where>用来包含 多个<if>的,当多个if有一个成立的,<where>会自动增加一个where关键字,并去掉if中多余的and or等。

 

接口

//where

  List<User> selectStudentWhere(User user);

 

Mapper

<select id="selectStudentWhere" resultType="org.example.daomain.User">

          SELECT * FROM TEST1

      <where>

          <if test="p_name !=null and p_name!=''">

               p_name =#{p_name}

          </if>

          <if test="address !='SS'">

               and address = #{address}

          </if>

      </where>

  </select>

 

测试类

//where

  @Test

  public void selectStudentWhere(){

      /**使用mybatis的动态代理机制,使用sqlSession.getMapper(dao接口)

       * getMapper能够获得dao接口的实现类对象

       **/

      SqlSession sqlSession = MyBatisUtils.getSqlSessionAuto();

      UserDao dao = sqlSession.getMapper(UserDao.class);

      User user =new User();

      user.setP_name("小红");

      user.setAddress("北京");

      //调用dao的方法,执行数据库的操作

      List<User> users =dao.selectStudentWhere(user);

      users.forEach(u-> System.out.println("用户:"+u));

   }

图片.png


mybatis动态sql-foreach标签

<foreach>循环java中的数组,list集合的。主要用在sqlin语句中。

学生id 1 2的三个学生

SELECT * FROM TEST1 WHERE p_id in (1,2,3)

 

<foreach collection="" item="" open="" close="" separator=""></foreach>

Collection:表示接口中的方法参数的类型,如果是数组使用array,如果是list集合使用list

Item:自定义的,表示数组和集合成员的变量

Open:循环开始时的字符

Close:循环结束时的字符

Separator:集合成员之间的分隔符

 

foreach用法1

图片.png

接口

//foreach用法1

  List<User> selectFor(List<Integer> idlist);

 

Mapper

<select id="selectFor" resultType="org.example.daomain.User">

      SELECT * FROM TEST1 WHERE p_id IN

      <foreach collection="list" item="p_id" open="(" close=")" separator=",">

               #{p_id}

      </foreach>

  </select>

 

测试类

@Test

  public void selectFor(){

      SqlSession sqlSession = MyBatisUtils.getSqlSessionAuto();

      UserDao dao = sqlSession.getMapper(UserDao.class);

      List<Integer> list =new ArrayList<>();

      list.add(1);

      list.add(2);

      list.add(3);

       List<User> users =dao.selectFor(list);

      users.forEach(u -> System.out.println(u));

   }

 图片.png

 

 

foreach用法2

 

接口

//foreach用法2  使用User对象

  List<User> selectForTwo(List<User> userlist);

 

Mapper

<!--//foreach用法2使用对象-->

  <select id="selectForTwo" resultType="org.example.daomain.User">

      SELECT * FROM TEST1 WHERE p_id IN

      <foreach collection="list" item="User" open="(" close=")" separator=",">

                   #{User.p_id}

      </foreach>

  </select>

 

测试类

@Test

  public  void selectForTwo(){

      SqlSession sqlSession = MyBatisUtils.getSqlSessionAuto();

      UserDao dao = sqlSession.getMapper(UserDao.class);

      List<User> userslist =new ArrayList<>();

      User u1 =new User();

       u1.setP_id(1);

 

      User u2 =new User();

      u2.setP_id(2);

 

      userslist.add(u1);

      userslist.add(u2);

 

      List<User> users = dao.selectForTwo(userslist);

      users.forEach(u-> System.out.println(u));

   }

图片.png

 图片.png

动态sql-代码片段

 Sql代码片段,就是多次复用的sql语法

步骤

定义:<sql id=”自定义名称唯一”>sql语句</sql>

使用:<include refid=”id的值”/>

 

案例

<sql id="SELCETSQL">

      SELECT * FROM TEST1 WHERE p_id IN

  </sql>

 

<select id="selectForTwo" resultType="org.example.daomain.User">

      <include refid="SELCETSQL"/>

      <foreach collection="list" item="User" open="(" close=")" separator=",">

                   #{User.p_id}

      </foreach>

  </select>

图片.png

 


 

 

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