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;
    }

效果: