mybatis动态SQL和mybatis分页的运用

一、mybatis动态SQL

update 表名 set name=?,age=? where id=?

如果我们的前台没有传参,比如没有传入我们的name值,name就会把字段值改为null,这就违背了我们编码的初衷。

许多人会使用类似于where 1 = 1 来作为前缀,在代码中会用if判断是否为null,再用and进行一个sql拼接。

我们可以用常用的几个标签:

1、if

if标签里面,test里面的条件满足了,才会把后面的sql语句进行拼接


2、foreach

我们再调用删除的方法的时候,通常会与SQL语句中的IN查询条件结合使用。

delete from student where id in()

parameterType为List(链表)或者Array(数组),后面在引用时,参数名必须为list或者array。如在foreach标签中,collection属性则为需要迭代的集合,由于入参是个List,所以参数名必须为list。

测试一下结果

   @Test
    public void selectById() {
        List bids = Arrays.asList(new Integer[]{30, 31, 32, 33});
        bookbiz.selectById(bids).forEach(System.out::println);
    }

mybatis动态SQL和mybatis分页的运用_第1张图片

3、choose、when、otherwise

你可以使用choosewhenotherwise元素来实现类似于switch语句的逻辑。


如果传入的id不为空,则会在SQL语句中包含AND id = #{id}这个条件;如果传入的name不为空,则会在SQL语句中包含AND name = #{name}这个条件;否则,会在SQL语句中包含AND status = 'active'这个条件。

二、mybatis模糊查询

我们写入一个xml文件,log4j2.xml 用于打印出来你的sql语句





    
        
        /root/workspace/lucenedemo/logs
        /root/workspace/lucenedemo/logs/error
        /root/workspace/lucenedemo/logs/warn
        %d{yyyy-MM-dd HH:mm:ss.SSS} [%t-%L] %-5level %logger{36} - %msg%n
    

    
        
        
            
            
            
            
            
        

        
        
        
            
        
        
        
            
            
            
            
                
                
                
                
                
                
            
        

        
            
            
            
                
                
            
            
            
        

        
            
            
            
                
                
                
            
        

    

    
    
        
        
        

        
        
        
        
        
        


        
        
            
            
            
            
        

    

mybatis动态SQL和mybatis分页的运用_第2张图片

1、mybatis模糊查询的三种方式

  1. 第一种

    测试的结果

     @Test
        public void like01() {
            bookbiz.like01("%圣%").forEach(System.out::println);
        }
    

    mybatis动态SQL和mybatis分页的运用_第3张图片

  2. 第二种:$需要单引号,$传参是占位符的形式
     

     

     测试的结果

      @Test
        public void like02() {
            bookbiz.like02("%圣%").forEach(System.out::println);
        }
    

    mybatis动态SQL和mybatis分页的运用_第4张图片

  3. 第三种
     

     测试的结果

        @Test
        public void like03() {
            bookbiz.like03("%圣%").forEach(System.out::println);
        }
    

    mybatis动态SQL和mybatis分页的运用_第5张图片

2、mybatis中#与$的区别

  1. $是占位符赋值,#是预处理SQL。
  2. 外在形式,$传参不带引号''#传参自带引号''
  3. $传参存在sql注入,#不存在。
  4. $可以用来做动态列,完成动态sql的开发。

三、MyBatis结果映射(单表多表查询)


        
            
            
            
        
    

这个代码中,column属性写的是数据库里面的字段,里面有一个name的属性,是实体类里面的字段,当数据库里面的字段喝实体类里面的字段是一样的可以不用写name属性;

如果数据库里面出现了下划线,比如data_time,就需要在

使用mybatis的各种场景

