mybatis动态sql与分页

本文详细介绍了如何在Mybatis中使用动态SQL进行条件查询,包括模糊查询的不同方式,并展示了如何处理查询结果集。同时,针对Mybatis默认分页效率低的问题,文章提出并演示了使用PageHelper插件进行高效分页的方法,以及在实际开发中如何维护模型的封装性。此外,还提及了特殊字符处理和代码块的相关内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 动态sql

延续前篇博文,进行mybatis动态sql,自己书写方法进行测试
BookMapper类中新增方法

根据id查询

在这里插入图片描述

鼠标选中方法名按Alt+Enter键进行自动生成实现

在这里插入图片描述
在这里插入图片描述

 <select id="selectBooksIn" resultType="com.tanle.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>

在这里插入图片描述

去service实现 选中按Alt+Enter键实现生成

在这里插入图片描述

BookServiceImpl中通过bookMapper调取

在这里插入图片描述

测试类

在这里插入图片描述

模糊查询
在BookMapper书写以下三种方式查询

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

在这里插入图片描述

三种不能的查询语句

在这里插入图片描述

再去BookService中调取 同样是Alt+Enter建生成

在这里插入图片描述

在这里插入图片描述

测试类

在这里插入图片描述

这里所使用的到的工具类StringUtils为了模糊查询拼接%%
第三种模糊查询方式不需要通过这个拼接 Concat

package com.tanle.util;

/**
 * @author tanle
 * @site www.tanle.com
 * @company xxx公司
 * @create  2020-10-15 18:24
 */
public class StringUtils {
   
    public static String toLinkeStr(String str){
   
        return "%"+str+"%";
    }
}

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

使用resultMap返回自定义类型集合
使用resultType返回List
使用resultType返回单个对象
使用resultType返回List,适用于多表查询返回结果集
使用resultType返回Map<String,Object>,适用于多表查询返回单个结果集

书写一个BookVo实体类
mybatis hibernate都是orm框架,表所存在的列段在实体类model都有映射
实际开发中,会因为某一些需求改变model 破坏model的封装性
此时为了保证Model的封装性,就可以使用vo类来完成指定的需求

package com.tanle.model.vo;

import com.tanle.model.Book;

import java.util.List;

/**
 * @author tanle
 * @site www.tanle.com
 * @company xxx公司
 * @create  2020-10-15 18:40
 *
 *
 * vo介绍
 * mybatis hibernate都是orm框架,表所存在的列段在实体类model都有映射
 * 实际开发中,会因为某一些需求改变model 破坏model的封装性
 * 此时为了保证Model的封装性,就可以使用vo类来完成指定的需求
 *
 */
public class BookVo extends Book {
   
    private Integer min;
    private Integer max;
    private List<Integer> bookIds;

    public Integer getMin() {
   
        return min;
    }

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

    public Integer getMax() {
   
        return max;
    }

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

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

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

在这里插入图片描述
在这里插入图片描述

service

在这里插入图片描述
在这里插入图片描述

2. 分页查询

为什么要重写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进行分页

<select id="listPager" resultType="java.util.Map" parameterType="java.util.Map">
  select * from t_mvc_book where bname like concat(concat('%',#{
   bname}),'%')
</select>

在这里插入图片描述

Mapper层

List<Map> listPager(Map map);

Service层

List<Map> listPager(Map map, PageBean pageBean);

BookServiceImpl实现层

@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.getPageNum());
        System.out.println("页大小:"+pageInfo.getPageSize());
        System.out.println("总记录:"+pageInfo.getTotal());
        pageBean.setTotal(pageInfo.getTotal()+"");
    }
    return list;
}

PageBean工具类

package com.tanle.util;

import java.io.Serializable;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

public class PageBean implements Serializable {
   

	private static final long serialVersionUID = 2422581023658455731L;

	//页码
	private int page=1;
	//每页显示记录数
	private int rows=10;
	//总记录数
	private int total=0;
	//是否分页
	private boolean isPagination=true;
	//上一次的请求路径
	private String url;
	//获取所有的请求参数
	private Map<String,String[]> map;
	
	public PageBean() {
   
		super();
	}
	
	//设置请求参数
	public void setRequest(Htt
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值