springboot2.0.5集成mybatis(PageHelper分页插件、generator插件使用)

用IDEA搭建springboot2.0.5项目

选择Spring initializr就可以轻松搭建一个springboot项目,第一次搭建很费时

springboot2.0.5集成mybatis(PageHelper分页插件、generator插件使用)_第1张图片

在Group写上公司域名,Artifact写上项目名,打包用Jar

springboot2.0.5集成mybatis(PageHelper分页插件、generator插件使用)_第2张图片

选Web勾选

springboot2.0.5集成mybatis(PageHelper分页插件、generator插件使用)_第3张图片

SQL项,勾选MySQL、JDBC、MyBatis,这里选择了过后,IDEA会方便地帮我们导入相关依赖

springboot2.0.5集成mybatis(PageHelper分页插件、generator插件使用)_第4张图片

数据库建立

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `age` int(11) DEFAULT NULL,
  `name` varchar(20) DEFAULT NULL,
  `weight` varchar(10) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;

INSERT INTO `user` VALUES ('1', '23', 'zhangsan', '123');
INSERT INTO `user` VALUES ('2', '25', 'lisi', '125');
INSERT INTO `user` VALUES ('3', '30', 'wangwu', '90');
INSERT INTO `user` VALUES ('4', '12', 'zhengxie', '120');
INSERT INTO `user` VALUES ('5', '50', 'zhaocao', '100');
INSERT INTO `user` VALUES ('6', '60', 'caohuai', '150');

搭建简陋的一张表新增、查询系统

项目名称会与上面不一致,因为做demo时没有截图。

搭建完成的结构如下图:

springboot2.0.5集成mybatis(PageHelper分页插件、generator插件使用)_第5张图片

UserController代码:

package com.zab.mybatis.web;

import com.zab.mybatis.beans.User;
import com.zab.mybatis.common.GeneralResponse;
import com.zab.mybatis.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
*@author Jackson Zhang
*@date 22:58
*/
@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    @PostMapping("/findAll")
    public GeneralResponse findAll(){
        return userService.findAll();
    }

    @PostMapping("/findByPage")
    public GeneralResponse findByPaging(Integer pageNum, Integer pageSize){
        return userService.findByPaging(pageNum,pageSize);
    }

    @PostMapping("/selectByPrimaryKey")
    public GeneralResponse selectByPrimaryKey(Integer id){
        return userService.selectByPrimaryKey(id);
    }

    @PostMapping("/insert")
    public GeneralResponse insert(@RequestBody User user){
        return userService.insert(user);
    }
}

UserServiceImpl代码:

package com.zab.mybatis.service.impl;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.zab.mybatis.beans.User;
import com.zab.mybatis.common.GeneralResponse;
import com.zab.mybatis.mapper.UserMapper;
import com.zab.mybatis.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
/**
*@author Jackson Zhang
*@date 22:59 
*/
@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserMapper userMapper;//会报红线

    @Override
    public GeneralResponse findAll() {
        List users = userMapper.findAll();
        return new GeneralResponse("0","查询成功","查询成功",users);
    }

    @Override
    public GeneralResponse selectByPrimaryKey(Integer id) {
        User user = userMapper.selectByPrimaryKey(id);
        return new GeneralResponse("0","查询成功","查询成功",user);
    }

    @Override
    public GeneralResponse insert(User user) {
        int result = userMapper.insert(user);
        if(result==1){
            return new GeneralResponse("0","新增成功","新增成功",result);
        }
        return new GeneralResponse("1","新增失败","新增失败",result);
    }

    @Override
    public GeneralResponse findByPaging(Integer pageNum, Integer pageSize) {
        PageHelper.startPage(pageNum,pageSize);
        Page userList = userMapper.findByPaging();
        return new GeneralResponse("0","查询成功","查询成功",userList);
    }
}

UserMapper代码:这里并不是自己写的,除了findByPaging方法都是用插件生成的!

package com.zab.mybatis.mapper;

import com.github.pagehelper.Page;
import com.zab.mybatis.beans.User;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;
/**
*@author Jackson Zhang
*@date 23:01 
*/
@Mapper
public interface UserMapper {

    List findAll();

    int deleteByPrimaryKey(Integer id);

    int insert(User record);

    int insertSelective(User record);

    User selectByPrimaryKey(Integer id);

    int updateByPrimaryKeySelective(User record);

    int updateByPrimaryKey(User record);

    Page findByPaging();
}

