【框架集成】spring boot + mybatis plus + pagehelper

环境及版本
JDK:1.8
Spring Boot:2.1.6
Mybatis Plus:3.1.2
Pagehelper:5.1.10

1. 添加 maven 依赖

除了数据库驱动,其他都用当前最新版本

Spring Boot

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <version>2.1.6.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <version>2.1.6.RELEASE</version>
    <scope>test</scope>
</dependency>

Mybatis Plus

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.1.2</version>
</dependency>

Pagehelper 依赖 5.1.10 版本,需要去掉 mybatis 依赖,否则会和 mybatis plus 冲突

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <version>1.2.12</version>
    <exclusions>
        <exclusion>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
        </exclusion>
    </exclusions>
</dependency>

其他

 <dependency>
     <groupId>mysql</groupId>
     <artifactId>mysql-connector-java</artifactId>
     <version>5.1.47</version>
 </dependency>
 <dependency>
     <groupId>com.alibaba</groupId>
     <artifactId>druid</artifactId>
     <version>1.1.19</version>
 </dependency>

2. 配置文件

最简配置,木有多余的

application.yml

spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driverClassName: com.mysql.jdbc.Driver
    url: jdbc:mysql://192.168.0.200:3306/mysql?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
    username: root
    password: root123

# mybatis-plus
mybatis-plus:
  mapper-locations: classpath:mapper/**/*Mapper.xml

# pageHelper
pagehelper:
  helperDialect: mysql

3. Dao 示例

3.1 mybatis plus 的 CRUD

添加表