使用mybatis的各种场景,返回的结果是多样的,resultType/resultMap

  1. 返回单表的对应的实体类,仅有一个查询结果,可以用resultType/resultMap。
    • 使用了resultType

       
    • 编写接口实现接口
      Book selectresultType(Integer bid);
          @Override
          public Book selectresultType(Integer bid) {
              return bookMapper.selectresultType(bid);
          }

    • 测试方法
          @Test
          public void selectresultType() {
              System.out.println("测试resultType查询");
              Book book = bookbiz.selectByPrimaryKey(12);
              System.out.println(book);
          }
    • 测试结果mybatis动态SQL和mybatis分页的运用_第6张图片

  2. 返回单表的对应的实体类,有多个查询结果,可以用resultType/resultMap。

    • resultType/resultMap。resultType一个或多个都用实体对象
      
      
          

    • 编写接口方法和实现接口
          List selectresultType01();
      
          List selectresultMap01();
      @Override
          public List selectresultType01() {
              return bookMapper.selectresultType01();
          }
      
          @Override
          public List selectresultMap01() {
              return bookMapper.selectresultMap01();
          }

    • 测试方法
          @Test
          public void selectresultType01() {
              bookbiz.selectresultType01().forEach(System.out::println);
          }
      
          @Test
          public void selectresultMap01() {
              bookbiz.selectresultMap01().forEach(System.out::println);
          }
      

    • 测试结果是一样的mybatis动态SQL和mybatis分页的运用_第7张图片
  3. 返回多表的对应的实体类,仅有一个查询结果,通常用resultType,也可以用resultMap。
  4. 返回多表的对应的实体类,有多个查询结果,通常用resultType,也可以用resultMap。

    • 编写配置,我们可以不用配置的表,可以调用其他的表
      
      
          

    • 编写接口和实现类
          Map select01(Map map);
      
          List select02(Map map);
          @Override
          public Map select01(Map map) {
              return bookMapper.select01(map);
          }
      
          @Override
          public List select02(Map map) {
              return bookMapper.select02(map);
          }

    • 测试方法
          @Test
          public void select01() {
              Map map = new HashMap();
              map.put("sid", "01");
              map.put("cid", "01");
              System.out.println(bookbiz.select01(map));
          }
      
          @Test
          public void select02() {
              Map map = new HashMap();
              map.put("sid", "01");
              map.put("cid", "01");
              bookbiz.select02(map).forEach(System.out::println);
          }

    • 测试结果
      mybatis动态SQL和mybatis分页的运用_第8张图片
      mybatis动态SQL和mybatis分页的运用_第9张图片
  5. 返回单个列表,仅有一个查询结果,就用resultType。
  6. 返回单个列表,有多个查询结果,就用resultType。
    • 配置xml
      
          
          
          
    • 编写接口和实现接口

          String selectByString01(Integer bid);
      
          List selectByString02(String bname);
        @Override
          public String selectByString01(Integer bid) {
              return bookMapper.selectByString01(bid);
          }
      
          @Override
          public List selectByString02(String bname) {
              return bookMapper.selectByString02(bname);
          }

    • 测试方法

          @Test
          public void selectByString01() {
              System.out.println(bookbiz.selectByString01(60));
          }
      
          @Test
          public void selectByString02() {
              Map map = new HashMap();
              map.put("sid", "01");
              map.put("cid", "01");
              bookbiz.selectByString02("圣墟").forEach(System.out::println);
          }

    • 测试结果mybatis动态SQL和mybatis分页的运用_第10张图片

      mybatis动态SQL和mybatis分页的运用_第11张图片

resultType:对应返回类型。

resultMap:对应返回映射关系,指的是实体类与数据表字段关系。

单表查询,返回单列,返回多表查询结果,是用resultType

查询的结果,需要有关属性的体现,那么就用resultMap

四、mybatis分页

快速实现mybatis分页

1、利用sql和map

我们首先在我们的配置xml里面编写sql

    

编写我们的接口并且实现我们的接口

    List selectFy01(Map map);
    @Override
    public List selectFy01(Map map) {
        return bookMapper.selectFy01(map);
    }

测试方法

    @Test
    public void selectFy01() {
        Map map = new HashMap();
        map.put("bname", "%圣墟%");
        map.put("start", 10);
        map.put("size", 10);
        bookbiz.selectFy01(map).forEach(System.out::println);
    }

mybatis动态SQL和mybatis分页的运用_第12张图片

2、利用分页插件

因为我们的Mybatis的分页功能很弱,它是基于内存的分页(查出所有记录再按偏移量offset和边界limit取结果),在大数据量的情况下这样的分页基本上是没有用的。

编写一个分页类

package com.tgq.utils;

