zoukankan      html  css  js  c++  java
  • spring-boot | 整合通用Mabatis 分页插件PageHelper

    Mybatis通用Mapper介绍

    Mybatis 通用 Mapper
    极其方便的使用 Mybatis 单表的增删改查,支持单表操作,不支持通用的多表联合查询
    优点:
    通用 Mapper 可以极大的方便开发人员。
    为了让您更方便的了解通用 Mapper,下面贴一段代码来看实际效果。
    通用Mapper
    通用 Mapper 可以缓存,全部针对单表操作,每个实体类都需要继承通用 Mapper 接口来获得通用方法。

    实际开发过程中,我们对数据库单表的操作情况有很多,有了通用mapper插件, 我们实现相对应的接口,整合到spring boot项目中,减少了xml文件的配置,使我们的开发更高效。

    如何整合通用Mapper插件

    引入依赖

        <!--mapper -->
    <dependency>
    <groupId>tk.mybatis</groupId>
    <artifactId>mapper-spring-boot-starter</artifactId>
    <version>1.1.0</version>
    </dependency>
    <!--pagehelper -->
    <dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <version>1.1.0</version>
    </dependency>
    <!--阿里巴巴数据源 -->
    <dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.0.25</version>
    </dependency>

    通过pom.xml文件引入通用Mapper依赖,同时引入了druid数据源和PageHelper分页的插件,通过 springboot配置文件application.properties进行配置。

    # 驱动配置信息
    spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
    spring.datasource.url = jdbc:mysql://localhost:3306/master?useUnicode=true&characterEncoding=utf-8
    spring.datasource.username = root
    spring.datasource.password = root
    spring.datasource.driverClassName = com.mysql.jdbc.Driver

    连接池的配置信息

    初始化大小,最小,最大

    spring.druid.initialSize=5

    spring.druid.minIdle=5

    spring.druid.maxActive=20

    配置获取连接等待超时的时间

    spring.druid.maxWait=60000

    配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒

    spring.druid.timeBetweenEvictionRunsMillis=60000

    配置一个连接在池中最小生存的时间,单位是毫秒

    spring.druid.minEvictableIdleTimeMillis=300000

    spring.druid.validationQuery=SELECT 1 FROM DUAL

    spring.druid.testWhileIdle=true

    spring.druid.testOnBorrow=false

    spring.druid.testOnReturn=false

    spring.druid.poolPreparedStatements=true

    spring.druid.maxPoolPreparedStatementPerConnectionSize=20

    配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙

    spring.druid.filters=stat,wall,log4j

    通过connectProperties属性来打开mergeSql功能;慢SQL记录

    spring.druid.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000

    mybatis

    扫描entrity包

    mybatis.type-aliases-package=cn.jj.model

    mybatis.mapper-locations=classpath:mapper/*.xml

    mappers 多个接口时逗号隔开

    mapper.mappers=tk.mybatis.mapper.common.Mapper

    mapper.mappers=cn.jj.common.MyMapper

    mapper.not-empty=false

    mapper.identity=MYSQL

    pagehelper

    pagehelper.helperDialect=mysql

    pagehelper.reasonable=true

    pagehelper.supportMethodsArguments=true

    pagehelper.params=count=countSql

    到这里,我们就做好了相关的配置。接着创建MyMapper接口继承Mapper。

    
    public interface MyMapper<T> extends Mapper<T>, MySqlMapper<T> {
    }
    

    创建实体Bean,使用通用Mapper一定要保证实体类字段和数据库字段一致。如果不一致可以利用注解进行映射。

    @Column(name = "nick")
    private String name;
    @Table(name = "city")
    public class City implements Serializable{
    private static final long serialVersionUID = 1L;
    @Id
    private String id;
    private String name;
    private String state;
    public String getId() {</br>
        return id;</br>
    }</br></br>
    
    public void setId(String id) {</br>
        this.id = id;</br>
    }</br></br>
    
    public String getName() {</br>
        return name;</br>
    }</br></br>
    
    public void setName(String name) {</br>
        this.name = name;</br>
    }</br></br>
    
    public String getState() {</br>
        return state;</br>
    }</br></br>
    
    public void setState(String state) {</br>
        this.state = state;</br>
    }</br></br>
    

    }

    接着,在Mapper接口层继承刚才的MyMapper接口,到这里,单表的增删改查已经实现了。

    
    @Mapper
    public interface CityMapper extends MyMapper<City>{
    }

    接着,我们通过测试类测试下,数据库添加好相应数据。

        @Autowired
    private CityMapper cityDao;

    //查询</br>
    @Test</br>
    public void selectAll() {</br>
        List&lt;City&gt; city = cityDao.selectAll();</br>
        for (City city2 : city) {</br>
            System.out.println("id:"+city2.getId()+"	"+"name:"+city2.getName()+"	"+"state:"+city2.getState());</br>
        }</br>
    }</br>
    

    控制台输出结果如下:

    1240

    其他增删改方法大家大家试着自己尝试,也都特别简单。数据库一共有四条数据,接下来我们加上分页插件。首先我们通过官网看下分页插件所支持的数据库和Mybatis的版本。

    1240

    可以看出PageHelper支持大部分主流关系型数据库,引用分页插件以后,Mybatis分页会变得特别简单,需要注意的是,在你需要进行分页的 MyBatis 查询方法前调用 PageHelper.startPage 静态方法即可,紧跟在这个方法后的第一个MyBatis 查询方法会被进行分页。详细的使用方法我们看下官网的例子。

    例一:

    //获取第1页,10条内容,默认查询总数count
    PageHelper.startPage(1, 10);
    //紧跟着的第一个select方法会被分页
    List<Country> list = countryMapper.selectIf(1);
    assertEquals(2, list.get(0).getId());
    assertEquals(10, list.size());
    //分页时,实际返回的结果list类型是Page<E>,如果想取出分页信息,需要强制转换为Page<E>
    assertEquals(182, ((Page) list).getTotal());

    例二:

    //request: url?pageNum=1&pageSize=10
    //支持 ServletRequest,Map,POJO 对象,需要配合 params 参数
    PageHelper.startPage(request);
    //紧跟着的第一个select方法会被分页
    List<Country> list = countryMapper.selectIf(1);

    //后面的不会被分页,除非再次调用PageHelper.startPage

    List<Country> list2 = countryMapper.selectIf(null);

    //list1

    assertEquals(2, list.get(0).getId());

    assertEquals(10, list.size());

    //分页时,实际返回的结果list类型是Page<E>,如果想取出分页信息,需要强制转换为Page<E>,

    //或者使用PageInfo类(下面的例子有介绍)

    assertEquals(182, ((Page) list).getTotal());

    //list2

    assertEquals(1, list2.get(0).getId());

    assertEquals(182, list2.size());

    例三,使用PageInfo的用法:

    //获取第1页,10条内容,默认查询总数count
    PageHelper.startPage(1, 10);
    List<Country> list = countryMapper.selectAll();
    //用PageInfo对结果进行包装
    PageInfo page = new PageInfo(list);
    //测试PageInfo全部属性
    //PageInfo包含了非常全面的分页属性 assertEquals(1, page.getPageNum());
    assertEquals(10, page.getPageSize());
    assertEquals(1, page.getStartRow());
    assertEquals(10, page.getEndRow());
    assertEquals(183, page.getTotal());
    assertEquals(19, page.getPages());
    assertEquals(1, page.getFirstPage());
    assertEquals(8, page.getLastPage());
    assertEquals(true, page.isFirstPage());
    assertEquals(false, page.isLastPage());
    assertEquals(false, page.isHasPreviousPage());
    assertEquals(true, page.isHasNextPage());

    下面是我们自己的service层查询方法,使用PageHelper进行分页,取出第二页数据,每页显示两条:

    @Override
    public List<City> selectAll() {
    //分页插件的使用 第一个参数是当前页 第二个参数是每页显示的条数
    PageHelper.startPage(2, 2);
    return cityDao.selectAll();
    }

    再来看一下测试类:

    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class MapperTest {

    @Autowired</br>
    private CityService cityService;</br></br>
    
    @Autowired</br>
    private UserService userService;</br></br>
    
    //查询</br>
    @Test</br>
    public void selectAll() {</br>
        List&lt;City&gt; city = cityService.selectAll();</br>
        for (City city2 : city) {</br>
            System.out.println("id:"+city2.getId()+"	"+"name:"+city2.getName()+"	"+"state:"+city2.getState());</br>
        }</br>
     }</br>
    

    }

    接下来我们开始测试,通过查看控制台输出信息,说明分页已经生效。数据库一共是四条数据,我们取出第二页数据,取出两条。打印结果如下:


    1240

    到此,通用Mapper和PageHelper已经和spring boot整合完毕!spring boot 对于开发者来说正变得越来越高效、敏捷!
    (完)


    参考文章

    Mybatis通用Mapper
    PageHelper官方文档

        </div>
  • 相关阅读:
    【python笔记】类
    【Marva Collins' Way】第八章
    【Marva Collins' Way】第七章
    【python笔记】包
    【python笔记】模块
    【Marva Collins' Way】第六章
    【Marva Collins' Way】第九章
    【python笔记】异常
    Axios跨域&封装接口
    js更新数据
  • 原文地址:https://www.cnblogs.com/jpfss/p/9117671.html
Copyright © 2011-2022 走看看