zoukankan      html  css  js  c++  java
  • SpringBoot+Mybatis+Pagehelper分页

    1、pom.xml

    <!-- mybatis分页插件 -->
    <dependency>
        <groupId>com.github.pagehelper</groupId>
        <artifactId>pagehelper-spring-boot-starter</artifactId>
        <version>1.1.1</version>
    </dependency>

     

    2、驼峰命名
    在application.properties中添加以下配置,在执行查询后,可以将数据库的NN_NN格式字段,在java结果集对象中自动转换成驼峰命名参数。

    mybatis.configuration.mapUnderscoreToCamelCase=true

    3、可复用的@Results
    a、声明时给id赋值为user

    @Results(id="user",value={
            @Result(property="nnNn",column="NN_NN")
    })

    b、在其他方法中,重复使用id为user的结果映射

    @ResultMap("user")

    c、结果映射@Results
    如果结果集不是JAVA对象而是Map,Map中的列名会和数据库中的NN_NN一样,是不会自动驼峰转换的。可以使用@Result来指明结果映射,同样也适用JAVA对象

    @Results({
        @Result(property="nnNn",column="NN_NN")    
    })
    @Select("select * from  user")    
    public List<Map> findAll();

    4、打印SQL日志到控制台
    在application.properties中添加以下配置

    logging.level.你的包名.mybatis接口包=debug
    eg、logging.level.com.lynch.mapper.PageMapper=debug #不能用*替代


    第一行:==>左边是执行SQL的接口及其方法,右边是执行语句
    第二行:传参数1,String类型
    第三行:查到一行数据

    5、分页

    package com.lynch.mapper;
    
    import java.util.List;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import org.springframework.transaction.annotation.Transactional;
    
    import com.github.pagehelper.Page;
    import com.github.pagehelper.PageHelper;
    import com.lynch.entity.UserEntity;
    
    @Service
    @Transactional
    public class PageServiceImpl {
        @Autowired
        private PageMapper pageMapper;
    
        public Page<UserEntity> pageUser(int pageNum, int pageSize) {
            // 分页插件: 查询第1页,每页10行
            Page<UserEntity> page = PageHelper.startPage(pageNum, pageSize);
            pageMapper.getAll();
            // 数据表的总行数
            page.getTotal();
            // 分页查询结果的总行数
            page.size();
            // 第一个User对象,参考list,序号0是第一个元素,依此类推
            page.get(0);
            
            return page;
        }
    }

    分页原理:PageHelper.startPage会拦截下一个sql,也就是pageMapper.getAll()的SQL。并且根据当前数据库的语法,把这个SQL改造成一个高性能的分页SQL,同时还会查询该表的总行数,具体可以看SQL日志。
    PageHelper.startPage和pageMapper.getAll()最好紧跟在一起,中间不要有别的逻辑,否则可能出BUG。
    Page<User> page:相当于一个list集合,findAll()方法查询完成后,会给page对象的相关参数赋值。

    6、回传ID
    假设数据库表的ID主键是自动增长的,现在添加一条数据,想要得到这条数据自动增长的ID,方法如下:
    a、dao层
    useGeneratedKeys=true:获取数据库生成的主键
    keyProperty="id":把主键值存入User param对象的id属性

    @Insert("insert into users(username,password,sex) values(#{username}, #{password}, #{sex})")
    @Options(useGeneratedKeys=true, keyProperty="id") 
    int insert(UserEntity user);

    b、service层

    UserEntity userEntity = new UserEntity("laosis", "123456", SexEnum.WOMAN);
    int result = pageMapper.insert(userEntity);
    System.out.println("result=" + result);
    System.out.println("回传ID值:" + userEntity.getId());

    完整demo代码
    1、PageMapper

    package com.lynch.mapper;
    
    import java.util.List;
    
    import org.apache.ibatis.annotations.Insert;
    import org.apache.ibatis.annotations.Options;
    import org.apache.ibatis.annotations.Select;
    
    import com.lynch.entity.UserEntity;
    
    public interface PageMapper {
        @Select("select * from users order by id")
        List<UserEntity> getAll();
        
        @Insert("insert into users(username,password,sex) values(#{username}, #{password}, #{sex})")
        @Options(useGeneratedKeys=true, keyProperty="id") 
        int insert(UserEntity user);
    }

    2、PageServiceImpl -- 分页service

    package com.lynch.mapper;
    
    import java.util.List;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import org.springframework.transaction.annotation.Transactional;
    
    import com.github.pagehelper.Page;
    import com.github.pagehelper.PageHelper;
    import com.lynch.entity.UserEntity;
    
    @Service
    @Transactional
    public class PageServiceImpl {
        @Autowired
        private PageMapper pageMapper;
    
        public Page<UserEntity> pageUser(int pageNum, int pageSize) {
            // 分页插件: 查询第1页,每页10行
            Page<UserEntity> page = PageHelper.startPage(pageNum, pageSize);
            pageMapper.getAll();
            // 数据表的总行数
            page.getTotal();
            // 分页查询结果的总行数
            page.size();
            // 第一个User对象,参考list,序号0是第一个元素,依此类推
            page.get(0);
            
            return page;
        }
    }

    3、PageMapperTest -- 单元测试

    package com.lynch.mapper;
    
    import java.util.List;
    
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.junit4.SpringRunner;
    
    import com.github.pagehelper.Page;
    import com.lynch.entity.UserEntity;
    import com.lynch.enums.SexEnum;
    
    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class PageMapperTest {
        @Autowired
        private PageMapper pageMapper;
        @Autowired
        private PageServiceImpl pageService;
      
        @Test
        public void getAll() throws Exception {
            List<UserEntity> users = pageMapper.getAll();
            for(UserEntity user : users) {
                System.out.println(user);
            }
            
        }
        
        @Test
        public void pageUser() throws Exception {
            int pageNum = 1;
            int pageSize = 10;
            Page<UserEntity> page = pageService.pageUser(pageNum, pageSize);
            System.out.println("page:" + page);
            for(UserEntity user : page.getResult()) {
                System.out.println(user);
            }
             
        }
        
        @Test
        public void insert() throws Exception {
            UserEntity userEntity = new UserEntity("laosis", "123456", SexEnum.WOMAN);
            int result = pageMapper.insert(userEntity);
            System.out.println("result=" + result);
            System.out.println("回传ID值:" + userEntity.getId());
        }
        
        
    
          
    }
  • 相关阅读:
    Jmeter之参数化(4种设置方法)
    Pytest+allure安装和框架搭建
    Xshell~工作中访问Linux服务器
    Jmeter之梯度式加压(Stepping Thread Group)
    Jmeter之压测探索和结果分析
    Jmeter之Linux安装(Xshell),分布式运行Linux作为slave机
    Jmeter之Plugin插件,服务器监控
    Jmeter之分布式测试/压测
    傅立叶
    触发器
  • 原文地址:https://www.cnblogs.com/linjiqin/p/9687491.html
Copyright © 2011-2022 走看看