mybatis动态sql及结果集处理

今天我们主要讲解
1、mybatis动态sql
2、模糊查询
3、查询返回结果集的处理
4、分页查询
5、特殊字符处理

1、mybatis动态sql

在参数前面加上@Param(“bookIds”)的作用是在Mapper.xml中可以使用,里面放的是别名。

List<Book> selectByIn(@Param("bookIds") List bookIds);

在Mapper接口中定义好方法,然后alt + 回车。选择下图所示。
mybatis动态sql及结果集处理_第1张图片

<select id="selectByIn" resultType="com.zking.model.Book" parameterType="java.util.List">
    select * from t_mvc_book where bid in
    <foreach collection="bookIds" open="(" close=")" separator="," item="bid">
      #{bid}
    foreach>
  select>

resultType 是你返回来的数据类型,
parameterType 是你参数的数据类型,
select中间就是你要执行的sql语句
除了foreach还有if,trim if即是判断,trim则是去空格等动态sql可以生成。
foreach使用规则:
separator 是使用什么隔开。
item 则是代表着集合中的每个元素。

然后进行测试

 @Test
    public void insert() {
        List list = new ArrayList();
        list.add(15);
        list.add(19);
        list.add(26);
        list.add(36);
        List books = this.bookService.selectByIn(list);
        for (Book b : books) {
            System.out.println(b);
        }
    }

mybatis动态sql及结果集处理_第2张图片

模糊查询

讲解三种模糊查
#{…}
${…}
Concat sql语句
Mapper接口:

 	List<Book> selectByLike1(@Param("bname") String bname);

    List<Book> selectByLike2(@Param("bname") String bname);

    List<Book> selectByLike3(@Param("bname") String bname);

sql:
这里可看到我第一个使用的是#{}、第二个使用的是${}、第三个使用的是concat()函数。后面会为大家讲解这三种区别

