springboot如何使用mybatis-plus

原文链接:https://www.longkui.site/program/java/springboot-mybatis-plus/6486/

1.项目框架搭建
首先我们搭建一个springboot项目:

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

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

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

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

2.引入相关依赖

    <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 {

}
BaseMapper里面内置了很多方法。

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

@Autowired
private StudentsBaseMapper studentsBaseMapper;

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

(7) 访问测试。

  1. 一些注解
    【@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 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 updateWrapper); // 根据 updateWrapper 条件修改实体对象
注:
update 中的 entity 为 set 条件,可以为 null。
updateWrapper 表示实体对象封装操作类(可以为 null,里面的 entity 用于生成 where 语句)
【查询数据:(查)】
T selectById(Serializable id); // 根据 主键 ID 查询数据
List selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList); // 进行批量查询
List selectByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap); // 根据表字段条件查询
T selectOne(@Param(Constants.WRAPPER) Wrapper 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 {

}
IService方法介绍:

【添加数据:(增)】
default boolean save(T entity); // 调用 BaseMapper 的 insert 方法,用于添加一条数据。
boolean saveBatch(Collection entityList, int batchSize); // 批量插入数据
注:
entityList 表示实体对象集合
batchSize 表示一次批量插入的数据量,默认为 1000
【添加或修改数据:(增或改)】
boolean saveOrUpdate(T entity); // id 若存在,则修改, id 不存在则新增数据
default boolean saveOrUpdate(T entity, Wrapper updateWrapper); // 先根据条件尝试更新,然后再执行 saveOrUpdate 操作
boolean saveOrUpdateBatch(Collection 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 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 updateWrapper); // 调用 BaseMapper 的 update 方法,根据 updateWrapper 条件修改实体对象。
boolean updateBatchById(Collection entityList, int batchSize); // 批量更新数据
【查找数据:(查)】
default T getById(Serializable id); // 调用 BaseMapper 的 selectById 方法,根据 主键 ID 返回数据。
default List listByIds(Collection<? extends Serializable> idList); // 调用 BaseMapper 的 selectBatchIds 方法,批量查询数据。
default List listByMap(Map<String, Object> columnMap); // 调用 BaseMapper 的 selectByMap 方法,根据表字段条件查询
default T getOne(Wrapper queryWrapper); // 返回一条记录(实体类保存)。
Map<String, Object> getMap(Wrapper queryWrapper); // 返回一条记录(map 保存)。
default int count(Wrapper queryWrapper); // 根据条件返回 记录数。
default List list(); // 返回所有数据。
default List list(Wrapper queryWrapper); // 调用 BaseMapper 的 selectList 方法,查询所有记录(返回 entity 集合)。
default List<Map<String, Object>> listMaps(Wrapper queryWrapper); // 调用 BaseMapper 的 selectMaps 方法,查询所有记录(返回 map 集合)。
default List listObjs(); // 返回全部记录,但只返回第一个字段的值。
default <E extends IPage> E page(E page, Wrapper queryWrapper); // 调用 BaseMapper 的 selectPage 方法,分页查询
default <E extends IPage<Map<String, Object>>> E pageMaps(E page, Wrapper queryWrapper); // 调用 BaseMapper 的 selectMapsPage 方法,分页查询
注:
get 用于返回一条记录。
list 用于返回多条记录。
count 用于返回记录总数。
page 用于分页查询。

【链式调用:】
default QueryChainWrapper query(); // 普通链式查询
default LambdaQueryChainWrapper lambdaQuery(); // 支持 Lambda 表达式的修改
default UpdateChainWrapper update(); // 普通链式修改
default LambdaUpdateChainWrapper 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 getStudents(@PathVariable(“age”) Integer age){
//定义一个QueryWrapper对象
QueryWrapper queryWrapper = new QueryWrapper<>();
//构造查询条件
queryWrapper
.select(“id”,“stu_name”,“age”) //需要查询得字段
.eq(“age”,age); //查询条件
//执行查询
List list = studentsBaseMapper.selectList(queryWrapper);
return list;
}
效果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值