• mybatis动态sql和分页


    1、mybatis动态sql

    Iftrimforeach

      
    /**
        * param
        * 如果形参在mapper.xml中使用就需要加上面注释
        * map name:zs gqe:12
        * @param bookIds
        * @return
        */
     List<Book> selectBooksIn(@Param("bookIds") List bookIds);
    foreach标签的使用
    <select id="selectBooksIn" resultType="com.huangyucan.model.Book" parameterType="java.util.List">
        select * from t_mvc_book where bid in
        <foreach collection="bookIds" item="bid" open="(" close=")" separator=",">
          #{bid}
        </foreach>
      </select>

    测试一下

     @Test
        public void selectBooksIn() {
            List list=new ArrayList();
            list.add(13);
            list.add(16);
            list.add(18);
            List<Book> books = this.bookService.selectBooksIn(list);
            for (Book b : books) {
                System.out.println(b);
            }
        }

    2、模糊查询


    mybatis对模糊查询共有三种方式
     这里推荐1、3
    1、 #{}
    2、 ${}
    3、 concat
    List<Book> selectBooksLikel(@Param("bname")String bname);
    List<Book> selectBooksLike2(@Param("bname")String bname);
    List<Book> selectBooksLike3(@Param("bname")String bname);

    映射文件

    注意:#{…}自带引号,${…}有sql注入的风险

    测试
    @Test
        public void selectBooksLike() {
            String bname="圣墟";
    //        List<Book> books = this.bookService.selectBooksLike1(StringUtils.toLikeStr(bname));
            List<Book> books = this.bookService.selectBooksLike2(StringUtils.toLikeStr(bname));
    //        List<Book> books = this.bookService.selectBooksLike3(bname);
            for (Book a : books) {
                System.out.println(a);
            }

    3、查询返回结果集的处理

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

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

    接口

    List<Book> list1();

    映射文件

    <select id="list1" resultMap="BaseResultMap">
        select * from t_mvc_book
      </select>

    测试

     3.2 使用resultType返回List<T>

    接口

    List<Book> list2();

    映射文件

     <select id="list2" resultType="com.huangyucan.model.Book">
        select * from t_mvc_book
      </select>

    测试

     3.3 使用resultType返回单个对象

      BookVo 用来存放包括数据库表映射字段以及多余查询条件所用到的属性

    package com.huangyucan.model.vo;
    
    import com.huangyucan.model.Book;
    
    import java.util.List;
    
    /**
     * @auther 宇晨
     * @company
     * @create 2019-10-17-16:49
     *
     * 介绍
     * mybatis、hibernate都是orm框架,表所存在的列段是实体类model都有映射
     * 实际开发中,会因为某一些需求改变model,破坏model封装性
     * 此时为了保证model的封装性,就可以使用vo类来完成指定的需求
     */
    
    public class BookVo extends Book {
        private Float min;
        private Float max;
        private List<Integer> bookIds;
    
        public Float getMin() {
            return min;
        }
    
        public void setMin(Float min) {
            this.min = min;
        }
    
        public Float getMax() {
            return max;
        }
    
        public void setMax(Float max) {
            this.max = max;
        }
    
        public List<Integer> getBookIds() {
            return bookIds;
        }
    
        public void setBookIds(List<Integer> bookIds) {
            this.bookIds = bookIds;
        }
    }

    接口

     List<Book> list3(BookVo bookVo);

    映射文件

     <select id="list3" resultType="com.huangyucan.model.Book" parameterType="com.huangyucan.model.vo.BookVo">
        select * from t_mvc_book where bid in
        <foreach collection="bookIds" item="bid" open="(" close=")" separator=",">
          #{bid}
        </foreach>
      </select>

    测试

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

    接口

    List<Map> list4(Map map);

    映射文件

    <select id="list4" resultType="java.util.Map" parameterType="java.util.Map">
        select * from t_mvc_book where bid in
        <foreach collection="bookIds" item="bid" open="(" close=")" separator=",">
          #{bid}
        </foreach>
      </select>

    测试

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

    接口

     Map list5(Map map);

    映射文件

     <select id="list5" resultType="java.util.Map" parameterType="java.util.Map">
        select * from t_mvc_book where bid=#{bid}
      </select>

    测试

    4、分页查询

    为什么要重写mybatis的分页?

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

    使用分页插件步骤

    1、导入pom依赖

    <dependency>
        <groupId>com.github.pagehelper</groupId>
        <artifactId>pagehelper</artifactId>
        <version>5.1.2</version>
    </dependency>

    2、Mybatis.cfg.xml配置拦截器

    <plugins>
        <!-- 配置分页插件PageHelper, 4.0.0以后的版本支持自动识别使用的数据库 -->
        <plugin interceptor="com.github.pagehelper.PageInterceptor">
        </plugin>
    </plugins>

    3、使用PageHelper进行分页

     @Override
        public List<Map> listPager(Map map, PageBean pageBean) {
            if(pageBean !=null&&pageBean.isPagination()){
                PageHelper.startPage(pageBean.getPage(),pageBean.getRows());
            }
            List<Map> list = bookMapper.listPager(map);
            if(pageBean!=null&&pageBean.isPagination()){
                PageInfo pageInfo=new PageInfo(list);
                System.out.println("总记录数:"+pageInfo.getTotal());
                System.out.println("当前页:"+pageInfo.getPageNum());
                System.out.println("页大小:"+pageInfo.getPageSize());
                pageBean.setTotal(pageInfo.getTotal()+"");
                System.out.println("总页数:"+pageBean.getMaxPage());
            }
            return list;
        }

    4、处理分页结果

     

    5、特殊字符处理

    通常的特殊字符会报错

     接口

    List<Book> list6(BookVo bookVo);

    错误演示

    <select id="list6" resultType="com.huangyucan.model.Book" parameterType="com.huangyucan.model.vo.BookVo">
        select * from t_mvc_book where  price > #{min} and price < #{max}
      </select>

    结果

    两种解决方法

    1、

    <select id="list6" resultType="com.huangyucan.model.Book" parameterType="com.huangyucan.model.vo.BookVo">
        select * from t_mvc_book where  <![CDATA[  price > #{min} and price < #{max}  ]]>
      </select>/

    2、

    <select id="list6" resultType="com.qukang.model.Book">
        select * from t_mvc_book where &gt;  price > #{min} and price &lt; #{max}
      </select>

    结果

  • 相关阅读:
    51nod1381 硬币游戏
    51nod1381 硬币游戏
    51nod1384 全排列
    LOJ P10130 点的距离 题解
    POJ P1985 Cow Marathon 题解
    求树的直径(两种方法)
    洛谷 P3518 [POI2011] SEJ-Strongbox 题解
    洛谷 UVA12101 Prime Path 题解
    POJ P2251 Dungeon Master 题解
    POJ P3009 Curling 2.0 题解
  • 原文地址:https://www.cnblogs.com/bf6rc9qu/p/11698128.html
Copyright © 2020-2023  润新知