前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MyBatis——【第二章】mybatis动态sql(分页)

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

作者头像
用户10196776
发布2022-11-22 15:02:27
4610
发布2022-11-22 15:02:27
举报
文章被收录于专栏:SpringBoot+MyBatis前端

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.特殊字符处理     >(>)        <(<)       &(&)   空格( )

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-08-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 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
        • 2.模糊查询(3种方式)     2.1 参数中直接加入%%
          • 2.2 使用${...}代替#{...}(不建议使用该方式,有SQL注入风险)           关键:#{...}与${...}区别?           参数类型为字符串,#会在前后加单引号['],$则直接插入值
            •           注: 1) mybatis中使用OGNL表达式传递参数           2) 优先使用#{...}           3) ${...}方式存在SQL注入风险
              •     2.3 SQL字符串拼接CONCAT
                • 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
                            • 4.分页查询
                            •  为什么要重写mybatis的分页?    Mybatis的分页功能很弱,它是基于内存的分页(查出所有记录再按偏移量offset和边界limit取结果),在大数据量的情况下这样的分页基本上是没有用的     4.1 导入分页插件    
                            • 4.2 将pagehelper插件配置到mybatis中
                            •     4.3 在你需要进行分页的Mybatis方法前调用PageHelper.startPage静态方法即可,紧跟在这个方法后的第一个Mybatis查询方法会被进行分页
                            • 4.4 获取分页信息(二种方式)      4.4.1 使用插件后,查询实际返回的是Page<E>,而非
                            •    4.4.2 使用PageInfo
                            •  分页代码案例如下:
                              •  关键的pageBean代码:
                                • 5.特殊字符处理     >(>)        <(<)       &(&)   空格( )
                                领券
                                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档