前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >java进阶|MyBatis系列文章(四)分页查询加动态sql

java进阶|MyBatis系列文章(四)分页查询加动态sql

作者头像
码农王同学
发布2020-04-27 10:26:46
9140
发布2020-04-27 10:26:46
举报
文章被收录于专栏:后端Coder后端Coder
代码语言:javascript
复制
这篇文章是自己对mybatis系列文章的最后一篇文章了,原来写的文章包括基础性文章的思考也就是一些入门型的文章,后面开始写了一篇基础性文章使用原生的sqlSession进行操作,然后基于xml和注解的方式进行增删改查的操作,后面继续使用的mybatis的Provider高级用法去写了一篇文章,然后进行关联表的查询文章的分享,这里最后涉及到了web技术的最常见的分页查询的操作,到这里就结束了。

一,MyBatis框架介绍

代码语言:javascript
复制
MyBatis是支持定制化SQL,存储过程以及高级映射的优秀的持久层框架。MyBatis避免了几乎所有的JDBC代码和手动参数以及获取结果集。MyBatis可以对配置和原生Map使用简单的XML或注解,将接口和Java的POJOS(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。

二,项目所需要的jar包信息

代码语言:javascript
复制
       <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-data-jdbc</artifactId>        </dependency>        <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>2.1.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>            <exclusions>                <exclusion>                    <groupId>org.junit.vintage</groupId>                    <artifactId>junit-vintage-engine</artifactId>                </exclusion>            </exclusions>        </dependency>        <!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper-spring-boot-starter -->        <dependency>            <groupId>com.github.pagehelper</groupId>            <artifactId>pagehelper-spring-boot-starter</artifactId>        </dependency>        <dependency>            <groupId>org.projectlombok</groupId>            <artifactId>lombok</artifactId>        </dependency>

三,项目基础类Person.class

代码语言:javascript
复制
package com.wpw.mybatispagehelper.entity;
import com.wpw.mybatispagehelper.vo.RequestVo;import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;import lombok.experimental.Accessors;
import java.io.Serializable;
/** * @author wpw */@AllArgsConstructor@NoArgsConstructor@Data@Accessors(chain = true)public class Person extends RequestVo implements Serializable {    private Integer id;    private String name;    private String sex;    private Integer age;}

四,分页查询的前端请求接收参数类RequestVo这个名字起了有点随意了。

代码语言:javascript
复制
package com.wpw.mybatispagehelper.vo;
import lombok.AllArgsConstructor;import lombok.Builder;import lombok.Data;import lombok.NoArgsConstructor;import lombok.experimental.Accessors;
import java.io.Serializable;
/** * @author wpw */@AllArgsConstructor@NoArgsConstructor@Data@Builder@Accessors(chain = true)public class RequestVo implements Serializable {    private Integer pageNumber;    private Integer pageSize;}

五,前端控制器PersonController.class

代码语言:javascript
复制
package com.wpw.mybatispagehelper.controller;
import com.github.pagehelper.PageInfo;import com.wpw.mybatispagehelper.entity.Person;import com.wpw.mybatispagehelper.service.PersonService;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestBody;import org.springframework.web.bind.annotation.RestController;
/** * @author wpw */@RestControllerpublic class PersonController {    private final PersonService personService;
    public PersonController(PersonService personService) {        this.personService = personService;    }

    @PostMapping(value = "/list-pagination")    public PageInfo<Person> listPerson(@RequestBody Person person) {        PageInfo<Person> pageInfo = personService.listPerson(person);        return pageInfo;    }}

六,业务逻辑处理类PersonService.class

代码语言:javascript
复制
package com.wpw.mybatispagehelper.service;
import com.github.pagehelper.PageInfo;import com.wpw.mybatispagehelper.entity.Person;
/** * @author wpw */public interface PersonService {    /**     * @param  person 请求对象     * @return 分页后的数据信息     */    PageInfo<Person> listPerson( Person  person);
}

业务逻辑实现类的逻辑很简单就是分页和查询接口参数的传递

代码语言:javascript
复制
package com.wpw.mybatispagehelper.service.impl;
import com.github.pagehelper.PageHelper;import com.github.pagehelper.PageInfo;import com.wpw.mybatispagehelper.service.PersonService;import com.wpw.mybatispagehelper.entity.Person;import com.wpw.mybatispagehelper.mapper.PersonMapper;import org.springframework.stereotype.Service;
import java.util.List;
/** * @author wpw */@Servicepublic class PersonServiceImpl implements PersonService {    private PersonMapper personMapper;
    public PersonServiceImpl(PersonMapper personMapper) {        this.personMapper = personMapper;    }
    @Override    public PageInfo<Person> listPerson(Person person) {        PageHelper.startPage(person.getPageNumber(), person.getPageSize());        List<Person> personList = personMapper.listPerson(person);        return PageInfo.of(personList);    }}

七,操作数据库db的PersonMapper.class

代码语言:javascript
复制
package com.wpw.mybatispagehelper.mapper;
import com.wpw.mybatispagehelper.entity.Person;import org.apache.ibatis.annotations.Mapper;import org.springframework.stereotype.Repository;
import java.util.List;
@Mapper@Repositorypublic interface PersonMapper {    /**     * 获取列表信息数据     *     * @param person 请求对象     * @return 满足指定查询的列表信息     */    List<Person> listPerson(Person person);}

PersonMapper.xml文件如下:

代码语言:javascript
复制
<?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,namespace的值习惯上设置成包名+sql映射文件名,这样就能够保证namespace的值是唯一的 --><mapper namespace="com.wpw.mybatispagehelper.mapper.PersonMapper">    <resultMap id="map" type="com.wpw.mybatispagehelper.entity.Person">        <id property="id" column="id"></id>        <result property="name" column="name"></result>        <result property="sex" column="sex"></result>        <result property="age" column="age"></result>    </resultMap>    <select id="listPerson" parameterType="com.wpw.mybatispagehelper.entity.Person" resultMap="map">        select *        from person        <where>            <if test="name!=null">                name like concat ('%',#{name},'%')            </if>            <if test="sex!=null">                and sex=#{sex}            </if>            <if test="age!=null">                and age=#{age}            </if>        </where>    </select></mapper>

八,涉及的sql代码为:

代码语言:javascript
复制
use study;select database();create table if not exists `person`(    id   int(11) auto_increment primary key comment '主键',    name varchar(255) comment '名称',    sex   varchar(20) comment '性别',    age  int(3) comment '年纪') engine = InnoDb  charset = utf8;insert into  person(name,sex,age) values("zhangsan","man",10);insert into  person(name,sex,age) values("zhangsan2","man",11);insert into  person(name,sex,age) values("zhangsan3","man",12);insert into  person(name,sex,age) values("zhangsan4","man",13);insert into  person(name,sex,age) values("zhangsan5","man",14);insert into  person(name,sex,age) values("zhangsan6","man",15);insert into  person(name,sex,age) values("zhangsan7","man",16);insert into  person(name,sex,age) values("zhangsan8","man",17);insert into  person(name,sex,age) values("zhangsan9","man",18);insert into  person(name,sex,age) values("zhangsan10","man",19);insert into  person(name,sex,age) values("zhangsan11","man",20);insert into  person(name,sex,age) values("zhangsan12","man",21);

九,涉及的数据库配置信息为:

代码语言:javascript
复制
server:  port: 8080spring:  application:    name: mybatis-page-helper  datasource:    url: jdbc:mysql://localhost:3306/study?serverTimezone=UTC    username: root    password: root    driver-class-name: com.mysql.cj.jdbc.Drivermybatis:  mapper-locations: classpath:/mapper/**.xmlpagehelper:  reasonable: true

涉及的一些动态sql知识这里补充一点:

代码语言:javascript
复制
MyBatis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦。拼接的时候要确保不能忘了必要的空格,还要注意省掉列名列表最后的逗号。利用动态 SQL 这一特性可以彻底摆脱这种痛苦。通常使用动态 SQL 不可能是独立的一部分,MyBatis 当然使用一种强大的动态 SQL 语言来改进这种情形,这种语言可以被用在任意的 SQL 映射语句中。动态 SQL 元素和使用 JSTL 或其他类似基于 XML 的文本处理器相似。在 MyBatis 之前的版本中,有很多的元素需要来了解。MyBatis 3 大大提升了它们,现在用不到原先一半的元素就可以了。MyBatis 采用功能强大的基于 OGNL 的表达式来消除其他元素。内容参考:w3cSchool片段

整个项目的结构图

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-04-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码农王同学 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档