用了MybatisPlus后,我很久没有手写sql了

本文介绍了MybatisPlus作为Mybatis的增强工具,如何简化开发并提高开发效率。从快速入门到实例演示,展示了如何配置依赖、创建Mapper和DO、查询与插入数据,揭示了MybatisPlus如何通过BaseMapper接口实现数据操作,以及它的条件构造器Wrappers的使用,帮助开发者避免手动编写SQL。

(一)前言

最早写JDBC的时候,要手动配连接信息,要一条条手写sql语句。后来Mybatis出现了,不需要再手动配置连接信息,sql语句也和代码隔离开来,但是还免不了写Sql。接着出现了MybatisPlus,这下连Sql都不用写了。

(二)什么是MybatisPlus

首先还是把官网地址拿出来:

mp.baomidou.com/guide/

简单来讲,MybatisPlus是Mybatis的增强工具,简化开发,提高开发效率。在官网中,他用这样一幅图表示MybatisPlus和Mybatis之间的关系。

在图片中,MybatisPlus表示它和Mybatis之间的关系就像魂斗罗中的两兄弟一样,互相不会影响,但是能帮你在打怪路上更加轻松。

(三)前置准备

在讲解MybatisPlus之前,我们先准备一批数据

CREATE DATABASE user;
USE user;
SET NAMES utf8mb4;
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户Id',
  `username` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户名',
  `password` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '密码',
  `gmt_create` datetime(3) NOT NULL COMMENT '创建时间',
  `gmt_modified` datetime(3) NOT NULL  COMMENT '修改时间',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci;
INSERT INTO `user` VALUES
(1,'a001','name1','123456',now(),now()),
(2,'a002','name2','123456',now(),now()),
(3,'a003','name3','123456',now(),now()),
(4,'a004','name4','123456',now(),now()),
(5,'a005','name5','123456',now(),now()),
(6,'a006','name6','123456',now(),now()),
(7,'a007','name7','123456',now(),now()),
(8,'a008','name8','123456',now(),now()),
(9,'a009','name9','123456',now(),now()),
(10,'a010','name10','123456',now(),now())
复制代码

(四)Mybatis快速入门

1、引入最新的依赖

<dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>Latest Version</version>
</dependency>
复制代码

2、在配置中心配置数据库连接信息

spring.datasource.url=jdbc:mysql://192.168.61.102:3306/user?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=false
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
复制代码

3、在Spring启动类中添加MapperScan注解

@SpringBootApplication
@MapperScan("com.example.mybatisplus.mapper")
public class MybatisPlusApplication {
    public static void main(String[] args) {
        SpringApplication.run(MybatisPlusApplication.class, args);
    }
}
复制代码

4、创建mapper,DO

MybatisPlus可以自动生成Mapper、DO、Service、Controller,这里作为教程,手动建立。MybatisPlus和Mybatis的第一个不同点,这里使用@TableName注解标明当前的实体类对应哪个表

@Data
@TableName("user")
public class UserDO {
    private Long id;
    private String userId;
    private String username;
    private String password;
    private LocalDateTime gmtCreate;
    private LocalDateTime gmtModified;
}
复制代码

创建Mapper类时,继承BaseMapper类,这是MybatisPlus提供的一个基类,封装了常用的查询操作

public interface UserMapper extends BaseMapper<UserDO> {
}
复制代码

5、查询数据

在使用Mybatis时,数据的CRUD都需要编写sql才能实现,MybatisPlus提供的BaseMapper既提供了Mapper层面的封装接口,又提供了Service层面的封装接口。基于以往的写法,平常开发中会更加倾向于使用Mapper层面的接口 介绍Mapper层面的几个接口:

比如我想查询user表的数据量,我就可以直接调用:

Integer integer = userMapper.selectCount(null);
复制代码

MybatisPlus提供了一个条件构造器Wrappers,可以通过Wrappers构造一系列条件,比如查询username为name1的数据

List<UserDO> userDOList = userMapper.selectList(Wrappers.<UserDO>lambdaQuery()
                .eq(UserDO::getUsername, "name1"));
复制代码

又比如我想查询id大于5的数据

List<UserDO> userDOList1 = userMapper.selectList(Wrappers.<UserDO>lambdaQuery()
                .gt(UserDO::getId, 5));
复制代码

6、数据插入

数据的查询使用上面的方式没有任何问题,插入数据时有几个可以优化的地方,我们可以通过一个注解@TableId设置主键自增方式,可以通过@TableField注解设置数据的自动填充。 因此修改一下UserDO这个类:

@Data
@TableName("user")
public class UserDO {
    @TableId(type = IdType.AUTO)
    private Long id;
    private String userId;
    private String username;
    private String password;
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime gmtCreate;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime gmtModified;
}
复制代码

在实体类中,设置id自增,设置gmtCreate在插入时自动填充,设置gmtModified在创建和修改时自动填充,接着配置自动填充规则:

@Configuration
public class MybatisObjectHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        setFieldValByName("gmtCreate", LocalDateTime.now(),metaObject);
        setFieldValByName("gmtModified", LocalDateTime.now(),metaObject);
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        setFieldValByName("gmtModified",LocalDateTime.now(),metaObject);
    }
}
复制代码

最后直接调用API插入数据

@Test
public void test3(){
    UserDO userDO=new UserDO();
    userDO.setUserId("a011");
    userDO.setUsername("name11");
    userDO.setPassword("123456");
    userMapper.insert(userDO);
}
复制代码

更多的查询方法可以参考官网,十分详细。但是如果你的sql涉及到多表的连表操作,还是可以自己和MyBatis一样手写sql。

(五)总结

至此,你应该对MybatisPlus有了大致的了解,另外值得一提的是MybatisPlus的开源组织苞米豆是国内的组织,因此这份文档对国内开发人员来说特别友好,可放心使用。我是鱼仔,我们下期再见!


作者:Java鱼仔
链接:https://juejin.cn/post/7005583093817933854
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

### 使用 MyBatis Plus 的 Page 类通过自定义 SQL 实现分页 在 Java 中,MyBatis Plus 提供了一个非常方便的 `Page` 类来处理分页操作。以下是关于如何使用该类并结合自定义 SQL 来实现分页功能的具体说明。 #### 1. 配置 MyBatis Plus 分页插件 为了支持分页查询,需要先配置 MyBatis Plus 的分页拦截器。这通常是在 Spring Boot 应用程序中的配置类完成: ```java import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class MyBatisPlusConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); return interceptor; } } ``` 此部分代码确保应用程序能够识别分页请求[^5]。 #### 2. 定义实体类和 Mapper 接口 假设有一个名为 `Product` 的表及其对应的实体类 `ProductEntity` 和 Mapper 接口 `ProductMapper`。 ##### ProductEntity.java ```java @Data public class ProductEntity { private Long id; private String name; private Double price; // other fields, constructors, getters, and setters } ``` ##### ProductMapper.java ```java @Mapper public interface ProductMapper extends BaseMapper<ProductEntity> { List<ProductEntity> selectProductsByCustomSql(Page<?> page); } ``` #### 3. 编自定义 SQL 查询语句 可以在 XML 文件中编自定义 SQL 并将其映射到上述接口的方法上。 ##### ProductMapper.xml ```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.example.mapper.ProductMapper"> <select id="selectProductsByCustomSql" resultType="com.example.entity.ProductEntity"> SELECT * FROM product WHERE deleted = false ORDER BY created_at DESC LIMIT #{page.pageSize} OFFSET #{page.offset} </select> </mapper> ``` 注意:这里的 `LIMIT` 和 `OFFSET` 是手动计算的部分,而 MyBatis Plus 的 `Page` 对象会自动提供这些参数[^6]。 #### 4. 在服务层调用分页逻辑 下面是一个简单的例子,展示了如何在 Service 层调用带有分页的功能。 ```java @Service public class ProductService { @Autowired private ProductMapper productMapper; public IPage<ProductEntity> getPaginatedProducts(int currentPage, int pageSize) { // 初始化分页对象 Page<ProductEntity> page = new Page<>(currentPage, pageSize); // 执行分页查询 (这里传递的是分页对象本身作为参数) productMapper.selectProductsByCustomSql(page); // 返回封装好的分页数据 return page; } } ``` 在此过程中,`Page<T>` 仅包含了当前页的数据列表,还提供了诸如总记录数、总页数等额外的信息[^7]。 #### 5. 前端交互设计 前端可以发送 AJAX 请求或者直接提交 HTML 表单至后端 API 获取指定页码的内容。例如,在 JSP 页面中可以通过如下方式加载静态资源以及构建表格结构[^3]: ```html <link rel="stylesheet" href="${pageContext.request.contextPath}/css/style.css"/> <script src="${pageContext.request.contextPath}/js/jquery.min.js"></script> <table border="1px solid black"> <thead> <tr><th>ID</th><th>Name</th><th>Price</th></tr> </thead> <tbody> <!-- 动态填充 --> </tbody> </table> ``` --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值