• spring boot集成mybatis(2)



    Spring Boot 集成教程


    概述

    本文在前一篇教程的基础上,使用常用的pagehelper插件,添加分页功能。本文将实现一个列出所有用户的接口,分页返回结果

    准备数据

    数据库和数据表都使用前面章节 [spring boot集成mybatis(1)] 用过的,因为要分页,表里需要插入更多数据。

    mysql命令行客户端连接数据库

    mysql -h localhost -u root -p
    

    插入数据的sql语句:

    INSERT INTO `qikegu_demo`.`user` (`nickname`, `mobile`, `password`) VALUES ('abc3', '13512345603', '123');
    INSERT INTO `qikegu_demo`.`user` (`nickname`, `mobile`, `password`) VALUES ('abc4', '13512345604', '123');
    INSERT INTO `qikegu_demo`.`user` (`nickname`, `mobile`, `password`) VALUES ('abc5', '13512345605', '123');
    INSERT INTO `qikegu_demo`.`user` (`nickname`, `mobile`, `password`) VALUES ('abc6', '13512345606', '123');
    INSERT INTO `qikegu_demo`.`user` (`nickname`, `mobile`, `password`) VALUES ('abc7', '13512345607', '123');
    INSERT INTO `qikegu_demo`.`user` (`nickname`, `mobile`, `password`) VALUES ('abc8', '13512345608', '123');
    INSERT INTO `qikegu_demo`.`user` (`nickname`, `mobile`, `password`) VALUES ('abc9', '13512345609', '123');
    INSERT INTO `qikegu_demo`.`user` (`nickname`, `mobile`, `password`) VALUES ('abc10', '13512345610', '123');
    
    

    项目依赖

    不创建新项目,重用章节 [spring boot集成mybatis(1)] 里的项目,没有项目请按该文创建。
    Eclipse打开该项目,在pom.xml文件中,添加依赖:pagehelper-spring-boot-starter,引入pagehelper相关依赖包

    添加依赖:pagehelper-spring-boot-starter

    在pom.xml中添加依赖

    		<dependency>
    		    <groupId>com.github.pagehelper</groupId>
    		    <artifactId>pagehelper-spring-boot-starter</artifactId>
    		    <version>1.2.10</version>
    		</dependency>
    

    完整的pom.xml文件

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    	<modelVersion>4.0.0</modelVersion>
    	<parent>
    		<groupId>org.springframework.boot</groupId>
    		<artifactId>spring-boot-starter-parent</artifactId>
    		<version>2.1.1.RELEASE</version>
    		<relativePath/> <!-- lookup parent from repository -->
    	</parent>
    	<groupId>com.qikegu</groupId>
    	<artifactId>springboot-mybatis-demo</artifactId>
    	<version>0.0.1-SNAPSHOT</version>
    	<name>springboot-mybatis-demo</name>
    	<description>Demo project for Spring Boot</description>
    
    	<properties>
    		<java.version>1.8</java.version>
    	</properties>
    
    	<dependencies>
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-jdbc</artifactId>
    		</dependency>
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-web</artifactId>
    		</dependency>
    		<dependency>
    			<groupId>org.mybatis.spring.boot</groupId>
    			<artifactId>mybatis-spring-boot-starter</artifactId>
    			<version>1.3.2</version>
    		</dependency>
    
    		<dependency>
    			<groupId>mysql</groupId>
    			<artifactId>mysql-connector-java</artifactId>
    			<scope>runtime</scope>
    		</dependency>
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-test</artifactId>
    			<scope>test</scope>
    		</dependency>
    		
    		<!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper-spring-boot-starter -->
    		<dependency>
    		    <groupId>com.github.pagehelper</groupId>
    		    <artifactId>pagehelper-spring-boot-starter</artifactId>
    		    <version>1.2.10</version>
    		</dependency>
    		
    	</dependencies>
    
    	<build>
    		<plugins>
    			<plugin>
    				<groupId>org.springframework.boot</groupId>
    				<artifactId>spring-boot-maven-plugin</artifactId>
    			</plugin>
    		</plugins>
    	</build>
    
    </project>
    
    

    项目配置

    添加pagehelper配置

    在application.properties中添加pagehelper配置

    pagehelper.helperDialect=mysql
    pagehelper.reasonable=true
    pagehelper.supportMethodsArguments=true
    pagehelper.params=count=countSql
    

    说明:

    • helperDialect:分页插件会自动检测当前的数据库链接,自动选择合适的分页方式。你也可以配置helperDialect属性来指定分页插件使用哪种方言。
    • reasonable:分页合理化参数,默认值为false。当该参数设置为 true 时,pageNum<=0 时会查询第一页, pageNum>pages(超过总数时),会查询最后一页。默认false 时,直接根据参数进行查询。
    • params:用于从对象中根据属性名取值, 可以配置 pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默认值, 默认值为pageNum=pageNum;pageSize=pageSize;count=countSql;reasonable=reasonable;pageSizeZero=pageSizeZero
    • supportMethodsArguments:默认值false,分页插件会从查询方法的参数值中,自动根据上面 params 配置的字段中取值,查找到合适的值时就会自动分页。

    更多信息参考pagehelper官网

    application.properties完整内容

    ## 服务器端口,如果不配置默认是8080端口
    server.port=8096 
    
    ## 数据库设置
    spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
    spring.datasource.url=jdbc:mysql://192.168.0.99:3306/qikegu_demo?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8
    spring.datasource.username=root
    spring.datasource.password=qazwsx
    
    ## mybatis配置
    #  指向映射类目录
    mybatis.type-aliases-package=com.qikegu.demo.model
    # 指向映射xml文件目录
    mybatis.mapper-locations=classpath:mapper/*.xml
    
    ## pagehelper
    pagehelper.helperDialect=mysql
    pagehelper.reasonable=true
    pagehelper.supportMethodsArguments=true
    pagehelper.params=count=countSql
    

    添加代码

    pagehelper 使用方法

    pagehelper使用方法有好几种,这里我们介绍最常用的2种:

    //方法1,Mapper接口方式的调用,推荐这种使用方式。
    PageHelper.startPage(1, 10); // pageNum=1, pageSize=10
    List<Country> list = countryMapper.selectIf(1);
    
    //方法2,参数方法调用
    //存在以下 Mapper 接口方法,你不需要在 xml 处理后两个参数
    public interface CountryMapper {
        List<Country> selectByPageNumSize(
                @Param("user") User user,
                @Param("pageNum") int pageNum,
                @Param("pageSize") int pageSize);
    }
    //配置supportMethodsArguments=true
    //在代码中直接调用:
    List<Country> list = countryMapper.selectByPageNumSize(user, 1, 10);
    

    本文例子采取方法1,更多方法参考pagehelper官网

    代码实现

    添加我们要实现的功能:列出所有用户,分页返回结果。下面几个文件需要修改:

    • UserController.java - 控制层
    • UserService.java & UserServiceImpl.java - 服务层
    • UserMapper.java & UserMapper.xml - 数据访问层

    如图:

    image

    UserController.java

    新增一个函数

       @RequestMapping(value="", method = RequestMethod.GET, produces="application/json")
        public PageInfo<User> listUser(
        		@RequestParam(value="page", required=false, defaultValue="1") int page,
        		@RequestParam(value="page-size", required=false, defaultValue="5") int pageSize){
        	
    
            List<User> result = userService.listUser(page, pageSize);
            // PageInfo包装结果,返回更多分页相关信息
            PageInfo<User> pi = new PageInfo<User>(result);
            
            return pi;
        }
    

    说明

    此函数是接口的控制层,其中

    • @RequestParam 注解获取url中的?page=1&page-size=5参数,value="page"是url中的参数名,required指参数是否必须,如果是必须URL却没有这个参数会报错,defaultValue="1"缺省值
    • PageInfo PageInfo包装结果,返回更多分页相关信息

    完整代码:

    package com.qikegu.demo.controller;
    
    import java.util.List;
    
    import javax.annotation.Resource;
    import javax.servlet.http.HttpServletRequest;
    
    import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;
    
    import com.github.pagehelper.PageHelper;
    import com.github.pagehelper.PageInfo;
    import com.qikegu.demo.model.User;
    import com.qikegu.demo.service.UserService;
    
    @RestController
    @EnableAutoConfiguration
    @RequestMapping("/user")
    public class UserController {
    	
    	// 注入mapper类
        @Resource
        private UserService userService;
    	
        @RequestMapping(value="{id}", method=RequestMethod.GET, produces="application/json")
        public User getUser(@PathVariable long id) throws Exception {
        	
            User user = this.userService.getUserById(id);
            
            return user;
        }
        
        @RequestMapping(value="", method = RequestMethod.GET, produces="application/json")
        public PageInfo<User> listUser(
        		@RequestParam(value="page", required=false, defaultValue="1") int page,
        		@RequestParam(value="page-size", required=false, defaultValue="5") int pageSize){
        	
    
            List<User> result = userService.listUser(page, pageSize);
            // PageInfo包装结果,返回更多分页相关信息
            PageInfo<User> pi = new PageInfo<User>(result);
            
            return pi;
        }
    
    }
    

    UserService.java & UserServiceImpl.java

    UserService.java新增一个接口

    public List<User> listUser(int page, int pageSize);
    

    UserServiceImpl.java新增上面接口的实现

    	@Override
    	public List<User> listUser(int page, int pageSize) {
            List<User> result = null;
            try {
            	// 调用pagehelper分页,采用starPage方式。starPage应放在Mapper查询函数之前
                PageHelper.startPage(page, pageSize); //每页的大小为pageSize,查询第page页的结果
                PageHelper.orderBy("id ASC "); //进行分页结果的排序
            	result = userMapper.selectUser();
            } catch (Exception e) {
                e.printStackTrace();
            }
    
    		return result;
    	}
    

    说明:

    请看代码注释

    完整代码:

    UserService.java

    package com.qikegu.demo.service;
    
    import java.util.List;
    
    import com.qikegu.demo.model.User;
    
    public interface UserService {
    	
        public User getUserById(long userId);
        
        public List<User> listUser(int page, int pageSize);
    }
    

    UserServiceImpl.java

    package com.qikegu.demo.service.impl;
    
    import java.util.List;
    
    import javax.annotation.Resource;
    
    import org.springframework.stereotype.Service;
    
    import com.github.pagehelper.PageHelper;
    import com.qikegu.demo.model.User;
    import com.qikegu.demo.repository.UserMapper;
    import com.qikegu.demo.service.UserService;
    
    @Service("userService")
    public class UserServiceImpl implements UserService {
    
    	//注入mybatis数据库查询类
        @Resource
        private UserMapper userMapper;
        
        @Override
        public User getUserById(long userId) {
            return userMapper.selectByPrimaryKey(userId);
        }
        
    	@Override
    	public List<User> listUser(int page, int pageSize) {
            List<User> result = null;
            try {
            	// 调用pagehelper分页,采用starPage方式。starPage应放在Mapper查询函数之前
                PageHelper.startPage(page, pageSize); //每页的大小为pageSize,查询第page页的结果
                PageHelper.orderBy("id ASC "); //进行分页结果的排序
            	result = userMapper.selectUser();
            } catch (Exception e) {
                e.printStackTrace();
            }
    
    		return result;
    	}
    }
    

    UserMapper.java & UserMapper.xml

    UserMapper.java 新增接口

        // 列出用户,对应xml映射文件元素的ID
        List<User> selectUser();
    

    UserMapper.xml 该接口新增mybatis xml实现

      <select id="selectUser" resultMap="BaseResultMap">
        select 
        <include refid="Base_Column_List" />
        from user
      </select>
    

    说明

    请看代码注释

    完整代码

    UserMapper.java

    package com.qikegu.demo.repository;
    
    import java.util.List;
    
    import com.qikegu.demo.model.User;
    
    public interface UserMapper {
    
    	// 查询某个用户,对应xml映射文件元素的ID
        User selectByPrimaryKey(long id);
        
        // 列出用户,对应xml映射文件元素的ID
        List<User> selectUser();
    }
    

    UserMapper.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.qikegu.demo.repository.UserMapper">
      <resultMap id="BaseResultMap" type="com.qikegu.demo.model.User">
        <constructor>
          <idArg column="id" javaType="_long" jdbcType="BIGINT" />
          <arg column="nickname" javaType="java.lang.String" jdbcType="VARCHAR" />
          <arg column="mobile" javaType="java.lang.String" jdbcType="VARCHAR" />
          <arg column="password" javaType="java.lang.String" jdbcType="CHAR" />
          <arg column="role" javaType="java.lang.String" jdbcType="VARCHAR" />
        </constructor>
      </resultMap>
      
      <sql id="Base_Column_List">
    	id, nickname, mobile, password, role
      </sql>
      <select id="selectByPrimaryKey" parameterType="_long" resultMap="BaseResultMap">
        select 
        <include refid="Base_Column_List" />
        from user
        where id = #{id,jdbcType=BIGINT}
      </select>
      
      <select id="selectUser" resultMap="BaseResultMap">
        select 
        <include refid="Base_Column_List" />
        from user
      </select>
      
    </mapper>
    

    运行

    Eclipse左侧,在项目根目录上点击鼠标右键弹出菜单,选择:run as -> spring boot app 运行程序。
    我们使用Postman访问接口,Postman是一款很强大的接口测试工具,很常用称得上是“居家旅行必备”,推荐使用。安装很简单,去官网下载一个,按照步骤安装就可以了。运行结果如下:

    image

    总结

    分页功能可以说是web开发中的必备功能,本文在前一篇教程的基础上,介绍了mybatis pagehelper插件的集成过程,pagehelper是一款常用的分页插件,具有和Mapper.xml完全解耦的优点,推荐在项目中使用。

    完整代码

  • 相关阅读:
    Android桌面快捷方式的实现
    Java之currenHashMap
    windows 2003 配置邮件服务器 hMailServer+squirrelmail
    bat脚本 cmd 命令
    强制客户端更新Silverlight XAP文件方法汇总(转)
    Silverlight 常用StringFormat格式总结(转)
    Excel 操作 DLL
    silverlight 开发软件列表
    通用错误处理
    use XSD.exe in VS2010 from a xsd file to class
  • 原文地址:https://www.cnblogs.com/jinbuqi/p/11014395.html
Copyright © 2020-2023  润新知