CREATE TABLE `t_sys_user`  (
  `id` bigint(0) NOT NULL,
  `username` varchar(32) NULL,
  `password` varchar(32) NULL,
  `name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL,
  PRIMARY KEY (`id`)
);

修改启动类

@SpringBootApplication
@MapperScan("ricky.learn.dao")
public class App {
    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }
}

添加 User 对象

@TableName("t_sys_user")
public class User {

    @TableId(type = IdType.ID_WORKER)
    private Long id;
    private String name;
    private String username;
    private String password;

    // 省略 getter setter 和构造方法
}

添加 mapper 继承 BaseMapper

@Mapper
public interface UserDao extends BaseMapper<User> {
}

测试方法

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

    @Autowired
    private UserDao userDao;

    @Test
    public void add() {
        User user = new User("王山支", "wsz", "wsz123");
        userDao.insert(user);
    }
}

结果

id username password name
1156954967293677569 wsz wsz123 王山支

解释

  • 启动类的@MapperScan("ricky.learn.dao")会扫描ricky.learn.dao下带有@Mapper的类
  • User@TableName("t_sys_user")指定表名为t_sys_user
  • id 字段的@TableId(type = IdType.ID_WORKER)在添加时会自动生成 id(雪花算法)
  • UserDao 继承了 BaseMapper 之后可以使用 mybatis plus 自带的 CRUD 方法

更多方法参考 Mybatis-Plus官方文档

3.2 分页与自定义SQL

多加几条数据

INSERT INTO `t_sys_user`(`id`, `username`, `password`, `name`) VALUES (1156958453683032065, 'wsz', 'wsz123', '王山支2');
INSERT INTO `t_sys_user`(`id`, `username`, `password`, `name`) VALUES (1156958475006885889, 'wsz', 'wsz123', '王山支3');
INSERT INTO `t_sys_user`(`id`, `username`, `password`, `name`) VALUES (1156958505272868866, 'wsz', 'wsz123', '王山支4');
INSERT INTO `t_sys_user`(`id`, `username`, `password`, `name`) VALUES (1156958534389747714, 'wsz', 'wsz123', '王山支5');

Mybatis Plus 分页

创建 MybatisPlusConfig 使用分页插件

@EnableTransactionManagement
@Configuration
@MapperScan("ricky.learn.**.dao*")
public class MybatisPlusConfig {
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
        // paginationInterceptor.setLimit(你的最大单页限制数量,默认 500 条,小于 0 如 -1 不受限制);
        return paginationInterceptor;
    }
}

使用自带的分页查询

加一个测试方法

@Test
public void page() {
    List<User> userList = userDao.selectPage(new Page<>(2, 2), null).getRecords();
    userList.forEach(System.out::println);
}

输出:

User{id=1156958475006885889, name='王山支3', username='wsz', password='wsz123'}
User{id=1156958505272868866, name='王山支4', username='wsz', password='wsz123'}

自定义SQL和mybatis plus的分页

UserDao 添加方法

@Mapper
public interface UserDao extends BaseMapper<User> {
    IPage<User> pageList(Page<User> page);
}

新建 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="ricky.learn.dao.UserDao">

    <resultMap id="UserMap" type="ricky.learn.dao.domain.User">
        <id column="id" property="id" />
        <result column="username" property="username" />
        <result column="password" property="password" />
        <result column="name" property="name" />
    </resultMap>
    
    <select id="pageList" resultMap="UserMap">
        select * from t_sys_user
    </select>

</mapper>

添加测试方法试试

@Test
public void pageList() {
    List<User> userList = userDao.pageList(new Page<>(2, 2)).getRecords();
    userList.forEach(System.out::println);
}

当 page.size < 0 则不分页,查询时不会有分页条件

@Test
public void pageList() {
    List<User> userList = userDao.pageList(new Page<>(0, -1)).getRecords();
    userList.forEach(System.out::println);
}
User{id=1156954967293677569, name='王山支', username='wsz', password='wsz123'}
User{id=1156958453683032065, name='王山支2', username='wsz', password='wsz123'}
User{id=1156958475006885889, name='王山支3', username='wsz', password='wsz123'}
User{id=1156958505272868866, name='王山支4', username='wsz', password='wsz123'}
User{id=1156958534389747714, name='王山支5', username='wsz', password='wsz123'}

Pagehelper 分页

UserDao 添加

List<User> pageList2();

UserMapper.xml 添加

<select id="pageList2" resultMap="UserMap">
    select * from t_sys_user
</select>

添加测试方法

@Test
public void pageList2() {
    PageHelper.startPage(2, 2);
    List<User> userList = userDao.pageList2();
    PageInfo<User> pageInfo = new PageInfo<>(userList);
    pageInfo.getList().forEach(System.out::println);
    System.out.println("页大小" + pageInfo.getPageSize());
    System.out.println("当前页" + pageInfo.getPageNum());
    System.out.println("总页数" + pageInfo.getPages());
    System.out.println("总条数" + pageInfo.getTotal());
    System.out.println("当前条数" + pageInfo.getSize());
}
User{id=1156958475006885889, name='王山支3', username='wsz', password='wsz123'}
User{id=1156958505272868866, name='王山支4', username='wsz', password='wsz123'}
页大小2
当前页2
总页数3
总条数5
当前条数2

4. 在 service 中使用

创建 UserService

public interface UserService extends IService<User> {
    UserDto findById(String id);
}

创建 UserServiceImpl,使用自带的 CRUD

@Service
public class UserServiceImpl extends ServiceImpl<UserDao, User> implements UserService {
    @Override
    public UserDto findById(String id) {
        User user = getById(id);
        return ConvertUtil.convert(user, UserDto.class);
    }
}

如果自己的方法名和 mybatis plus 自带的方法一样的话,使用 super

@Override
public UserDto getById(String id) {
    User user = super.getById(id);
    return ConvertUtil.convert(user, UserDto.class);
}

使用自定义方法
添加方法(省略其他方法)

public interface UserService extends IService<User> {
    IPage<User> pageList(Page<User> page);
}

注入 UserDao ,调用 UserDao 的自定义方法

@Service
public class UserServiceImpl extends ServiceImpl<UserDao, User> implements UserService {

    private UserDao userDao;

    @Autowired
    public UserServiceImpl(UserDao userDao) {
        this.userDao = userDao;
    }

    @Override
    public IPage<User> pageList(Page<User> page) {
        return userDao.pageList(page);
    }
}

测试一下

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

    @Autowired
    @Qualifier("userServiceImpl")
    private UserService userService;

    @Test
    public void pageList() {
        List<User> userList = userService.pageList(new Page(2, 2)).getRecords();
        userList.forEach(System.out::println);
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 197,000评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,825评论 2 374
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 144,055评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,766评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,639评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,453评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,860评论 3 388
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,492评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,783评论 1 293
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,817评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,624评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,439评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,872评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,075评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,372评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,868评论 2 343
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,075评论 2 338