import javax.servlet.http.HttpServletRequest;
import java.io.Serializable;
import java.util.Map;

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 map;
	
	public PageBean() {
		super();
	}
	
	//设置请求参数
	public void setRequest(HttpServletRequest req) {
		String page=req.getParameter("page");
		String rows=req.getParameter("rows");
		String pagination=req.getParameter("pagination");
		this.setPage(page);
		this.setRows(rows);
		this.setPagination(pagination);
		this.url=req.getContextPath()+req.getServletPath();
		this.map=req.getParameterMap();
	}
	public String getUrl() {
		return url;
	}

	public void setUrl(String url) {
		this.url = url;
	}

	public Map getMap() {
		return map;
	}

	public void setMap(Map map) {
		this.map = map;
	}

	public int getPage() {
		return page;
	}

	public void setPage(int page) {
		this.page = page;
	}
	
	public void setPage(String page) {
		if(null!=page&&!"".equals(page.trim()))
			this.page = Integer.parseInt(page);
	}

	public int getRows() {
		return rows;
	}

	public void setRows(int rows) {
		this.rows = rows;
	}
	
	public void setRows(String rows) {
		if(null!=rows&&!"".equals(rows.trim()))
			this.rows = Integer.parseInt(rows);
	}

	public int getTotal() {
		return total;
	}

	public void setTotal(int total) {
		this.total = total;
	}
	
	public void setTotal(String total) {
		this.total = Integer.parseInt(total);
	}

	public boolean isPagination() {
		return isPagination;
	}
	
	public void setPagination(boolean isPagination) {
		this.isPagination = isPagination;
	}
	
	public void setPagination(String isPagination) {
		if(null!=isPagination&&!"".equals(isPagination.trim()))
			this.isPagination = Boolean.parseBoolean(isPagination);
	}
	
	/**
	 * 获取分页起始标记位置
	 * @return
	 */
	public int getStartIndex() {
		//(当前页码-1)*显示记录数
		return (this.getPage()-1)*this.rows;
	}
	
	/**
	 * 末页
	 * @return
	 */
	public int getMaxPage() {
		int totalpage=this.total/this.rows;
		if(this.total%this.rows!=0)
			totalpage++;
		return totalpage;
	}
	
	/**
	 * 下一页
	 * @return
	 */
	public int getNextPage() {
		int nextPage=this.page+1;
		if(this.page>=this.getMaxPage())
			nextPage=this.getMaxPage();
		return nextPage;
	}
	
	/**
	 * 上一页
	 * @return
	 */
	public int getPreivousPage() {
		int previousPage=this.page-1;
		if(previousPage<1)
			previousPage=1;
		return previousPage;
	}

	@Override
	public String toString() {
		return "PageBean [page=" + page + ", rows=" + rows + ", total=" + total + ", isPagination=" + isPagination
				+ "]";
	}
}

配置pom.xml文件


    com.github.pagehelper
    pagehelper
    5.1.2


配置mybatis.cfg.xml

    
        
        
        
    

编写接口及接口实现类

    List selectFy02(@Param("bname") String bname);
    @Override
    public List selectFy02(String bname, PageBean pageBean) {
        if (pageBean != null && pageBean.isPagination())
        PageHelper.startPage(pageBean.getPage(),pageBean.getRows());
        List books = bookMapper.selectFy02(bname);
        if (pageBean != null && pageBean.isPagination()) {
            PageInfo info = new PageInfo<>(books);
            System.out.println("当前页:" + info.getPageNum());
            System.out.println("记录数:" + info.getPageSize());
            System.out.println("总记录数:" + info.getTotal());
            pageBean.setTotal((int) info.getTotal());
        }
        return books;
    }

测试方法

    @Test
    public void selectFy02() {
        String bname = "圣墟";
        PageBean pageBean = new PageBean();
        pageBean.setPage(2);
        pageBean.setRows(10);
        bookbiz.selectFy02(bname, pageBean).forEach(System.out::println);
    }

mybatis动态SQL和mybatis分页的运用_第13张图片

mybatis动态SQL和mybatis分页的运用_第14张图片

五、mymatis特殊字符

  1. pojo/entity/model:实体类
  2. vo:view object 视图对象:专门用来展示        如:java.util.Map
  3. dto:接受参数

我们在编写sql的时候会用<> 

配置xml,如果要用<>,就必须用包裹起来,不然会报错

我们的resultType可以使用BookDto ,里面有新的属性

package com.tgq.dto;

import com.tgq.model.Book;

/**
 * @软件包名 com.tgq.dto
 * @用户 tgq
 * @create 2023-08-24 下午6:24
 * @注释说明:
 */
public class BookDto extends Book {
    private float min;
    private float max;

    public float getMin() {
        return min;
    }

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

    public float getMax() {
        return max;
    }

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

编写接口和实现接口

    List selectMinMax(BookDto bookDto);
    @Override
    public List selectMinMax(BookDto bookDto) {
        return bookMapper.selectMinMax(bookDto);
    }

编写测试方法

    @Test
    public void selectMinMax() {
        BookDto bto = new BookDto();
        bto.setMin(20);
        bto.setMax(60);
        bookbiz.selectMinMax(bto).forEach(System.out::println);
    }

mybatis动态SQL和mybatis分页的运用_第15张图片
 

当然我们的xml可以不用,<和>就需要用>和<代替

    

结果是一样的

mybatis动态SQL和mybatis分页的运用_第16张图片

上一章【mybatis入门Idea搭建】

你可能感兴趣的:(mybatis,intellij-idea,java)