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
书写一个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