目录
[1. 快速开始](#1. 快速开始)
[1. 创建user表](#1. 创建user表)
[2. 插入几条数据](#2. 插入几条数据)
[3. 创建一个新的springboot项目](#3. 创建一个新的springboot项目)
[4. 导入mybatis-plus依赖](#4. 导入mybatis-plus依赖)
[5. 在配置文件中进行配置](#5. 在配置文件中进行配置)
[6. 编写实体类](#6. 编写实体类)
[7. 编写Mapper 接口类](#7. 编写Mapper 接口类)
[8. 添加 @MapperScan 注解](#8. 添加 @MapperScan 注解)
[9. 测试](#9. 测试)
[编辑2. CRUD](#编辑2. CRUD)
[1. 插入一条语句](#1. 插入一条语句)
[2. 根据主键id删除一条记录](#2. 根据主键id删除一条记录)
[3. 根据条件构造器wrapper进行删除](#3. 根据条件构造器wrapper进行删除)
[4. 根据主键id进行查找](#4. 根据主键id进行查找)
[5. 根据主键id进行批量查找](#5. 根据主键id进行批量查找)
[6. 根据map中指定的列名和列值进行等值匹配查找](#6. 根据map中指定的列名和列值进行等值匹配查找)
[7. 根据 wrapper 条件查询](#7. 根据 wrapper 条件查询)
[8. 根据主键id进行更新](#8. 根据主键id进行更新)
[9. 根据条件构造器wrapper进行更新](#9. 根据条件构造器wrapper进行更新)
[编辑3. 分页](#编辑3. 分页)
[0. 配置分页插件](#0. 配置分页插件)
[1. 通过selectPage方法分页](#1. 通过selectPage方法分页)
[2. 通过selectMapsPage方法分页](#2. 通过selectMapsPage方法分页)
[4. 自增列的值(generated key)](#4. 自增列的值(generated key))
[5. 联接查询](#5. 联接查询)
[1. 创建一个新表(order表)并插入数据](#1. 创建一个新表(order表)并插入数据)
[2. 创建Order实体类](#2. 创建Order实体类)
[3. 联合查询](#3. 联合查询)
[4. 测试](#4. 测试)
1. 快速开始
1. 创建user表
sql
DROP TABLE IF EXISTS `user`;
CREATE TABLE user (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL,
password VARCHAR(50) NOT NULL
);
2. 插入几条数据
sql
INSERT INTO user (username, password) VALUES ('alice', 'password123');
INSERT INTO user (username, password) VALUES ('bob', 'securepass');
INSERT INTO user (username, password) VALUES ('charlie', 'mypassword');
3. 创建一个新的springboot项目
4. 导入mybatis-plus依赖
XML
<!-- springboot3 导入以下依赖 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
<version>3.5.7</version>
</dependency>
<!-- springboot2 导入以下依赖 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.7</version>
</dependency>
导入mysql依赖
XML
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
导入lombok依赖
XML
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
5. 在配置文件中进行配置
application.properties
XML
# 数据库配置
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/数据库名?serverTimezone=GMT%2B8
spring.datasource.username=账号
spring.datasource.password=密码
# MyBatis-Plus 配置
# 指定MyBatis-Plus使用StdOutImpl作为日志实现,这意味着SQL日志将输出到标准输出(通常是控制台)。
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
或 application.yml
XML
# 数据库配置
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/数据库名?serverTimezone=GMT%2B8
username: 账号
password: 密码
# MyBatis-Plus 配置
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
6. 编写实体类
java
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class User {
private Integer id;
private String username;
private String password;
}
7. 编写Mapper 接口类
java
public interface UserMapper extends BaseMapper<User> {
}
8. 添加 @MapperScan
注解
在 Spring Boot 启动类中添加 @MapperScan
注解,扫描 Mapper 文件夹
java
@SpringBootApplication
@MapperScan("com.huan.mybatis_plus_learn.mappers")//Mapper所在的类路径
public class MybatisPlusLearnApplication {
public static void main(String[] args) {
SpringApplication.run(MybatisPlusLearnApplication.class, args);
}
}
9. 测试
java
@SpringBootTest
class MybatisPlusLearnApplicationTests {
@Autowired
private UserMapper userMapper;
@Test
public void testSelect() {
System.out.println(("----- selectAll method test ------"));
List<User> userList = userMapper.selectList(null);
Assert.isTrue(3 == userList.size(), "");
for (User user : userList){
System.out.println(user);
}
}
}
控制台输出:
- CRUD
以下的方法都是BaseMapper接口中默认有的,直接使用即可。
1. 插入一条语句
直接使用BaseMapper接口中的insert(T entity)方法。
java
@Test
public void testInsert(){
User user = new User();
user.setUsername("huan");
user.setPassword("123456");
int insert = userMapper.insert(user);
System.out.println(insert);
}
但测试发现,插入的字段的id为负数。
要使id字段正常自增,需要给实体类的id字段添加@TableId(value = "id", type = IdType.AUTO)注释,用于标识数据库表的主键字段,IdType.AUTO
表示主键值由数据库自动生成,通常用于自增主键。
java
@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName
@ToString
public class User {
//添加注释
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
private String username;
private String password;
}
2. 根据主键id删除一条记录
java
@Test
public void testDeleteById(){
int delete = userMapper.deleteById(1);
System.out.println(delete);
}
控制台输出。
数据库内容。
3. 根据条件构造器wrapper进行删除
java
@Test
public void testDelete(){
// 创建条件构造器
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
// 添加条件:用户名为 "huan"
queryWrapper.eq("username", "huan");
// 执行删除操作
int deleteCount = userMapper.delete(queryWrapper);
System.out.println("删除了 " + deleteCount + " 条记录");
}
控制台输出。
4. 根据主键id进行查找
java
@Test
public void testSelectById(){
User user = userMapper.selectById(2);
System.out.println(user);
Assert.notNull(user, "User must not be null");
}
控制台输出。
5. 根据主键id进行批量查找
java
@Test
public void testSelectBatchIds(){
List<User> users = userMapper.selectBatchIds(List.of(5, 2, 3));
users.forEach(user -> System.out.println(user));
}
控制台输出。
6. 根据map中指定的列名和列值进行等值匹配查找
java
@Test
public void testSelectByMap(){
List<User> users = userMapper.selectByMap(
Map.of("username", "huan", "password", "123456"));
users.forEach(user -> System.out.println(user));
}
控制台输出。
7. 根据 wrapper 条件查询
java
@Test
public void testSelectList(){
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
//指定查询字段为id,username
queryWrapper.select("id", "username");
List<User> users = userMapper.selectList(queryWrapper);
users.forEach(user -> System.out.println(user));
}
控制台输出。
8. 根据主键id进行更新
java
@Test
public void testUpdateById(){
User user = new User();
user.setId(5);
user.setUsername("huan");
user.setPassword("huan");
int update = userMapper.updateById(user);
User user1 = userMapper.selectById(5);
System.out.println(user1);
}
控制台输出。
9. 根据条件构造器wrapper
进行更新
java
@Test
public void testUpdate(){
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
// 指定查询条件 username="huan"
queryWrapper.eq("username", "huan");
queryWrapper.select("id", "username");
User user = new User();
user.setUsername("huan1");
userMapper.update(user, queryWrapper);
//这里查询不到,因为huan改为了huan1
userMapper.selectList(queryWrapper).forEach(u -> System.out.println(user));
}
控制台输出。
- 分页
0. 配置分页插件
java
@Configuration
@ComponentScan
public class MybatisPlusConfig {
/**
* 添加分页插件
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); // 如果配置多个插件, 切记分页最后添加
// 如果有多数据源可以不配具体类型, 否则都建议配上具体的 DbType
return interceptor;
}
}
1. 通过selectPage方法分页
java
@Test
public void testSelectPage(){
// 创建分页对象 当前页,每页数据数
Page<User> page = new Page<>(2,2);
// 执行分页查询
IPage<User> userPage = userMapper.selectPage(page, null);
// 获取查询结果
List<User> users = userPage.getRecords();
long total = userPage.getTotal();
long pages = userPage.getPages();
// 输出查询结果
System.out.println("总记录数:" + total);
System.out.println("总页数:" + pages);
users.forEach(user -> System.out.println(user));
}
控制台输出。
2. 通过selectMapsPage
方法分页
该方法与selectPage的区别在于,selectMapsPage方法会将查询结果封装为一个Map<String,Object>。
java
@Test
public void testSelectMapsPage(){
// 创建分页对象
Page<Map<String, Object>> page = new Page<>(2, 2);
// 执行分页查询
IPage<Map<String, Object>> userPage = userMapper.selectMapsPage(page, null);
// 获取查询结果
List<Map<String, Object>> users = userPage.getRecords();
long total = userPage.getTotal();
long pages = userPage.getPages();
// 输出查询结果
System.out.println("总记录数:" + total);
System.out.println("总页数:" + pages);
users.forEach(user -> System.out.println(user));
}
控制台输出。
4. 自增列的值(generated key)
在 MyBatis-Plus 中,insert
方法可以直接获取自增列的值(generated key)。当你在实体类中使用 @TableId
注解并设置 type
为 IdType.AUTO
时,MyBatis-Plus 会自动处理自增主键的生成和赋值。
也就是说,MyBatis-Plus 会自动将主键的值赋值给实体类的对应字段,我们可以通过get方法直接取到主键的值。
java
@Test
public void testInsert(){
User user = new User();
user.setUsername("huan");
user.setPassword("123456");
int insert = userMapper.insert(user);
System.out.println("插入后的用户ID:" + user.getId());
}
控制台输出。
5. 联接查询
1. 创建一个新表(order表)并插入数据
sql
CREATE TABLE `order` (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
user_id BIGINT NOT NULL,
goods_name VARCHAR(255) NOT NULL,
goods_price DECIMAL(10, 2) NOT NULL
);
INSERT INTO `order` (user_id, goods_name, goods_price) VALUES (2, 'Laptop', 999.99);
INSERT INTO `order` (user_id, goods_name, goods_price) VALUES (2, 'Smartphone', 499.99);
INSERT INTO `order` (user_id, goods_name, goods_price) VALUES (3, 'Headphones', 199.99);
INSERT INTO `order` (user_id, goods_name, goods_price) VALUES (5, 'Monitor', 299.99);
INSERT INTO `order` (user_id, goods_name, goods_price) VALUES (2, 'Keyboard', 49.99);
2. 创建Order实体类
java
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Order {
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
private Integer userId;
private String goodsName;
private Double goodsPrice;
}
3. 联合查询
在Mapper中添加联合查询的方法,通过自定义 SQL 语句和@Select注解来实现。
java
public interface UserMapper extends BaseMapper<User> {
//联合查询
//查询user表和order表中user表中id和order表中id相等的数据
//u.* 表示user表的所有字段
@Select("SELECT u.*, o.goods_name, o.goods_price FROM user u INNER JOIN `order` o ON u.id = o.user_id WHERE u.id = #{userId}")
List<Map<String, Object>> selectUserWithOrders(@Param("userId") Integer userId);
}
4. 测试
java
@Test
public void testSelectUserWithOrders(){
List<Map<String, Object>> userWithOrders = userMapper.selectUserWithOrders(2);
userWithOrders.forEach(user -> System.out.println(user));
}
控制台输出。
干饭去....
参考链接: