springboot如何使用mybatis-plus

原文链接:springboot如何使用mybatis-plus – 每天进步一点点

1.项目框架搭建

首先我们搭建一个springboot项目:

创建完毕后,如果出现一些红色叹号或者maven设置不成功的问题,可以参考下面两篇文章进行解决。

Project ‘org.springframework.boot:spring-boot-starter-parent:2.7.7’ not found

IDEA配置maven主目录(maven home)不生效

项目初始化后的POM文件如下:

2.引入相关依赖
   <!--Mybatis plus-->
        <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>5.1.34</version>
        </dependency>
        <!-- lombok  -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.10</version>
        </dependency>
3.基础使用方式

(1)创建数据表:

DROP TABLE IF EXISTS `students`;
CREATE TABLE `students` (
`id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`stu_name` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`stu_sex` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`class_id` int(10) NOT NULL,
`age` int(10) NOT NULL DEFAULT 18,
`create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP,
`update_time` datetime NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 10023 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
 
-- ----------------------------
-- Records of students
-- ----------------------------
INSERT INTO `students` VALUES (1001, '王晓红', '女', 2001, 20, '2022-12-28 16:28:06', '2022-12-28 16:28:06');
INSERT INTO `students` VALUES (1002, '李清乐', '男', 1001, 23, '2022-12-28 16:28:06', '2022-12-28 16:28:06');
INSERT INTO `students` VALUES (1003, '赵倚天', '男', 3001, 23, '2022-12-28 16:28:06', '2022-12-28 16:28:06');
INSERT INTO `students` VALUES (1004, '张三四', '男', 2001, 13, '2022-12-29 13:23:06', '2024-01-18 08:53:48');
INSERT INTO `students` VALUES (1005, '王老虎', '女', 1001, 19, '2022-12-29 14:00:45', '2024-01-18 08:53:54');

(2)创建对应实体类:

package site.longkui.app.entity.student;
 
import lombok.Data;
import java.util.Date;
 
@Data
public class Students {
private Integer id;
private String stu_name;
private String stu_sex;
private String class_id;
private Integer age;
private Date create_time;
private Date update_time;
 
}

(3)修改application.yml

server:
port: 8082
 
# spring配置
spring:
datasource:
#本地环境
url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
# mybaits-plus配置
mybatis-plus:
configuration:
map-underscore-to-camel-case: false #关闭驼峰命名

这个地方说明的是,mybatis-plus关闭了驼峰命名。主要原因是因为mybatis-plus查询数据的时候回默认使用驼峰命名法,也就是上面的字段他回查询stuName、stuSex、classId这种字段。关闭以后,实体类和数据库字段就一一对应了。

(4)修改启动类。加入@MapperScan

(5)创建Mapper。我们创建一个Mapper,并继承BaseMapper

@Repository
public interface StudentsBaseMapper  extends BaseMapper<Students> {

}

BaseMapper里面内置了很多方法。

(6)简单调用。我们在Controller层直接调用

 @Autowired
    private StudentsBaseMapper studentsBaseMapper;

    @GetMapping("/getAllList")
    public List<Students> getAllList(){
        List<Students> list = studentsBaseMapper.selectList(null);
        return list;
    }

(7) 访问测试。

4. 一些注解
【@TableName 】	作用于类上
    @TableName               用于定义表名
注:
    常用属性:
        value                用于定义表名
【@TableId】		作用于属性上
    @TableId                 用于定义表的主键
注:
    常用属性:
        value           用于定义主键字段名
        type            用于定义主键类型(主键策略 IdType)

   主键策略:
      IdType.AUTO          主键自增,系统分配,不需要手动输入
      IdType.NONE          未设置主键
      IdType.INPUT         需要自己输入 主键值。
      IdType.ASSIGN_ID     系统分配 ID,用于数值型数据(Long,对应 mysql 中 BIGINT 类型)。
      IdType.ASSIGN_UUID   系统分配 UUID,用于字符串型数据(String,对应 mysql 中 varchar(32) 类型)。
【@TableField】  	作用与属性上
    @TableField            用于定义表的非主键字段。
注:
    常用属性:
        value                用于定义非主键字段名
        exist                用于指明是否为数据表的字段, true 表示是,false 为不是。
        fill                 用于指定字段填充策略(FieldFill)。
        
    字段填充策略:(一般用于填充 创建时间、修改时间等字段)
        FieldFill.DEFAULT         默认不填充
        FieldFill.INSERT          插入时填充
        FieldFill.UPDATE          更新时填充
        FieldFill.INSERT_UPDATE   插入、更新时填充。
【@TableLogic】
    @TableLogic           用于定义表的字段进行逻辑删除(非物理删除)
注:
    常用属性:
        value            用于定义未删除时字段的值
        delval           用于定义删除时字段的值
【@Version】		作用于属性上
    @Version             用于字段实现乐观锁
5.BaseMapper和IService

BaseMapper接口中封装了一系列CRUD常用操作,可以直接使用。

复制代码
【添加数据:(增)】
int insert(T entity); // 插入一条记录
注:
T 表示任意实体类型
entity 表示实体对象
 
【删除数据:(删)】
int deleteById(Serializable id); // 根据主键 ID 删除
int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap); // 根据 map 定义字段的条件删除
int delete(@Param(Constants.WRAPPER) Wrapper<T> wrapper); // 根据实体类定义的 条件删除对象
int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList); // 进行批量删除
注:
id 表示 主键 ID
columnMap 表示表字段的 map 对象
wrapper 表示实体对象封装操作类,可以为 null
idList 表示 主键 ID 集合(列表、数组),不能为 null 或 empty
 
