1.mybatis动态sql
1.1 if
1.2 trim mybatis中trim是动态拼接;java中表示去除前后空格 prefix:前缀 suffix:后缀 suffixOverride:去除后缀指定的字符 prefixOverrides:去除前缀指定的字符
1.3 foreach:collection/item/open/close/separator/index
代码语言:javascript复制@Test
public void demo(){
//动态SQL之if标签
List<Book> books = bookService.queryBookByIf(82);
books.forEach(System.out::println);
//动态SQL之trim标签
book.setBookName("骆驼与祥子");
book.setBookType("白话文");
bookService.insertSelective(book);
//动态SQL之foreach
BookVo bookVo=new BookVo();
bookVo.setIds(Arrays.asList(new Integer[]{81,82,83}));
List<Book> books=bookService.queryBookByForeach(bookVo);
books.forEach(System.out::println);
}
2.模糊查询(3种方式) 2.1 参数中直接加入%%
2.2 使用${...}代替#{...}(不建议使用该方式,有SQL注入风险) 关键:#{...}与${...}区别? 参数类型为字符串,#会在前后加单引号['],$则直接插入值
注: 1) mybatis中使用OGNL表达式传递参数 2) 优先使用#{...} 3) ${...}方式存在SQL注入风险
2.3 SQL字符串拼接CONCAT
代码案例如下:(我列举出来了一些,还有一个你们看着改一下就行了)
代码语言:javascript复制 //模糊查询(3种方式)
book.setBookName("2");
List<Book> books=bookService.queryBookByLike(book);
books.forEach(System.out::println);
book.setBookName("%2%");
List<Book> books=bookService.queryBookByLike(book);
books.forEach(System.out::println);
//这个是mapper.xml文件的
/*<select id="queryBookPager" resultType="com.zking.mybatis01.model.Book">
select <include refid="Base_Column_List"/> from t_book
<where>
<if test="null!=bookName and ''!=bookName">
book_name like concat('%',#{bookName},'%')
</if>
</where>
order by book_id desc
</select>
*/
3.查询返回结果集
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>,适用于多表查询返回单个结果集
resultMap、resultType
代码语言:javascript复制//查询返回ResultMap
List<Book> books=bookService.queryBookByResultMap();
books.forEach(System.out::println);
//查询返回resultType
List<Book> books=bookService.queryBookResultType1();
books.forEach(System.out::println);
Book book=bookService.queryBookResultType2(88);
System.out.println(book);
List<Map<String, Object>> maps = bookService.queryBookResultType3();
maps.forEach(System.out::println);
Map<String, Object> map = bookService.queryBookResultType4(90);
System.out.println(map);
4.分页查询
为什么要重写mybatis的分页? Mybatis的分页功能很弱,它是基于内存的分页(查出所有记录再按偏移量offset和边界limit取结果),在大数据量的情况下这样的分页基本上是没有用的 4.1 导入分页插件
代码语言:javascript复制<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.2</version>
</dependency>
4.2 将pagehelper插件配置到mybatis中
代码语言:javascript复制 <!-- 配置分页插件PageHelper, 4.0.0以后的版本支持自动识别使用的数据库 -->
<plugin interceptor="com.github.pagehelper.PageInterceptor">
</plugin>
4.3 在你需要进行分页的Mybatis方法前调用PageHelper.startPage静态方法即可,紧跟在这个方法后的第一个Mybatis查询方法会被进行分页
代码语言:javascript复制 //设置分页处理
if (null != pageBean && pageBean.isPaginate()) {
PageHelper.startPage(pageBean.getCurPage(), pageBean.getPageRecord());
}
4.4 获取分页信息(二种方式) 4.4.1 使用插件后,查询实际返回的是Page<E>,而非
代码语言:javascript复制List<E>,Page继承了ArrayList,同时还包含分页相关的信息
Page<Book> page = (Page<Book>)list;
System.out.println("页码:" page.getPageNum());
System.out.println("页大小:" page.getPageSize());
System.out.println("总记录:" page.getTotal());
4.4.2 使用PageInfo
代码语言:javascript复制PageInfo pageInfo = new PageInfo(list);
System.out.println("页码:" pageInfo.getPageNum());
System.out.println("页大小:" pageInfo.getPageSize());
System.out.println("总记录:" pageInfo.getTotal());
分页代码案例如下:
代码语言:javascript复制 //分页
PageBean pageBean=new PageBean();
book.setBookName("1");
//判断是否分页
if(null!=pageBean&&pageBean.isPagination())
PageHelper.startPage(pageBean.getPage(),pageBean.getRows());
//查询返回分页结果集
List<Book> books=bookService.queryBookPager(book,pageBean);
System.out.println(books.getClass());
//判断是否分页
if(null!=pageBean&&pageBean.isPagination()){
PageInfo pageInfo = new PageInfo(books);
System.out.println("页码:" pageInfo.getPageNum());
System.out.println("页大小:" pageInfo.getPageSize());
System.out.println("总记录:" pageInfo.getTotal());
List list = pageInfo.getList();
list.forEach(System.out::println);
}
关键的pageBean代码:
代码语言:javascript复制package com.zking.mybatis01.util;
import java.io.Serializable;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
public class PageBean implements Serializable {
//页码
private int page=1;
//每页显示条数
private int rows=10;
//总记录数
private int total=0;
//是否分页标记
private boolean pagination=true;
//上一次请求的路径
private String url;
//请求参数Map集合
private Map<String,String[]> map;
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public Map<String, String[]> getMap() {
return map;
}
public void setMap(Map<String, String[]> map) {
this.map = map;
}
public int getPage() {
return page;
}
public void setPage(int page) {
this.page = page;
}
public int getRows() {
return rows;
}
public void setRows(int rows) {
this.rows = rows;
}
public int getTotal() {
return total;
}
public void setTotal(int total) {
this.total = total;
}
public boolean isPagination() {
return pagination;
}
public void setPagination(boolean pagination) {
this.pagination = pagination;
}
//重载setPage/setRows/setPagination方法
public void setPage(String page) {
if(null!=page&&!"".equals(page))
this.page=Integer.parseInt(page);
}
public void setRows(String rows) {
if(null!=rows&&!"".equals(rows))
this.rows=Integer.parseInt(rows);
}
public void setPagination(String pagination) {
if(null!=pagination&&!"".equals(pagination))
this.pagination=Boolean.parseBoolean(pagination);
}
public void setRequest(HttpServletRequest req) {
//获取前端提交的page/rows/pagination参数
String page=req.getParameter("page");
String rows=req.getParameter("rows");
String pagination=req.getParameter("pagination");
//设置属性
this.setPage(page);
this.setPagination(pagination);
this.setRows(rows);
//设置上一次请求的路径
//第一次请求:
//http://localhost:8080/项目名/请求路径.action?page=1
//第二次请求:下一页 page=2
//项目名 请求路径.action
//req.getContextPath() req.getServletPath()==req.getRequestURI()
this.url=req.getRequestURI();
//获取请求参数集合
// checkbox name='hobby'
// Map<String,String[]> hobby==key value==new String[]{"篮球","足球",..}
this.map=req.getParameterMap();
}
/**
* 获取分页的起始位置
* @return
*/
public int getStartIndex() {
//第1页:(1-1)*10 ==0 limit 0,10
//第2页:(2-1)*10 ==10 limit 10,10
//..
return (this.page-1)*this.rows;
}
//获取末页、上一页、下一页
/**
* 获取末页
* @return
*/
public int getMaxPager() {
int maxPager=this.total/this.rows;
if(this.total%this.rows!=0)
maxPager ;
return maxPager;
}
/**
* 获取上一页
* @return
*/
public int getPreviousPager() {
int previousPager=this.page-1;
if(previousPager<=1)
previousPager=1;
return previousPager;
}
/**
* 获取下一页
* @return
*/
public int getNextPager() {
int nextPager=this.page 1;
if(nextPager>getMaxPager())
nextPager=getMaxPager();
return nextPager;
}
@Override
public String toString() {
return "PageBean [page=" page ", rows=" rows ", total=" total ", pagination=" pagination
", url=" url ", map=" map "]";
}
}