MyBatisPlus的使用

一、MyBatis-Plus 是什么?

  • ​定位​​:MyBatis 的增强工具,简化开发,提高效率。
  • ​特点​​:内置通用 Mapper、通用 Service、条件构造器、分页插件等,无需编写繁琐的 XML。
  • ​核心思想​​:通过少量配置实现单表 CRUD 操作,复杂 SQL 仍可手写。

二、快速开始(Spring Boot 环境)

1. 添加依赖

在 pom.xml 中引入:

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>最新版本(如3.5.3)</version>
</dependency>
<!-- 数据库驱动(如MySQL) -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.25</version>
</dependency>
2. 配置数据库

在 application.yml 中:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver
3. 创建实体类
@Data  // Lombok 注解,自动生成 getter/setter
@TableName("user")  // 对应数据库表名
public class User {
    @TableId(type = IdType.AUTO)  // 主键自增
    private Long id;
    private String name;
    private Integer age;
    private String email;
}
4. 创建 Mapper 接口
public interface UserMapper extends BaseMapper<User> {
    // 无需写 XML,直接继承 BaseMapper 即具备 CRUD 方法
}
5. 在启动类添加注解
@SpringBootApplication
@MapperScan("com.example.mapper")  // 扫描 Mapper 接口所在包
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

三、基本 CRUD 操作

1. 插入数据
User user = new User();
user.setName("张三");
user.setAge(25);
user.setEmail("zhangsan@example.com");
userMapper.insert(user);  // 插入后自动回填主键
2. 查询操作
// 根据 ID 查询
User user = userMapper.selectById(1L);

// 条件查询(查询 name=张三且 age=25 的用户)
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", "张三").eq("age", 25);
List<User> users = userMapper.selectList(queryWrapper);
3. 更新操作
User user = new User();
user.setId(1L);
user.setAge(30);
userMapper.updateById(user);  // 根据 ID 更新
4. 删除操作
userMapper.deleteById(1L);  // 根据 ID 删除

// 条件删除
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("age", 25);
userMapper.delete(wrapper);

四、条件构造器(Wrapper)

1.QueryWrapper 详解
(1)基本用法
QueryWrapper<User> wrapper = new QueryWrapper<>();
(2)常用条件方法
a. 等值条件
wrapper.eq("name", "张三")     // name = '张三'
       .ne("age", 20)         // age != 20
       .isNotNull("email");   // email IS NOT NULL
b. 范围条件
wrapper.gt("age", 18)        // age > 18
       .ge("age", 20)        // age >= 20
       .lt("age", 30)        // age < 30
       .le("age", 25)        // age <= 25
       .between("age", 20, 30) // age BETWEEN 20 AND 30
       .notBetween("age", 20, 30); // age NOT BETWEEN 20 AND 30
c. 模糊查询
wrapper.like("name", "张")    // name LIKE '%张%'
       .likeLeft("name", "三")  // name LIKE '%三'
       .likeRight("name", "张") // name LIKE '张%'
       .notLike("name", "李");  // name NOT LIKE '%李%'
d. 逻辑条件
wrapper.and(w -> w.eq("name", "张三").gt("age", 20))  // AND (name = '张三' AND age > 20)
       .or(w -> w.eq("name", "李四").lt("age", 30)); // OR (name = '李四' OR age < 30)
e. 排序与分组
wrapper.orderByAsc("age")     // ORDER BY age ASC
       .orderByDesc("id")    // ORDER BY id DESC
       .groupBy("department"); // GROUP BY department
f. 指定返回字段
wrapper.select("id", "name", "age"); // SELECT id, name, age
g. 子查询
wrapper.inSql("id", "SELECT id FROM user WHERE age > 18")  // id IN (SELECT id ...)
       .notInSql("id", "SELECT id FROM user WHERE age < 10");
(3)动态条件拼接

根据业务逻辑动态添加条件:

QueryWrapper<User> wrapper = new QueryWrapper<>();
if (StringUtils.isNotBlank(name)) {
    wrapper.like("name", name);
}
if (age != null) {
    wrapper.gt("age", age);
}
List<User> users = userMapper.selectList(wrapper);
2.LambdaQueryWrapper 详解
(1)为什么用Lambda
  • ​优势​​:避免字段名硬编码,编译时检查,重构友好。
  • ​语法​​:通过 User::getXxx 引用字段。
(2)基本用法
LambdaQueryWrapper<User> lambdaWrapper = new LambdaQueryWrapper<>();
(3)常用方法
lambdaWrapper.eq(User::getName, "张三")
             .gt(User::getAge, 20)
             .between(User::getAge, 20, 30)
             .like(User::getName, "张")
             .orderByAsc(User::getAge);
 (4)动态条件示例
lambdaWrapper
    .eq(name != null, User::getName, name) // 仅当 name 不为空时生效
    .gt(age != null, User::getAge, age);
 3.复杂条件组合
(1)嵌套条件
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.and(w -> w.eq("name", "张三").or().eq("name", "李四"))
       .and(w -> w.gt("age", 20).lt("age", 30));

生成的SQL:

WHERE (name = '张三' OR name = '李四') AND (age > 20 AND age < 30)
 (2)多OR条件
wrapper.or(w -> w.eq("name", "张三").eq("name", "李四"));

生成的SQL:

WHERE name = '张三' OR name = '李四'
 4.条件构造器的链式调用优化
(1)直接链式挑战
List<User> users = userMapper.selectList(
    new QueryWrapper<User>()
        .eq("name", "张三")
        .gt("age", 20)
        .orderByDesc("id")
);
(2)复用 Wrapper 对象
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("status", 1);

// 根据不同场景追加条件
if (isAdmin) {
    wrapper.eq("is_admin", 1);
} else {
    wrapper.eq("department", "IT");
}
 5.条件构造器的实际应用场景
(1)动态搜索功能
public List<User> searchUsers(String keyword, Integer minAge, Integer maxAge) {
    LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
    wrapper.like(StringUtils.isNotBlank(keyword), User::getName, keyword)
           .or()
           .like(StringUtils.isNotBlank(keyword), User::getEmail, keyword)
           .ge(minAge != null, User::getAge, minAge)
           .le(maxAge != null, User::getAge, maxAge);
    return userMapper.selectList(wrapper);
}
(2)多表联查中的条件传递
// 假设联查用户表和订单表
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.inSql("id", "SELECT user_id FROM order WHERE amount > 1000");
List<User> users = userMapper.selectList(wrapper);
 6.总结表格
方法名作用示例
eq() / ne()等于 / 不等于eq("name", "张三")
gt() / lt()大于 / 小于gt("age", 20)
between()范围查询between("age", 20, 30)
like() / notLike()模糊查询like("name", "张")
and() / or()逻辑与 / 或and(w -> w.eq(...))
orderByAsc()升序排序orderByAsc("age")
select()指定返回字段select("id", "name")
inSql()子查询inSql("id", "SELECT id FROM ...")

五、分页查询

1. 配置分页插件
@Configuration
public class MyBatisPlusConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        return interceptor;
    }
}
2. 使用分页
// 第 2 页,每页 5 条
Page<User> page = new Page<>(2, 5);
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.gt("age", 20);
Page<User> result = userMapper.selectPage(page, wrapper);

// 获取结果
List<User> users = result.getRecords();
long total = result.getTotal();

六、常用注解

1. @TableName
  • 指定实体类对应的表名。
  • 示例:@TableName("sys_user")
2. @TableId
  • 标记主键字段。
  • 可选主键策略:
    • IdType.AUTO:数据库自增
    • IdType.ASSIGN_ID:雪花算法生成 ID(默认)
3. @TableField
  • 解决字段名与数据库列名不一致问题。
  • 示例:@TableField("nick_name")

七、总结

  • ​优点​​:减少样板代码,提高开发效率。
  • ​适用场景​​:单表操作、简单查询。
  • ​复杂 SQL​​:仍可通过 XML 或注解方式编写。
MybatisPlus 是一个 Mybatis 的增强工具,它简化了 Mybatis 的开发流程,提供了许多实用的功能,如自动生成 SQL、分页、逻辑删除等。下面是 MybatisPlus使用方法: 1. 引入 MybatisPlus 通过 Maven 引入 MybatisPlus 的依赖: ```xml <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>${mybatis-plus.version}</version> </dependency> ``` 2. 配置 MybatisPlus 在 Spring Boot 项目中配置 MybatisPlus,需要在 application.yml 文件中添加以下配置: ```yaml mybatis-plus: # mapper.xml 所在路径 mapper-locations: classpath:/mapper/*.xml # 实体类所在包 typeAliasesPackage: com.example.entity ``` 3. 定义实体类 实体类需要使用 MybatisPlus 提供的注解来标记字段,如 @Table、@Id、@TableField 等。例如: ```java @Data @TableName("user") public class User { @TableId(type = IdType.AUTO) private Long id; private String name; private Integer age; @TableField(fill = FieldFill.INSERT) private Date createTime; @TableField(fill = FieldFill.UPDATE) private Date updateTime; @TableLogic private Integer deleted; } ``` 4. 定义 Mapper Mapper 接口需要继承 MybatisPlus 提供的 BaseMapper 接口,例如: ```java public interface UserMapper extends BaseMapper<User> { } ``` 5. 使用 MybatisPlus 使用 MybatisPlus 的查询、插入、更新、删除等操作,只需要调用 BaseMapper 接口提供的方法即可,例如: ```java @Service public class UserServiceImpl implements UserService { @Autowired private UserMapper userMapper; @Override public User getUserById(Long id) { return userMapper.selectById(id); } @Override public boolean addUser(User user) { return userMapper.insert(user) > 0; } @Override public boolean updateUser(User user) { return userMapper.updateById(user) > 0; } @Override public boolean deleteUserById(Long id) { return userMapper.deleteById(id) > 0; } } ``` 以上就是 MybatisPlus 的基本使用方法。除了上述功能,MybatisPlus 还提供了许多其他实用的功能,如分页、逆向工程、多租户、动态表名等,可以根据具体需求进行使用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值