<select id="selectByLike1" resultType="com.zking.model.Book" parameterType="java.lang.String">
    select * from t_mvc_book where bname like #{bname}
  select>
  <select id="selectByLike2" resultType="com.zking.model.Book" parameterType="java.lang.String">
    select * from t_mvc_book where bname like '${bname}'
  select>
  <select id="selectByLike3" resultType="com.zking.model.Book" parameterType="java.lang.String">
     select * from t_mvc_book where bname like concat(concat('%',#{bname}),'%')
  select>

为了演示方便我们还写了一个静态方法用来传值

package com.zking.util;

/**
 * @author润红的爸爸
 * @site www.xiaomage.com
 * @company 潇洒公司
 * @create 2019-09-20 16:59
 */
public class StringUtils {
    public static String toLikeStr(String str){
        return "%"+str+"%";
    }
}

测试

@Test
    public void selectByLike() {
//        List books = this.bookService.selectByLike1(StringUtils.toLikeStr("圣墟"));
//        List books = this.bookService.selectByLike2(StringUtils.toLikeStr("圣墟"));
        List<Book> books = this.bookService.selectByLike3("圣墟");
        for (Book b : books) {
            System.out.println(b);
        }
    }

mybatis动态sql及结果集处理_第3张图片
三种方法都可以查出来效果但是要注意:第一种#{…}自带引号,第二种${…}有sql注入的风险

查询返回结果集的处理

resultType:适合使用返回值的数据类型是非自定义的,即jdk的提供的类型。比如String、list、int。。。
resultMap:适合使用返回值是自定义实体类的情况。也就是Mapper.xml中定义的:
mybatis动态sql及结果集处理_第4张图片
3.1 使用resultMap返回自定义类型集合

3.2 使用resultType返回List

3.3 使用resultType返回单个对象

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

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

 /**
     * 使用resultMap返回自定义类型集合
     * @return
     */
    List<Book> list1();

    /**
     * 使用resultType返回List
     * @return
     */
    List<Book> list2();

    /**
     * 使用resultType返回单个对象
     * @return
     */
    Book list3(BookVo bookVo);

    /**
     * 使用resultType返回List,适用于多表查询返回结果集
     * @return
     */
    List<Map> list4(Map map);

    /**
     * 使用resultType返回Map,适用于多表查询返回单个结果集
     * @return
     */
    Map list5(Map map);

这里就需要一个vo类了
BookVo
vo类,就是value Object,用来处理查询条件所需要用到的而又不是数据库字段的属性

package com.zking.model;

import java.util.List;

/**
 * @author润红的爸爸
 * @site www.xiaomage.com
 * @company 潇洒公司
 * @create 2019-09-20 19:15
 */
public class BookVo {
    private List<String> bookIds;
    private float min;
    private float max;

    public float getMax() {
        return max;
    }

    public void setMax(float max) {
        this.max = max;
    }

    public float getMin() {
        return min;
    }

    public void setMin(float min) {
        this.min = min;
    }

    public List<String> getBookIds() {
        return bookIds;
    }

    public void setBookIds(List<String> bookIds) {
        this.bookIds = bookIds;
    }
}

sql

<select id="list1" resultMap="BaseResultMap">
  select * from t_mvc_book
</select>
  <select id="list2" resultType="com.zking.model.Book">
  select * from t_mvc_book
</select>
  <select id="list3" resultType="com.zking.model.Book" parameterType="com.zking.model.BookVo">
    select * from t_mvc_book where bid in
    <foreach collection="bookIds" open="(" close=")" separator="," item="bid">
      #{bid}
    </foreach>
  </select>
  <select id="list4" parameterType="java.util.Map" resultType="java.util.Map">
  select * from t_mvc_book
  <where>
    <if test="null != bname and bname != ''">
      and bname like #{bname}
    </if>
  </where>
</select>
  <select id="list5" resultType="java.util.Map" parameterType="java.util.Map">
  select * from t_mvc_book
    <where>
      <if test="null != bid and bid != ''">
        and bid = #{bid}
      </if>
    </where>
</select>

测试:

@Test
    public void testListReturn() {
//        使用resultMap返回自定义类型集合
//        List books = bookService.list1();
        //        使用resultType返回List
//        List books = bookService.list2();
//        for (Book b : books) {
//            System.out.println(b);
//        }


//        使用resultType返回单个对象
//        BookVo bookVo = new BookVo();
//        List list = new ArrayList();
//        list.add("19");
//        bookVo.setBookIds(list);
//        Book books = this.bookService.list3(bookVo);
//        System.out.println(books);

        //返回的是resultType,使用List接收,适用于多表查询返回结果集
        Map map = new HashMap();
//        map.put("bname",StringUtils.toLikeStr("圣墟"));
//        List books = bookService.list4(map);
//        for (Map book : books) {
//            System.out.println(book);
//        }

        //返回的是resultType,使用Map接收
        map.put("bid",20);
        Map book = bookService.list5(map);
        System.out.println(book);
    }

分页查询

为什么要重写mybatis的分页?
Mybatis的分页功能很弱,它是基于内存的分页(查出所有记录再按偏移量offset和边界limit取结果),在大数据量的情况下这样的分页基本上是没有用的。
首先使用分页插件步奏第一步
1、导入pom依赖

<dependency>
    <groupId>com.github.pagehelpergroupId>
    <artifactId>pagehelperartifactId>
    <version>5.1.2version>
dependency>

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

在Mybatis.cfg.xml中插入:
注意要配在运行环境之前

	<plugins>
        
        <plugin interceptor="com.github.pagehelper.PageInterceptor">
        plugin>
    plugins>

然后在实现接口中写方法:

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

测试:

 @Test
    public void ListPager() {
        Map map = new HashMap();
        map.put("bname",StringUtils.toLikeStr("圣墟"));
        PageBean pageBean = new PageBean();
//        pageBean.setPage(3);
        pageBean.setPagination(false);
        List<Map> list = this.bookService.listPager(map, pageBean);
        for (Map l : list) {
            System.out.println(l);
        }
    }

特殊字符处理

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

如果要写大于或者小于符号,是会报错的,他有专门的方法来表示的。
第一种方法:
> 代替大于 <代替小于
第二种方法:
在sql语句前加上

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

    /**
     * 处理特殊字符
     * @param bookVo
     * @return
     */
    List<Map> list7(BookVo bookVo);

sql

  <select id="list6" resultType="java.util.Map" parameterType="com.zking.model.BookVo">
    select * from t_mvc_book
    <where>
      <if test="null != min and min != ''">
        and price > #{min}
      if>
      <if test="null != max and max != ''">
        and price < #{max}
      if>
    where>
  select>
  <select id="list7" resultType="java.util.Map" parameterType="com.zking.model.BookVo">
    select * from t_mvc_book
    <where>
    <if test="null != min and min != ''">
          #{min}]]>
      if>
      <if test="null != max and max != ''">
        
      if>
    where>
  select>
  @Test
    public void sqlSpecial() {
        BookVo bookVo = new BookVo();
        bookVo.setMin(20);
        bookVo.setMax(30);
//        List list = this.bookService.list6(bookVo);
        List<Map> list = this.bookService.list7(bookVo);
        for (Map l : list) {
            System.out.println(l);
        }
    }

你可能感兴趣的:(java)