码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Mybatis02动态sql和分页


    目录

    1、mybatis动态sql是?

    1.1、if和where标签

     1.2、trim标签

    1.3、foreach标签

    1.4、set/choose/otherwise/when标签

    2.模糊查询(3种方式)

    2.1 参数中直接加入%%

    2.2 使用${...}代替#{...}(不建议使用该方式,有SQL注入风险)          关键:#{...}与${...}区别?          参数类型为字符串,#会在前后加单引号['],$则直接插入值

              注:          1) mybatis中使用OGNL表达式传递参数          2) 优先使用#{...}          3) ${...}方式存在SQL注入风险

     2.3 SQL字符串拼接CONCAT

    3.查询返回结果集

    4.分页查询

    为什么要重写mybatis的分页?

    Mybatis的分页功能很弱,它是基于内存的分页(查出所有记录再按偏移量offset和边界limit取结果),在大数据量的情况下这样的分页基本上是没有用的

     4.1 导入分页插件

    4.2 将pagehelper插件配置到mybatis中

    4.3 在你需要进行分页的Mybatis方法前调PageHelper.startPage静态方法即可,紧跟在这个方法后的第一个Mybatis查询方法会被进行分页

    4.4 获取分页信息(二种方式)

    5.特殊字符处理

    以上就是今天的分享!!!🎈🎈🎈🎈🎈🎈

    在这里祝大家中秋节快乐,教师节快乐


    1、mybatis动态sql是?

    1.动态 SQL 是 MyBatis 的强大特性之一。在 JDBC 或其它类似的框架中,开发人员通常需要手动拼接 SQL 语句。根据不同的条件拼接 SQL 语句是一件极其痛苦的工作。例如,拼接时要确保添加了必要的空格,还要注意去掉列表最后一个列名的逗号。而动态 SQL 恰好解决了这一问题,可以根据场景动态的构建查询。

    2.动态SQL:code that is executed dynamically。 它一般是根据用户输入或外部条件动态组合的SQL语句块。 动态SQL能灵活的发挥SQL强大的功能、方便的解决一些其它方法难以解决的问题。 相信使用过动态SQL的人都能体会到它带来的便利,然而动态SQL有时候在执行性能 (效率)上面不如静态SQL,而且使用不恰当,往往会在安全方面存在隐患 (SQL 注入式攻击)。

    1.1、if和where标签

    1. <select id="dynamicSql" resultType="com.lks.domain.User">
    2. select <include refid="tableAllkey"/> from users
    3. <where>
    4. <if test="id != null and id != 0">
    5. AND id = #{id}
    6. if>
    7. <if test="name != null and name != ''">
    8. AND name = #{name}
    9. if>
    10. <if test="county != null and county != ''">
    11. AND county = #{county}
    12. if>
    13. where>
    14. select>

     1.2、trim标签

    mybatis中trim是动态拼接;java中表示去除前后空格

    prefix:前缀
    suffix:后缀
    suffixOverride:去除后缀指定的字符
    prefixOverrides:去除前缀指定的字符

    1. <select id="dynamicSqlTrim" resultType="com.lks.domain.User">
    2. select * from users
    3. <trim prefix="where" suffix="order by age" prefixOverrides="and | or" suffixOverrides=",">
    4. <if test="name != null and name != ''">
    5. AND name = #{name}
    6. if>
    7. <if test="county != null and county != ''">
    8. AND county = #{county}
    9. if>
    10. trim>
    11. select>

    1.3、foreach标签

    item :循环体中的具体对象。支持属性的点路径访问,如item.age,item.info.details,在list和数组中是其中的对象,在map中是value。
    index :在list和数组中,index是元素的序号,在map中,index是元素的key,该参数可选。
    open :表示该语句以什么开始
    close :表示该语句以什么结束
    separator :表示元素之间的分隔符,例如在in()的时候,separator=","会自动在元素中间用“,“隔开,避免手动输入逗号导致sql错误,如in(1,2,)这样。该参数可选。

    1. //批量查询
    2. <select id="findAll" resultType="Student" parameterType="Integer">
    3. <include refid="selectvp"/> WHERE sid in
    4. <foreach item="ids" collection="array" open="(" separator="," close=")">
    5. #{ids}
    6. foreach>
    7. select>
    8. //批量删除
    9. <delete id="del" parameterType="Integer">
    10. delete from student where sid in
    11. <foreach item="ids" collection="array" open="(" separator="," close=")">
    12. #{ids}
    13. foreach>
    14. delete>

    1.4、set/choose/otherwise/when标签

    使用set标签可以将动态的配置 SET 关键字,并剔除追加到条件末尾的任何不相关的逗号。使用 if+set 标签修改后,在进行表单更新的操作中,哪个字段中有值才去更新,如果某项为 null 则不进行更新,而是保持数据库原值。

    1. <update id="updateSet" parameterType="com.lks.domain.User">
    2. update users
    3. <set>
    4. <if test="name != null and name != ''">
    5. name = #{name},
    6. if>
    7. <if test="county != null and county != ''">
    8. county = #{county},
    9. if>
    10. set>
    11. where id = #{id}
    12. update>

    这三个标签需要组合在一起使用,类似于 Java 中的 switch、case、default。只有一个条件生效,也就是只执行满足的条件 when,没有满足的条件就执行 otherwise,表示默认条件。 

    1. <select id="dynamicSql2" resultType="com.lks.domain.User">
    2. select * from users
    3. <where>
    4. <choose>
    5. <when test="name != null and name != ''">
    6. AND name = #{name}
    7. when>
    8. <when test="county != null and county != ''">
    9. AND county = #{county}
    10. when>
    11. <otherwise>
    12. AND id = #{id}
    13. otherwise>
    14. choose>
    15. where>
    16. select>

    2.模糊查询(3种方式)

    2.1 参数中直接加入%%

    2.2 使用${...}代替#{...}(不建议使用该方式,有SQL注入风险)
              关键:#{...}与${...}区别?
              参数类型为字符串,#会在前后加单引号['],$则直接插入值

              注:
              1) mybatis中使用OGNL表达式传递参数
              2) 优先使用#{...}
              3) ${...}方式存在SQL注入风险

     2.3 SQL字符串拼接CONCAT

    3.查询返回结果集

        resultMap:适合使用返回值是自定义实体类的情况
        resultType:适合使用返回值的数据类型是非自定义的,即jdk的提供的类型

        3.1 使用resultMap返回自定义类型集合
        3.2 使用resultType返回List

        3.3 使用resultType返回单个对象

        3.4 使用resultType返回List,适用于多表查询返回结果集

        3.5 使用resultType返回Map,适用于多表查询返回单个结果集

    4.分页查询

    为什么要重写mybatis的分页?

    Mybatis的分页功能很弱,它是基于内存的分页(查出所有记录再按偏移量offset和边界limit取结果),在大数据量的情况下这样的分页基本上是没有用的

     4.1 导入分页插件

    1. <dependency>
    2. <groupId>com.github.pagehelpergroupId>
    3. <artifactId>pagehelperartifactId>
    4. <version>5.1.2version>
    5. dependency>

    4.2 将pagehelper插件配置到mybatis中

    1. <plugin interceptor="com.github.pagehelper.PageInterceptor">
    2. plugin>

    4.3 在你需要进行分页的Mybatis方法前调PageHelper.startPage静态方法即可,紧跟在这个方法后的第一个Mybatis查询方法会被进行分页

    1. //设置分页处理
    2. if (null != pageBean && pageBean.isPaginate()) {
    3. PageHelper.startPage(pageBean.getCurPage(), pageBean.getPageRecord());
    4. }

    4.4 获取分页信息(二种方式)

        4.4.1 使用插件后,查询实际返回的是Page,而非List,Page继承了ArrayList,同时还包含分页相关的信息
              Page page = (Page)list;
              System.out.println("页码:" + page.getPageNum());
              System.out.println("页大小:" + page.getPageSize());
              System.out.println("总记录:" + page.getTotal());
         4.4.2 使用PageInfo
              PageInfo pageInfo = new PageInfo(list);
              System.out.println("页码:" + pageInfo.getPageNum());
              System.out.println("页大小:" + pageInfo.getPageSize());
              System.out.println("总记录:" + pageInfo.getTotal());

    5.特殊字符处理

        >(>)   
        <(<)  
        &(&) 
     空格( )

    以上就是今天的分享!!!🎈🎈🎈🎈🎈🎈

    在这里祝大家中秋节快乐,教师节快乐

  • 相关阅读:
    告警:线上慎用 BigDecimal ,坑的差点被开了
    C++三大特性之继承(一)
    linux时间编程
    ArcGIS10.4.1属性表导出为乱码解决方法(亲测有效)
    【Oracle】Oracle系列之九--Oracle常用函数
    leetcode 2560. 打家劫舍 IV
    25.4 MySQL 函数
    为什么vue3要选用proxy,好处是什么?
    基于Matlab卡尔曼滤波的IMU和GPS组合导航数据融合(附上源码+数据)
    3个g的文件怎么发送给别人?三种方法自由选择!
  • 原文地址:https://blog.csdn.net/m0_62246061/article/details/126794926
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号