MyBatis 03 -MyBatis动态SQL与分页插件

这篇具有很好参考价值的文章主要介绍了MyBatis 03 -MyBatis动态SQL与分页插件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

动态SQL与分页插件

MyBatis 03 -MyBatis动态SQL与分页插件

1 动态SQL

MyBatis的映射文件中支持在基础SQL上添加一些逻辑操作,并动态拼接成完整的SQL之后再执行,以达到SQL复用、简化编程的效果。

  • 动态查询 where标签和if标签组合使用
  • 动态修改

1.1 < sql >

sql标签的作用是提取公共的sql代码片段

  • sql id属性:唯一标识
  • include refid属性:参照id
<!--  定义SQL片段:抽取公共的SQL语句  -->
<sql id="product_col">
    p_id pid,t_id tid ,p_name name ,p_time time ,p_image image,
      p_price price, p_info info , isdel,p_state state
</sql>
<select id="selectAll" resultType="product">
    select <include refid="product_col"/> from product
</select>

动态查询

1.2 < if >

if标签的作用适用于条件判断

<if test="判断条件">    在test属性中获取对象属性值的时候,不需要#{}
</if>
  • test 属性:判断条件(必填)
<!--
    if标签用于判断使用
        注意:
            1、在test中获取属性值的时候,不需要加上#{},在sql语句中获取属性值要加上#{}
            2、在sql语句中进行使用特殊字符,最好不要使用 > 或者 <,应该使用 &gt;  &lt;
