• Mybatis动态sql和分页


    目录

    一、Mybatis的动态SqlMybatis的动态sql可以让我们在xml文件中,以标签的形式编写动态sql,完成逻辑判断和动态拼接sql的功能

    二、分页


    一、Mybatis的动态Sql
    Mybatis的动态sql可以让我们在xml文件中,以标签的形式编写动态sql,完成逻辑判断和动态拼接sql的功能

    使用foreach和if标签

    1、foreach标签(遍历集合,批量查询、通常用于in关键字)

    1. <select id="list3" resultType="com.zjy.model.Book" parameterType="com.zjy.model.BookVo">
    2. select * from t_mvc_book where bid in
    3. <foreach collection="bookIds" open="(" close=")" separator="," item="bid">
    4. #{bid}
    5. foreach>
    6. select>

     

    2、if标签

    使用if标签将sql进行拼接,当我们对事务进行修改的时候,如果没有把值传过来,那么当我们点击修改之后,结果不会变为null,会保持原来的值不变,所以动态拼接sql可以减少资源错误

    1. id="updateByPrimaryKeySelective" parameterType="com.zjy.model.Book" >
    2. update t_mvc_book
    3. <set >
    4. <if test="bname != null" >
    5. bname = #{bname,jdbcType=VARCHAR},
    6. <if test="price != null" >
    7. price = #{price,jdbcType=REAL},
    8. where bid = #{bid,jdbcType=INTEGER}

    二、分页

    1、模糊查询(三种方式)

    1.1参数中直接加入%%

    1.2使用${...}代替#{...}(不建议使用该方式,有SQL注入风险)

    ${...}和#{...}的区别:参数类型为字符串,#会在前后加单引号['],$则直接插入值


     1.3 SQL字符串拼接CONCAT

    1. <select id="selectBooksLike1" resultType="com.zjy.model.Book" parameterType="java.lang.String">
    2. select * from t_mvc_book where bname like #{bname}
    3. select>
    4. <select id="selectBooksLike2" resultType="com.zjy.model.Book" parameterType="java.lang.String">
    5. select * from t_mvc_book where bname like '${bname}'
    6. select>
    7. <select id="selectBooksLike3" resultType="com.zjy.model.Book" parameterType="java.lang.String">
    8. select * from t_mvc_book where bname like concat(concat('%',#{bname}),'%')
    9. select>

    2、查询返回结果集

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

    如果是单表的情况下,resultType和resultMap都可以使用

    多表的情况下,必须使用resultMap

     使用resultType返回List必须要以参数的形式传递

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

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

    3、分页查询

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

    3.1在pom.xml文件中导入分页查询

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

    3.2在Mybatis.cfg.xml文件中配置拦截器

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

    3.3BookBiz

    1. //利用第三方插件进行分页
    2. List<Map> listPager (Map map, PageBean pageBean);

    3.4BookBizImpl

    1. @Override
    2. public List<Map> listPager(Map map, PageBean pageBean) {
    3. if(pageBean != null && pageBean.isPagination()){
    4. PageHelper.startPage(pageBean.getPage(),pageBean.getRows());
    5. }
    6. List<Map> list = bookMapper.listPager(map);
    7. if(pageBean != null && pageBean.isPagination()){
    8. PageInfo pageInfo = new PageInfo(list);
    9. System.out.println("页码:"+pageInfo.getPageNum());
    10. System.out.println("页大小:"+pageInfo.getPageSize());
    11. System.out.println("总记录:"+pageInfo.getTotal());
    12. pageBean.setTotal(pageInfo.getTotal()+"");
    13. }
    14. return list;
    15. }

    3.5测试类

    1. @Test
    2. public void listPager() {
    3. System.out.println("mybatis中模糊查询#与$的区别.....");
    4. Map map=new HashMap();
    5. map.put("bname","圣墟");
    6. PageBean pageBean=new PageBean();
    7. pageBean.setPage(4);
    8. List<Map> ms=this.bookBiz.listPager(map,pageBean);
    9. ms.forEach(System.out::println);
    10. }

    测试效果



       4、特殊字符处理

    >(>)   

        <(<)  

        &(&)

     空格( )

     

    1. <select id="list6" resultType="com.zjy.model.Book" parameterType="com.zjy.model.BookVo">
    2. select * from t_mvc_book
    3. <where>
    4. <if test="null != min and min != ''">
    5. if>
    6. <if test="null != max and max != ''">
    7. price ]]>
    8. if>
    9. where>
    10. select>
    11. <select id="list7" resultType="com.zjy.model.Book" parameterType="com.zjy.model.BookVo">
    1. /**
    2. * 处理特殊字符
    3. * @param bookVo
    4. * @return
    5. */
    6. List list6(BookVo bookVo);
    7. /**
    8. * 处理特殊字符
    9. * @param bookVo
    10. * @return
    11. */
    12. List list7(BookVo bookVo);

     

  • 相关阅读:
    深入探讨npm、Yarn、pnpm和npx之间的区别
    参数化建模 vs. 直接建模【CAD】
    中国石油大学(北京)-《 油层物理》第一阶段在线作业
    9月1日目标检测学习笔记——通用物体检测
    戏说领域驱动设计(廿四)——资源库
    若依ruoyi系统报错:mybatis-plus报错,获取用户信息异常解决方案(借助ruoyi作为后台管理系统出现的bug)
    如何快速集成讯飞星火 2.0 API ?
    AI入门指南:探索人工智能的基础原理和实际应用
    spring复习讲义代码和图形详细讲解(IOC 控制反转,AOP 面向切面编程,Spring 集成 MyBatis)
    Linux进程信号的处理
  • 原文地址:https://blog.csdn.net/m0_67477525/article/details/126297189