【修改数据:(改)】
int updateById(@Param(Constants.ENTITY) T entity); // 根据 ID 修改实体对象。
int update(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper<T> updateWrapper); // 根据 updateWrapper 条件修改实体对象
注:
update 中的 entity 为 set 条件,可以为 null
updateWrapper 表示实体对象封装操作类(可以为 null,里面的 entity 用于生成 where 语句)
 
【查询数据:(查)】
T selectById(Serializable id); // 根据 主键 ID 查询数据
List<T> selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList); // 进行批量查询
List<T> selectByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap); // 根据表字段条件查询
T selectOne(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper); // 根据实体类封装对象 查询一条记录
 
Integer selectCount(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper); // 查询记录的总条数
 
List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper); // 查询所有记录(返回 entity 集合)
 
List<Map<String, Object>> selectMaps(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper); // 查询所有记录(返回 map 集合)
 
List<Object> selectObjs(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper); // 查询所有记录(但只保存第一个字段的值)
 
<E extends IPage<T>> E selectPage(E page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper); // 查询所有记录(返回 entity 集合),分页
 
<E extends IPage<Map<String, Object>>> E selectMapsPage(E page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper); // 查询所有记录(返回 map 集合),分页
注:
queryWrapper 表示实体对象封装操作类(可以为 null
page 表示分页查询条件

IService层进一步封装了BaseMapper接口的方法。

public interface StudentsService extends IService<Students> {
    
}

IService方法介绍:

【添加数据:(增)】
default boolean save(T entity); // 调用 BaseMapper 的 insert 方法,用于添加一条数据。
boolean saveBatch(Collection<T> entityList, int batchSize); // 批量插入数据
注:
entityList 表示实体对象集合
batchSize 表示一次批量插入的数据量,默认为 1000
 
【添加或修改数据:(增或改)】
boolean saveOrUpdate(T entity); // id 若存在,则修改, id 不存在则新增数据
default boolean saveOrUpdate(T entity, Wrapper<T> updateWrapper); // 先根据条件尝试更新,然后再执行 saveOrUpdate 操作
boolean saveOrUpdateBatch(Collection<T> entityList, int batchSize); // 批量插入并修改数据
 
【删除数据:(删)】
default boolean removeById(Serializable id); // 调用 BaseMapper 的 deleteById 方法,根据 id 删除数据。
default boolean removeByMap(Map<String, Object> columnMap); // 调用 BaseMapper 的 deleteByMap 方法,根据 map 定义字段的条件删除
default boolean remove(Wrapper<T> queryWrapper); // 调用 BaseMapper 的 delete 方法,根据实体类定义的 条件删除对象。
default boolean removeByIds(Collection<? extends Serializable> idList); // 用 BaseMapper 的 deleteBatchIds 方法, 进行批量删除。
 
【修改数据:(改)】
default boolean updateById(T entity); // 调用 BaseMapper 的 updateById 方法,根据 ID 选择修改。
default boolean update(T entity, Wrapper<T> updateWrapper); // 调用 BaseMapper 的 update 方法,根据 updateWrapper 条件修改实体对象。
boolean updateBatchById(Collection<T> entityList, int batchSize); // 批量更新数据
 
【查找数据:(查)】
default T getById(Serializable id); // 调用 BaseMapper 的 selectById 方法,根据 主键 ID 返回数据。
default List<T> listByIds(Collection<? extends Serializable> idList); // 调用 BaseMapper 的 selectBatchIds 方法,批量查询数据。
default List<T> listByMap(Map<String, Object> columnMap); // 调用 BaseMapper 的 selectByMap 方法,根据表字段条件查询
default T getOne(Wrapper<T> queryWrapper); // 返回一条记录(实体类保存)。
Map<String, Object> getMap(Wrapper<T> queryWrapper); // 返回一条记录(map 保存)。
default int count(Wrapper<T> queryWrapper); // 根据条件返回 记录数。
default List<T> list(); // 返回所有数据。
default List<T> list(Wrapper<T> queryWrapper); // 调用 BaseMapper 的 selectList 方法,查询所有记录(返回 entity 集合)。
default List<Map<String, Object>> listMaps(Wrapper<T> queryWrapper); // 调用 BaseMapper 的 selectMaps 方法,查询所有记录(返回 map 集合)。
default List<Object> listObjs(); // 返回全部记录,但只返回第一个字段的值。
default <E extends IPage<T>> E page(E page, Wrapper<T> queryWrapper); // 调用 BaseMapper 的 selectPage 方法,分页查询
default <E extends IPage<Map<String, Object>>> E pageMaps(E page, Wrapper<T> queryWrapper); // 调用 BaseMapper 的 selectMapsPage 方法,分页查询
注:
get 用于返回一条记录。
list 用于返回多条记录。
count 用于返回记录总数。
page 用于分页查询。
 
【链式调用:】
default QueryChainWrapper<T> query(); // 普通链式查询
default LambdaQueryChainWrapper<T> lambdaQuery(); // 支持 Lambda 表达式的修改
default UpdateChainWrapper<T> update(); // 普通链式修改
default LambdaUpdateChainWrapper<T> lambdaUpdate(); // 支持 Lambda 表达式的修改
注:
query 表示查询
update 表示修改
Lambda 表示内部支持 Lambda 写法。
形如:
query().eq("column", value).one();
lambdaQuery().eq(Entity::getId, value).list();
update().eq("column", value).remove();
lambdaUpdate().eq(Entity::getId, value).update(entity);

 继承了IService接口的基本Service接口的实现,Mybatis-Plus给我们提供了很多方法,就不用我们去手动写增删改查以及分页等等了

  实现service层的serviceImpl实现类我们要继承ServiceImpl接口,这个接口的泛型参数有2个,第一个是我们的Mapper,第二个是我们实体类Bean的类名。

public class StudentsServiceImpl extends ServiceImpl<StudentsMapper, Students> implements StudentsService {
 
}

新增一个测试,我们在controller层新增一个测试

/**
* mybatis-plus QueryWrapper 查询
*/
@Autowired
private StudentsBaseService studentsBaseService;
@GetMapping("/getStudents/{age}")
public List<Students> getStudents(@PathVariable("age") Integer age){
//定义一个QueryWrapper对象
QueryWrapper<Students> queryWrapper = new QueryWrapper<>();
//构造查询条件
queryWrapper
.select("id","stu_name","age") //需要查询得字段
.eq("age",age); //查询条件
//执行查询
List<Students> list = studentsBaseMapper.selectList(queryWrapper);
return list;
}

效果:

 

posted on 2025-04-10 14:30  longkui  阅读(91)  评论(0)    收藏  举报

导航