UserMapper.xml如下:




    
        
        
        
        
    
    
    id, age, name, weight
  
    

    

    

    
    delete from user
    where id = #{id,jdbcType=INTEGER}
  
    
    insert into user (id, age, name, 
      weight)
    values (#{id,jdbcType=INTEGER}, #{age,jdbcType=VARCHAR}, #{name,jdbcType=VARCHAR}, 
      #{weight,jdbcType=VARCHAR})
  
    
        insert into user
        
            
                id,
            
            
                age,
            
            
                name,
            
            
                weight,
            
        
        
            
                #{id,jdbcType=INTEGER},
            
            
                #{age,jdbcType=VARCHAR},
            
            
                #{name,jdbcType=VARCHAR},
            
            
                #{weight,jdbcType=VARCHAR},
            
        
    
    
        update user
        
            
                age = #{age,jdbcType=VARCHAR},
            
            
                name = #{name,jdbcType=VARCHAR},
            
            
                weight = #{weight,jdbcType=VARCHAR},
            
        
        where id = #{id,jdbcType=INTEGER}
    
    
    update user
    set age = #{age,jdbcType=VARCHAR},
      name = #{name,jdbcType=VARCHAR},
      weight = #{weight,jdbcType=VARCHAR}
    where id = #{id,jdbcType=INTEGER}
  

实体类User:

package com.zab.mybatis.beans;
/**
*@author Jackson Zhang
*@date 23:02 
*/
public class User {

    private Integer id;

    private String age;

    private String name;

    private String weight;
    //getter、setter略
}

通用响应类GeneralResponse:

package com.zab.mybatis.common;

/**
 * @author zhang anbing
 * @date 2018/8/21
 */
public class GeneralResponse {
    /**
     * 0表示正常,1表示异常
     */
    private String code;
    /**
     * 面向用户的消息
     */
    private String message;
    /**
     * 面向开发者的详细信息
     */
    private String detail;
    /**
     * 返回给前端的数据
     */
    private T datas;

    public GeneralResponse(String code, String message, String detail, T datas) {
        this.code = code;
        this.message = message;
        this.detail = detail;
        this.datas = datas;
    }

    public static GeneralResponse success(String message, String detail) {
        return new GeneralResponse("0", message, detail, null);
    }

    public static GeneralResponse fail(String message, String detail) {
        return new GeneralResponse("1", message, detail, null);
    }
//getter、setter略
}

接下来就是配置文件,实际开发中配置文件绝不止一两个,springboot项目通常来说会有一个切换配置的配置文件application.yml:

spring:
  profiles:
    active: dev

然后就是dev、test、prod等,这里只配开发application-dev.yml:

server:
  port: 8080
spring:
  datasource:
    name: mybatis-test
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
      url: jdbc:mysql://127.0.0.1:3306/test
      username: root
      password: root
      driver-class-name: com.mysql.jdbc.Driver

mybatis:
  mapper-locations: classpath:mapping/*.xml         #配置映射文件位置,classpath指resources
  type-aliases-package: com.zab.mybatis.beans      #实体类所在位置
  configuration:                                    #打印sql到控制台
        log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

pagehelper:
    helperDialect: mysql                           #分页插件方言选择
    reasonable: true                               #合理化参数,设为true时pageNum<=0 时会查第一页, pageNum>pages(超过总数时),会查询最后一页
    supportMethodsArguments: true                  
                                                   
    

整个demo项目的pom.xml文件如下:



    4.0.0

    com.zab
    mybatis
    0.0.1-SNAPSHOT
    jar

    mybatis
    Demo project for Spring Boot

    
        org.springframework.boot
        spring-boot-starter-parent
        2.0.5.RELEASE
         
    

    
        UTF-8
        UTF-8
        1.8
    

    
        
            org.springframework.boot
            spring-boot-starter-jdbc
        
        
            org.springframework.boot
            spring-boot-starter-web
        
        
            org.mybatis.spring.boot
            mybatis-spring-boot-starter
            1.3.2
        

        
            mysql
            mysql-connector-java
            runtime
        
        
            org.springframework.boot
            spring-boot-starter-test
            test
        


        
            org.apache.commons
            commons-lang3
            3.4
        


        
            com.fasterxml.jackson.core
            jackson-core
        
        
            com.fasterxml.jackson.core
            jackson-databind
        
        
            com.fasterxml.jackson.datatype
            jackson-datatype-joda
        
        
            com.fasterxml.jackson.module
            jackson-module-parameter-names
        
        
        
            com.github.pagehelper
            pagehelper-spring-boot-starter
            1.2.5
        
        
        
            com.alibaba
            druid-spring-boot-starter
            1.1.9
        

    

    
        
            
                org.springframework.boot
                spring-boot-maven-plugin
            

            
                org.mybatis.generator
                mybatis-generator-maven-plugin
                1.3.2
                
                    ${basedir}/src/main/resources/generator/generatorConfig.xml
                    true
                    true
                
            
        
    



自动生成mapper(包括*mapper.xml和*mapper.java)的配置文件:




    
    
    
        
            
            
            
        
        
        
        
        
            
        
        
        
            
            
        
        
        
            
        
        
        
            
        
        
        

generator使用方法

1.配置Maven Configurations如下

springboot2.0.5集成mybatis(PageHelper分页插件、generator插件使用)_第6张图片

2.选择配置好的generator运行即可,就会发现配置好的文件夹中(java-->mapper和resource-->mapping)生成好了响应的mapper.java和mapper.xml

springboot2.0.5集成mybatis(PageHelper分页插件、generator插件使用)_第7张图片

generator除了这种依靠IDEA的,还有一种GUI版,运行过后再弹出的窗口中定制Mapper生成地址,给出下载链接:

https://pan.baidu.com/s/13s9zO93eVmcVNBCGV4-T3A

MySQL分页简介

MySQL分页是通过limit完成的

 

#LIMIT [offset], rows
#offset是相对于首行的偏移量(首行是0),rows是返回条数。

# 每页10条记录,取第一页,返回的是前10条记录
select * from tableA limit 0,10;
# 每页10条记录,取第二页,返回的是第11条记录,到第20条记录,
select * from tableA limit 10,10;

其实说得简单点,limit会跟俩数字a和b,a表示排除几笔,b表示取几笔。

比如:

limit 1000,10 - 过滤出1010条数据,然后排除前1000条,取10条。

limit 100000,10 - 会过滤100010条数据,然后排除前100000条,取10条。当偏移量大(排除数量过多)的时候,性能会有所下降。

例如数据库有一千万条数据,你要取500万后面十条数据,采用如下方式是不合理的:

select * from table limit 5000000,10;

可以考虑这样写:

select * from table where id>5000000 limit 0,10;

PageHelper使用方法

插件作者是国人大神刘增辉,听朋友说以前也有个PageHelper的插件用的是内存分页,就是一次性全查,再分页,不清楚是不是说的这个,但是liuzh这个插件确实是物理分页。

使用很简单,介绍两种方式

第一种,也就是上面代码展示的:

PageHelper.startPage(pageNum,pageSize);
Page userList = userMapper.findByPaging();

对应的*mapper.xml:

 

起初,我光看这几行代码,感觉这玩意是不是先全查,然后在内存中取了我们想要的那一页,毕竟sql语句是全查呀。

然后追了下源码,一调就是一下午啊,流程很复杂,也不能说看懂,大致有那么几个主要的类参与其中:MapperProxy、MapperMethod、DefaultSqlSession、Plugin、PageIntercepter(这就是PageHelper关键)、SqlSessionTemplate

springboot2.0.5集成mybatis(PageHelper分页插件、generator插件使用)_第8张图片

springboot2.0.5集成mybatis(PageHelper分页插件、generator插件使用)_第9张图片

注意到@Intercepts这个注解可以拦截Excutor类的query方法

springboot2.0.5集成mybatis(PageHelper分页插件、generator插件使用)_第10张图片

拦截query方法过后,设置分页参数,这种分页与上述UserServiceImpl中

PageHelper.startPage(pageNum,pageSize);
Page userList = userMapper.findByPaging();

的方式不一样,只是多了一个VO,少了PageHelper.startPage(pageNum,pageSize),原理都是要把分页参数通过拦截mybatis的执行流程加入到最终的sql中

 Page userList = userMapper.findByPaging(pageVo);

springboot2.0.5集成mybatis(PageHelper分页插件、generator插件使用)_第11张图片

最后执行分页查询

springboot2.0.5集成mybatis(PageHelper分页插件、generator插件使用)_第12张图片

前面说到PageHelper的第一种使用方式和简单过了下PageHelper怎么实现分页的,下面是PageHelper的第二种使用方式:

建一个PageVo类

package com.zab.mybatis.vo;

public class PageVo {
    private Integer pageNum;
    private Integer pageSize;

    //getter、setter略
}

把UserServiceImpl中的:

PageHelper.startPage(pageNum,pageSize);
Page userList = userMapper.findByPaging();

改为:

 Page userList = userMapper.findByPaging(pageVo);

响应的类中形参和实参进行修改就可以了,UserMapper.xml文件不用改动。

用postman测试

总共6笔数据,第二页取三笔:

springboot2.0.5集成mybatis(PageHelper分页插件、generator插件使用)_第13张图片

提醒下,Controller类中方法的形参如果没有加@RequestBody,那么postman用x-www-form-urlencoded传参,加上@RequestBody则用raw中的json传参。

最后给出PageHelper的官方地址,详细使用请参考:

https://github.com/pagehelper/Mybatis-PageHelper/blob/master/wikis/zh/HowToUse.md

 

你可能感兴趣的:(Java技术)