-->
<select id="selectByCondition" resultType="product">
    select <include refid="productSql"/> from product  where 1 = 1
    <if test="name != null">
        and p_name like concat('%',#{name},'%')
    </if>
    <if test="time != null">
        and p_time  &gt; #{time}
    </if>
    <if test="price != null">
        and p_price &gt; #{price}
    </if>
    <if test="state != null">
        and p_state &gt; #{state}
    </if>
</select>

1.3 < where >

where 标签作用是添加where条件。一般和if标签配合使用

  • 如果没有条件,不会加上where。
  • 会自动去掉前的and、or、not等关键字
<!--
    where标签用于添加where条件
        特点:
            1、如果where有条件自动加上where关键字,如果没有则不会where关键字
            2、会自动去除前面的and或者or等关键字
-->
<select id="selectByCondition" resultType="product">
    select <include refid="productSql"/> from product
    <where>
        <if test="name != null">
            and p_name like concat('%',#{name},'%')
        </if>
        <if test="time != null">
            and p_time  &gt; #{time}
        </if>
        <if test="price != null">
            and p_price &gt; #{price}
        </if>
        <if test="state != null">
            and p_state &gt; #{state}
        </if>
    </where>
</select>

1.4 < set >

set 标签的作用是添加set,与where类似

<!--  set标签用于添加修改的字段值
        特点:
        1、如果set有条件自动加上set关键字,如果没有则不会set关键字
        2、会自动去除后面的,
 -->
<update id="updateByCondition">
    update product
    <set>
        <if test="name != null">
            p_name = #{name},
        </if>
        <if test="time != null">
            p_time = #{time},
        </if>
        <if test="state != null">
            p_state = #{state},
        </if>
        <if test="price != null">
            p_price = #{price},
        </if>
        p_id = #{pid}
    </set>
    where p_id = #{pid}
</update>

1.5 < choose >

choose标签作用是条件选择。类似于Java中的多重if

  • choose 、when 、otherwise
<!--
    choose、when、otherwise标签用于多值判断使用类似于java中的switch...case
-->
<select id="selectOrderByCondition" resultType="product">
    select <include refid="productSql"/> from product  order by
    <choose>
        <when test="price != null">
            p_price desc
        </when>
        <when test="time != null">
            p_time desc
        </when>
        <when test="state != null">
            p_state desc
        </when>
        <otherwise>
            p_id desc
        </otherwise>
    </choose>
</select>

1.6 < trim >

< trim prefix=“” suffix=“” prefixOverrides=“” suffixOverrides=“” >代替< where > 、< set >

  • prefix 前缀
  • suffix 后缀
  • prefixOverrides 前缀覆盖
  • suffixOverrides 后缀覆盖
<!--
   trim:用灵活的定义任意的前缀和后缀,以及覆盖多余前缀和后缀
-->
<update id="updateByCondition">
    update product
    <trim prefix="set" suffixOverrides=",">
        <if test="name != null">
            p_name = #{name},
        </if>
        <if test="time != null">
            p_time = #{time},
        </if>
        <if test="state != null">
            p_state = #{state},
        </if>
        <if test="price != null">
            p_price = #{price},
        </if>
        p_id = #{pid}
    </trim>
    where p_id = #{pid}
</update>

1.7 < foreach >

foreach 标签的作用是遍历集合或者数组

参数 描述 取值
collection 容器类型 list、array、map(可以在形参上加注解改变名称)
open 起始符 (
close 结束符 )
separator 分隔符 ,
index 下标号 从0开始,依次递增
item 当前项 任意名称(循环中通过 #{任意名称} 表达式访问)

案例1:批量增加

<!-- insert into 表名  (字段名1,字段名2,...)  values (值1,...),(值1,...) ,(值1,...)  -->
<insert id="insertProduct">
    insert into product (p_name,p_time,p_state,p_price) values
    <foreach collection="productList" item="product" separator=",">
        (#{product.name},#{product.time},#{product.state},#{product.price})
    </foreach>
</insert>

案例2:批量删除

<!-- delete from 表名 where p_id in (id1,id2,..)   -->
<delete id="deleteProduct">
    delete from product where p_id in
    <foreach collection="ids" item="id" open="(" close=")" separator=",">
        #{id}
    </foreach>
</delete>

2 mybatis缓存

mybatis一共有两级缓存,分别是一级缓存和二级缓存。默认开启了一级缓存

2.1 一级缓存

MyBatis 03 -MyBatis动态SQL与分页插件

一级缓存是mybatis中默认开启的

生命周期:在同一个SqlSession下

  • 一级缓存何时生效
    • 默认生效
  • 一级缓存何时失效
    • 1、两次查询使用不是同一个SqlSession
    • 2、手动将缓存清空
    • 3、当sqlSession关闭之后
    • 4、当两次查询操作中间,如果执行了增删改的操作,缓存失效

2.2 二级缓存

MyBatis 03 -MyBatis动态SQL与分页插件

mybatis中二级缓存是需要手动开启

生命周期: 二级缓存是在namespace级别

  • 二级缓存生效:
    • 1、在主配置文件中开启二级缓存
    • 2、在mapper映射文件中添加标签
    • 3、在查询之间,SqlSession需要提交
    • 4、如果没有缓存配置,那么这个类需要实现序列化接口
  • 二级缓存失效
    • 1、当两次查询操作中间,如果执行了增删改的操作,二级缓存失效

开启二级缓存

<configuration>
    <!-- 开启二级缓存(当前这个版本是默认开启的)   -->
    <settings>
        <setting name="cacheEnabled" value="true"/>
    </settings>
    ...
</configuration>

mapper映射配置缓存

<!--
      eviction:缓存淘汰策略 FIFO(先进先出)  LRU(最近最少使用)
      flushInterval:缓存的刷新时间
      size:缓存的大小
      readOnly:缓存只读
-->
<cache  eviction="LRU"
        flushInterval="60000"
        size="512"
        readOnly="true"/>

3 分页插件

3.1 概念

PageHelper是适用于MyBatis框架的一个分页插件,使用方式极为便捷,支持任何复杂的单表、多表分页查询操作。

3.2 访问与下载

官方网站:https://pagehelper.github.io/

下载地址:https://github.com/pagehelper/Mybatis-PageHelper

3.3 开发步骤

3.3.1 引入依赖

pom.xml中引入PageHelper依赖。

 <!-- 引入分页插件依赖 -->
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>5.1.10</version>
</dependency>
3.3.2 配置MyBatis-config.xml

在MyBatis-config.xml中添加< plugins >。

<configuration>
  	<typeAliases></typeAliases>
  
   <plugins>
        <!-- 添加分页拦截器查询   -->
        <plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
    </plugins>
  
  	<environments>...</environments>
</configuration>
3.3.3 PageHelper使用
@Test
public void test01() throws IOException {
    SqlSessionFactoryBuilder sfb = new SqlSessionFactoryBuilder();
    SqlSessionFactory sf = sfb.build(Resources.getResourceAsReader("mybatis-config.xml"));
    SqlSession sqlSession = sf.openSession();
    EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);
    //在查询之前执行!!!!
    PageHelper.startPage(3,3);
    List<Emp> empList = empMapper.getAll();
    PageInfo pageInfo = new PageInfo(empList);
    //empList.stream().forEach(System.out::println);
    System.out.println(pageInfo);
}

3.4 PageInfo对象

PageInfo对象中包含了分页操作中的所有相关数据。

PageInfo结构图
MyBatis 03 -MyBatis动态SQL与分页插件
3.4.1 PageInfo应用方式

使用PageInfo保存分页查询结果。文章来源地址https://www.toymoban.com/news/detail-414550.html

/**
 *  分页插件(物理分页 (sql语句中添加limit))
 *  1、导入pageHelper依赖
 *  2、在mybatis核心配置文件中添加插件(配置分页拦截器)
 *  3、在执行查询操作之前执行 PageHelper.startPage(当前页,每页条数)
 *  4、如果要获取完整结果,创建一个PageInfo对象即可(PageInfo pageInfo = new PageInfo(empList);)
 */

//创建一个分页信息类
PageInfo<Product> pageInfo = new PageInfo<>(productList);

到了这里,关于MyBatis 03 -MyBatis动态SQL与分页插件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Mybatis-动态sql和分页

    目录 一.什么是Mybatis动态分页 二.mybatis中的动态SQL 在BookMaaper.xml中写sql BookMapper BookBiz接口类  BookBizImpl实现接口类 demo测试类 ​编辑  测试结果 三.mybatis中的模糊查询 mybatis中的#与$有是什么区别 在BookMapper.xml里面建立三个模糊查询 ​编辑 Bookmapper BookBiz接口类 ​编辑  Boo

    2024年02月11日
    浏览(38)
  • SQl排序与分页

    1.1 排序规则 使用 ORDER BY 子句排序 ASC(ascend): 升序 DESC(descend):降序 ORDER BY 子句在SELECT语句的结尾。 1.2 单列排序 默认升序排列 1.3 多列排序 可以使用不在 SELECT 列表中的列排序。 在对多列进行排序的时候,首先排序的第一列必须有相同的列值,才会对第二列进行排序。

    2024年02月13日
    浏览(40)
  • Mybatis从入门到CRUD到分页到日志到Lombok到动态SQL再到缓存

    1.导入maven依赖 2.配置核心文件 3.从 XML 中构建 SqlSessionFactory 编写mybatis工具类 dao接口 接口实现类由原来的UserDaolmpl转变为-一个Mapper配置文件. 测试 测试二 select insert update dalete 创建实体类 编写接口 编写对应sql语句 测试 万能map Map传递参数,直接在sq|中取出key即可! [parameterT

    2024年03月08日
    浏览(46)
  • mybatis-plus技巧--动态表名-多语句-拼接sql--关于mybatis的mysql分页查询总数的优化思考

    传入tableName参数就可以了,不过只能用$不能用# 因为#会发生预编译,然后会在表名上加引号’\\\'。 新建一个表名拦截类实现TableNameHandler mybatisPlus添加插件 实例: 每天按统计 如果表名为count则加上今天的时间 每次设置 直接设置名字,然后就会改变的。 需要在配置文件中的

    2024年01月16日
    浏览(46)
  • Mybatis(七):分页插件

    本博主将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识,有兴趣的小伙伴可以关注博主!也许一个人独行,可以走的很快,但是一群人结伴而行,才能走的更远! Mybatis 是一款非常流行的持久层框架,可以帮助我们轻松地实现数据库操作和数据访问。在 Mybatis中

    2024年01月16日
    浏览(32)
  • 十二、MyBatis分页插件

    1. 添加依赖 2. 配置分页插件 在MyBatis的核心配置文件中配置插件 3. 在查询接口之前写上 在查询功能之前使用 PageHelper.startPage(int pageNum, int pageSize) 开启分页功能 pageNum :当前页的页码 pageSize :每页显示的条数 在查询获取list集合之后,使用PageInfoT pageInfo = new PageInfo(ListT list,

    2024年02月03日
    浏览(34)
  • MyBatis分页插件

    分页插件使用。 添加依赖 配置分页插件 在MyBatis的核心配置文件(mybatis-config.xml)中配置插件 开启分页功能 在查询功能之前使用 PageHelper.startPage(int pageNum, int pageSize) 开启分页功能 pageNum:当前页的页码 pageSize:每页显示的条数 分页相关数据 方法一:直接输出 分页相关数据

    2024年02月09日
    浏览(39)
  • Mybatis中的分页插件

    目录 一.为什么要使用分页插件? 二.分页常用标签 三.分页插件的使用         1.在mybatis的pom中添加分页插件依赖         2.在mybatis-config.xml中创建分页插件 3.在test文件中进行查询操作的时候,开启分页功能        PageInfo()         PageHelper.startPage(); 总结: 不必

    2023年04月13日
    浏览(36)
  • Mybatis 分页插件 PageHelper

    今天记录下 Mybatis 分页插件 pageHelper 的使用。 有一个员工表(employee),现在要使用 pageHelper 插件实现员工的分页查询。 Employee employee类定义代码如下 EmployeeDTO EmployeeDTO定义代码如下 PageResult 最后返回给前端的数据封装在 PageResult 类中, PageHelper 类定义如下: EmployeePageQueryDTO 分

    2024年01月19日
    浏览(62)
  • Mybatis---分页插件PageHelper

    目录 一、分页插件的概念 二、PageHelper的介绍 (1)引入依赖 (2)Mybatis配置文件配置PageHelper插件 (3)测试方法 开发过程中如果要进行分页查询,需要传入页数和每页条数。返回页面数据,总条数,总页数,当前页面,每页条数等数据。此时使用PageHelper插件可以快速帮助我

    2024年02月09日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包