1、MySQL + MybatisPlus
spring-boot-starter-parent 3.4.0
- 第一步,
pom.xml
导入依赖<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.33</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.9</version> </dependency>
- 第二步,
application.yml
添加配置# mysql config spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/demo?characterEncoding=utf-8&autoReconnect=true username: root password: zhangsan123 # mybatis-plus config mybatis-plus: type-aliases-package: com.story.domain # 别名扫描包,指定实体类所在的包路径 mapper-locations: "classpath*:/mapper/**/*.xml" # Mapper.xml 文件地址 configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 定义MyBatis-Plus的日志实现方式(若不配置该参数,Mybatis在默认情况下会采用自动检测的方式):org.apache.ibatis.logging.slf4j.Slf4jImpl、org.apache.ibatis.logging.log4j.Log4jImpl、org.apache.ibatis.logging.stdout.StdOutImpl、org.apache.ibatis.logging.nologging.NoLoggingImpl map-underscore-to-camel-case: true # 是否开启下划线和驼峰的映射 cache-enabled: false # 是否开启二级缓存 global-config: banner: false # 控制MyBatis-Plus启动时是否显示banner信息 db-config: id-type: assign_id # 主键生成策略:AUTO、NONE、INPUT、ASSIGN_ID、ASSIGN_UUID update-strategy: not_null # 更新策略: 只更新非空字段 logic-delete-value: 1 # 指定了逻辑删除的值 logic-not-delete-value: 0 # 指定了未逻辑删除的值
- 第三步,代码编写(可通过 EasyCode、MybatisPlus代码生成器生成代码)
-
实体类
/** * 用户表 */ @Data @TableName("api_student") public class Student { /** * 主键 ID,使用雪花算法生成 */ @TableId(type = IdType.ASSIGN_ID) private Long id; /** * 名称 */ private String name; /** * 年龄 */ private Integer age; /** * 性别 */ private String sex; /** * 班级id */ private Integer classId; }
相关注解:@TableId、@TableName、@TableField、@TableLogic、@Version
-
数据访问层(Mapper)
package com.example.demo.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.example.demo.model.Student; import org.apache.ibatis.annotations.Mapper; @Mapper public interface StudentMapper extends BaseMapper<Student> { }
-
业务逻辑层(Service)
package com.example.demo.service; import com.baomidou.mybatisplus.extension.service.IService; import com.example.demo.model.Student; public interface StudentService extends IService<Student> { }
package com.example.demo.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.example.demo.mapper.StudentMapper; import com.example.demo.model.Student; import com.example.demo.service.StudentService; import org.springframework.stereotype.Service; @Service public class StudentServiceImpl extends ServiceImpl<StudentMapper, Student> implements StudentService { }
-
表现层(Controller)
package com.example.demo.controller; import com.example.demo.service.StudentService; import jakarta.annotation.Resource; import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("student") public class ApiUserController { @Resource private StudentService studentService; @GetMapping public Object query(@RequestParam Integer id) { return studentService.getById(id); } }
-
- 第四步,启动项目,通过终端访问:
curl http://127.0.0.1:8080/student?id=1
可能报错:
-
java: 无法访问com.baomidou.mybatisplus.extension.repository.IRepository
找不到com.baomidou.mybatisplus.extension.repository.IRepository的类文件
一般是因为
IService
继承的IRepository
所在的包mybatis-plus-extension
的版本存在版本冲突(比如项目有使用mybatis-plus-generator
)(可使用Maven Helper
查看是否存在版本冲突),将对应的依赖排除即可。 -
Invalid value type for attribute 'factoryBeanObjectType': java.lang.String
springboot3更改了factoryBean方法,导致老版本的mybatis不能兼容, 所以最新的mybatis3.0.3修复了这个问题, 然而mybatisplus中还未更新
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.9</version> <exclusions> <exclusion> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>3.0.4</version> </dependency>
-
A component required a bean of type 'com.example.demo.mapper.Mapper' that could not be found.
Mapper 类没找到,在启动类Application上添加
@MapperScan
注解@SpringBootApplication @MapperScan("com.example.demo.mapper") public class Application { public static void main(String[] args) { SpringApplication.run(Main.class, args); } }
3、PageHelper
- 第一步,
pom.xml
导入依赖<dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>6.1.0</version> </dependency>
- 第二步,
application.yml
添加配置
参数说明:pagehelper: helper-dialect: mysql reasonable: true support-methods-arguments: true
- helper-dialect:设置数据库方言为 MySQL。这是为了生成正确的分页 SQL 语句。PageHelper 会根据这个配置来选择适合的 SQL 语法和函数。
- reasonable:分页合理化参数。当设置为 true 时,如果 pageNum<1 会查询第一页,如果 pageNum>pages(总页数),会查询最后一页。默认值为 false,直接根据参数进行查询。
- support-methods-arguments:支持通过 Mapper 接口方法的参数来传递分页参数。这允许你在调用 Mapper 方法时直接使用分页参数(如 pageNum 和 pageSize),而不是在 XML 映射文件中配置。若用QueryWrapper及其子类,也可不设置。
- params:允许指定额外参数。通常这个配置不是必需的,因为 PageHelper 能够自动处理大多数情况。如果你有特殊的需求,比如需要对 count 查询进行优化,或者需要使用不同的逻辑来计算总记录数,那么你可以使用这个配置。
- 第三步,编写代码
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class UserService { @Autowired private UserMapper userMapper; public PageInfo<User> getUsersByPage(int pageNum, int pageSize) { // 设置分页参数 PageHelper.startPage(pageNum, pageSize); // 构建查询条件 QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.ge("age", 18); // 示例条件:年龄大于等于18岁 // 执行分页查询 List<User> users = userMapper.selectList(queryWrapper); // 封装分页信息 PageInfo<User> pageInfo = new PageInfo<>(users); return pageInfo; } }
关于分页插件,其实也可以用Mybatis-Plus本身自带的功能
- 第一步,
pom.xml
导入依赖<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.9</version> </dependency>
- 第二步,添加配置文件 MybatisPlusConfig
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class MybatisPlusConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { return new MybatisPlusInterceptor(); } }
- 第三步,编写业务代码
public Object page( @RequestBody PageVo pageVo ) { QueryWrapper<Student> queryWrapper = new QueryWrapper<>(); queryWrapper.orderByDesc(pageVo.getDesc()).orderByAsc(pageVo.getAsc()); Page<Student> page = new Page<>(pageVo.getPage(), pageVo.getSize()); server.page(page, queryWrapper); return page; }