mybatis动态sql和分页

mybatis动态sql和分页

mybatis动态sql

注意:@Param

BookMapper

    /**
     * param
     * 如果形参maper.xml中使用就要加上面的注释
     * map name:zs age:12
     * @param bookIds
     * @return
     */
    List<Book> selectBooksIn(@Param("bookIds") List bookIds); 

BookMapper.xml

<!--<foreach标签的使用>-->
  <select id="selectBooksIn" resultType="com.zhuling.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>
测试类:BokServiceTest
    @Test
    public void selectBooksLike1(){
        List list=new ArrayList();
        list.add(1);
        list.add(12);
        list.add(16);
        List<Book> books = this.bookService.selectBooksIn(list);
        for (Book b:books)
            System.out.println(b);
    }

模糊查询

#{...}

${...}

Concat

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

BookMapper

    /**
     * mybatis
     * 模糊查询有三种方式
     * #{}
     * ${}
     * concat
     * @param bname
     * @return
     */
    List<Book> selectBooksLike1(@Param("bname") String bname);
    List<Book> selectBooksLike2(@Param("bname") String bname);
    List<Book> selectBooksLike3(@Param("bname") String bname);

 BookMapper.xml


  <!--模糊查询 #{}-->
  <select id="selectBooksLike1" resultType="com.zhuling.model.Book" parameterType="java.lang.String" >
    select * from t_mvc_book where bname like #{bname}
  </select>

  <!--模糊查询 ${}-->
  <select id="selectBooksLike2" resultType="com.zhuling.model.Book" parameterType="java.lang.String" >
    select * from t_mvc_book where bname like '${bname}'
  </select>

  <!--模糊查询 Concat-->
  <select id="selectBooksLike3" resultType="com.zhuling.model.Book" parameterType="java.lang.String" >
    select * from t_mvc_book where bname like concat(concat('%',#{bname}),'%')
  </select>



测试类:BokServiceTest
 /**
     *#与$的区别
     */
    @Test
    public void selectBooksIn(){
        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 b:books){
            System.out.println(b);
        }

    }
 

查询返回结果集的处理

resultMap:适合使用返回值是自定义实体类的情况

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

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

3.2 使用resultType返回List<T>

3.3 使用resultType返回单个对象

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

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

 

BookMapper

/**
     * mybatis结果集处理的五种情况
     * @return
     */
    List<Book> list1();

    List<Book> list2();

    List<Book> list3(BookVo bookVo);

    List<Map> list4(Map map);

    Map list5(Map map);
BookMapper.xml
  <!--mybatis结果集处理的五种情况-->
  <select id="list1" resultMap="BaseResultMap" >
    select * from t_mvc_book
  </select>

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

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

  <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>

  <select id="list5" resultType="java.util.Map" parameterType="java.util.Map"  >
    select * from t_mvc_book where bid =#{bid}
  </select>
测试类:BokServiceTest
 /**
     *mybatis查询返回结果集
     */
    @Test
    public void list() {
//        List<Book> books = this.bookService.list1();
//        List<Book> books = this.bookService.list2();
        List list=new ArrayList();
        list.add(1);
        list.add(12);
        list.add(16);
//        BookVo bookVo=new BookVo();
//        bookVo.setBookIds(list);
//        List<Book> books = this.bookService.list3(bookVo);
//
//
//        for (Book b : books) {
//            System.out.println(b);
//        }

//        Map map=new HashMap();
//        map.put("bookIds",list);
//        List<Map> mapList = this.bookService.list4(map);
//        for (Map m : mapList) {
//            System.out.println(m);
//
//        }
//        map.put("bid",1);
//        System.out.println(this.bookService.list5(map));


    }

分页查询

为什么要重写mybatis的分页?

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

使用分页插件步奏

1、导入pom依赖

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

3、使用PageHelper进行分页

4、处理分页结果

pom依赖

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

Mybatis.cfg.xml配置拦截器

 

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

 

BookMapper

    /**
     * mybatis分页查询
     * @return
     */
    List<Map> listPager(Map map);

BookMapper.xml

 

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

测试:BokServiceTest

    /**
     *mybatis分页查询
     */
    @Test
    public void listPager() {
        Map map=new HashMap();
        map.put("bname","%圣墟%");
        PageBean pageBean=new PageBean();
//        pageBean.setPagination(false);
        pageBean.setPage(2);
        List<Map> list = this.bookService.listPager(map, pageBean);
        for (Map map1 : list) {
            System.out.println(map1);
        }

    }

特殊字符处理

>(>)   
    <(<)  
    &(&) 
 空格( )
 <![CDATA[ <= ]]> 

 

BookMapper 

    /**
     * mybatis特殊字符的处理
     * @param bookVo
     * @return
     */
    List<Book> list6(BookVo bookVo);

BookMapper.xml

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


测试:BokServiceTest

 /**
     *mybatis特殊字符处理
     */
    @Test
    public void list6() {
        BookVo bookvo=new BookVo();
        bookvo.setMax(15);
        bookvo.setMin(15);
        List<Book> books = this.bookService.list6(bookvo);
        for (Book book : books) {
            System.out.println(book);
        }
    }

原文地址:https://www.cnblogs.com/BAYOUA/p/11694463.html