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

 


 

 

目录
相关文章
|
3月前
|
SQL Java 测试技术
3、Mybatis-Plus 自定义sql语句
这篇文章介绍了如何在Mybatis-Plus框架中使用自定义SQL语句进行数据库操作。内容包括文档结构、编写mapper文件、mapper.xml文件的解释说明、在mapper接口中定义方法、在mapper.xml文件中实现接口方法的SQL语句,以及如何在单元测试中测试自定义的SQL语句,并展示了测试结果。
3、Mybatis-Plus 自定义sql语句
|
16天前
|
SQL 缓存 Java
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
本文详细介绍了MyBatis的各种常见用法MyBatis多级缓存、逆向工程、分页插件 包括获取参数值和结果的各种情况、自定义映射resultMap、动态SQL
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
|
1月前
|
SQL Java 数据库连接
mybatis使用四:dao接口参数与mapper 接口中SQL的对应和对应方式的总结,MyBatis的parameterType传入参数类型
这篇文章是关于MyBatis中DAO接口参数与Mapper接口中SQL的对应关系,以及如何使用parameterType传入参数类型的详细总结。
35 10
|
2月前
|
SQL XML Java
mybatis复习03,动态SQL,if,choose,where,set,trim标签及foreach标签的用法
文章介绍了MyBatis中动态SQL的用法,包括if、choose、where、set和trim标签,以及foreach标签的详细使用。通过实际代码示例,展示了如何根据条件动态构建查询、更新和批量插入操作的SQL语句。
mybatis复习03,动态SQL,if,choose,where,set,trim标签及foreach标签的用法
|
3月前
|
SQL Java 数据库连接
Mybatis系列之 Error parsing SQL Mapper Configuration. Could not find resource com/zyz/mybatis/mapper/
文章讲述了在使用Mybatis时遇到的资源文件找不到的问题,并提供了通过修改Maven配置来解决资源文件编译到target目录下的方法。
Mybatis系列之 Error parsing SQL Mapper Configuration. Could not find resource com/zyz/mybatis/mapper/
|
2月前
|
SQL XML Java
mybatis :sqlmapconfig.xml配置 ++++Mapper XML 文件(sql/insert/delete/update/select)(增删改查)用法
当然,这些仅是MyBatis功能的初步介绍。MyBatis还提供了高级特性,如动态SQL、类型处理器、插件等,可以进一步提供对数据库交互的强大支持和灵活性。希望上述内容对您理解MyBatis的基本操作有所帮助。在实际使用中,您可能还需要根据具体的业务要求调整和优化SQL语句和配置。
45 1
|
3月前
|
SQL Java 数据库连接
Mybatis系列之 动态SQL
文章详细介绍了Mybatis中的动态SQL用法,包括`<if>`、`<choose>`、`<when>`、`<otherwise>`、`<trim>`和`<foreach>`等元素的应用,并通过实际代码示例展示了如何根据不同条件动态生成SQL语句。
|
3月前
|
SQL Java 关系型数据库
SpringBoot 系列之 MyBatis输出SQL日志
这篇文章介绍了如何在SpringBoot项目中通过MyBatis配置输出SQL日志,具体方法是在`application.yml`或`application.properties`中设置MyBatis的日志实现为`org.apache.ibatis.logging.stdout.StdOutImpl`来直接在控制台打印SQL日志。
SpringBoot 系列之 MyBatis输出SQL日志
|
3月前
|
SQL 关系型数据库 MySQL
解决:Mybatis-plus向数据库插入数据的时候 报You have an error in your SQL syntax
该博客文章讨论了在使用Mybatis-Plus向数据库插入数据时遇到的一个常见问题:SQL语法错误。作者发现错误是由于数据库字段中使用了MySQL的关键字,导致SQL语句执行失败。解决方法是将这些关键字替换为其他字段名称,以避免语法错误。文章通过截图展示了具体的操作步骤。
|
4月前
|
SQL Java 数据库连接
idea中配置mybatis 映射文件模版及 mybatis plus 自定义sql
idea中配置mybatis 映射文件模版及 mybatis plus 自定义sql
91 3
下一篇
无影云桌面