MyBatis——【第二章】mybatis动态sql(分页)

2022-11-22 15:02:27 浏览数 (1)

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   "]";
	}
	
}

5.特殊字符处理     >(>)        <(<)       &(&)   空格( )

0 人点赞