https://baomidou.com/
https://www.bilibili.com/video/BV1nW421R7qJ
https://b11et3un53m.feishu.cn/wiki/PsyawI04ei2FQykqfcPcmd7Dnsc
数据库mybatis_plus
CREATE TABLE user
(
id BIGINT(20) NOT NULL COMMENT '主键ID',
name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
age INT(11) NULL DEFAULT NULL COMMENT '年龄',
email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY (id)
);
INSERT INTO user (id, name, age, email) VALUES
(1, 'Jone', 18, 'test1@baomidou.com'),
(2, 'Jack', 20, 'test2@baomidou.com'),
(3, 'Tom', 28, 'test3@baomidou.com'),
(4, 'Sandy', 21, 'test4@baomidou.com'),
(5, 'Billie', 24, 'test5@baomidou.com');
创建springBoot工程,引入mp相关依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.atguigu</groupId>
<artifactId>mybatis_plus_demo</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.0.5</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--mybatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3.1</version>
</dependency>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.30</version>
</dependency>
<!--lombok用来简化实体类-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
</project>
创建springBoot配置文件,指定数据库路径 application.properties
#mysql数据库连接
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://192.168.77.219:3306/mybatis_plus?serverTimezone=GMT%2B8&useSSL=false
spring.datasource.username=root
spring.datasource.password=root
#mybatis日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
编写实体类 User.java:
@Data
@TableName("`user`")
public class User {
private Long id;
private String name;
private Integer age;
private String email;
}
https://baomidou.com/reference/annotation/
1、 @TableName
该注解用于指定实体类对应的数据库表名。当实体类名与数据库表名不一致,或者实体类名不是数据库表名的驼峰写法时,您需要使用这个注解来明确指定表名。
2、@TableField
该注解用于标记实体类中的非主键字段,它告诉 MyBatis-Plus 如何映射实体类字段到数据库表字段。如果你的实体类字段名遵循驼峰命名规则,并且与数据库表字段名一致,你可以省略这个注解。
@TableField(“nickname”) // 映射到数据库字段 “nickname”
private String name;
3、
@TableField(exist=false)
private String others;
指示这个字段是否存在于数据库表中。如果设置为 false,MyBatis-Plus 在生成 SQL 时会忽略这个字段。
创建mapper,继承BaseMapper
public interface UserMapper extends BaseMapper<User> {
}
BaseMapper里面已经封装好了很多常用的方法
public interface BaseMapper<T> extends Mapper<T> {
int insert(T entity);
int deleteById(Serializable id);
int deleteById(T entity);
int deleteByMap(@Param("cm") Map<String, Object> columnMap);
int delete(@Param("ew") Wrapper<T> queryWrapper);
int deleteBatchIds(@Param("coll") Collection<?> idList);
int updateById(@Param("et") T entity);
int update(@Param("et") T entity, @Param("ew") Wrapper<T> updateWrapper);
T selectById(Serializable id);
List<T> selectBatchIds(@Param("coll") Collection<? extends Serializable> idList);
List<T> selectByMap(@Param("cm") Map<String, Object> columnMap);
default T selectOne(@Param("ew") Wrapper<T> queryWrapper) {
List<T> list = this.selectList(queryWrapper);
if (list.size() == 1) {
return (T)list.get(0);
} else if (list.size() > 1) {
throw new TooManyResultsException("Expected one result (or null) to be returned by selectOne(), but found: " + list.size());
} else {
return null;
}
}
default boolean exists(Wrapper<T> queryWrapper) {
Long count = this.selectCount(queryWrapper);
return null != count && count > 0L;
}
Long selectCount(@Param("ew") Wrapper<T> queryWrapper);
List<T> selectList(@Param("ew") Wrapper<T> queryWrapper);
List<Map<String, Object>> selectMaps(@Param("ew") Wrapper<T> queryWrapper);
List<Object> selectObjs(@Param("ew") Wrapper<T> queryWrapper);
<P extends IPage<T>> P selectPage(P page, @Param("ew") Wrapper<T> queryWrapper);
<P extends IPage<Map<String, Object>>> P selectMapsPage(P page, @Param("ew") Wrapper<T> queryWrapper);
}
启动类上加上 @MapperScan("com.happycoder.mybaits.mapper")
或者 在Mapper类上加上 @Mapper
注解,二者选其一就好
@SpringBootApplication
@MapperScan("com.happycoder.mybaits.mapper")
public class MybaitsApplication {
public static void main(String[] args) {
SpringApplication.run(MybaitsApplication.class, args);
}
}
测试代码
@SpringBootTest
public class MpDemo1 {
//注入mapper
@Autowired
private UserMapper userMapper;
//查询所有记录
@Test
public void findAll() {
List<User> list = userMapper.selectList(null);
list.forEach(user->{
System.out.println(user.getName());
System.out.println(user.getAge());
});
}
}
Mybatis-Plus的CURD操作
@SpringBootTest
public class MpDemo1 {
//注入mapper
@Autowired
private UserMapper userMapper;
//1 查询所有记录 selectList
@Test
public void findAll() {
List<User> list = userMapper.selectList(null);
list.forEach(user->{
System.out.println(user.getName()+":"+user.getAge());
});
}
//2 添加操作insert
@Test
public void addUser() {
//创建对象,设置值
User user = new User();
user.setName("东方不败");
user.setAge(30);
user.setEmail("dfbb@atguigu.com");
//调用方法
int rows = userMapper.insert(user);
System.out.println(rows);
System.out.println(user);
}
//3 根据id查询
@Test
public void getUserById() {
User user = userMapper.selectById(1L);
System.out.println(user);
}
//4 修改操作
@Test
public void updateUser() {
//根据id查询
User user = userMapper.selectById(1L);
//设置修改值
user.setName("岳不群");
user.setAge(50);
//调用方法完成修改
int rows = userMapper.updateById(user);
System.out.println(rows);
}
//5 删除操作
@Test
public void deleteUser() {
userMapper.deleteById(2L);
}
}
条件查询
//6 条件查询
//select * from user where name=? and age=?
@Test
public void select1() {
//封装条件对象
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(User::getName,"Tom");
wrapper.eq(User::getAge,28);
//调用方法
List<User> list = userMapper.selectList(wrapper);
list.forEach(user->{
System.out.println(user.getName()+":"+user.getAge());
});
}
//select * from user where age>=28
@Test
public void select2() {
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.ge(User::getAge,28);
//调用方法
List<User> list = userMapper.selectList(wrapper);
list.forEach(user->{
System.out.println(user.getName()+":"+user.getAge());
});
}
//select * from user name like ?
@Test
public void select3() {
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.like(User::getName,"m");
//调用方法
List<User> list = userMapper.selectList(wrapper);
list.forEach(user->{
System.out.println(user.getName()+":"+user.getAge());
});
}
数据的逻辑删除
主键策略
//2 添加操作insert
@Test
public void addUser() {
//创建对象,设置值
User user = new User();
user.setName("东方不败");
user.setAge(30);
user.setEmail("dfbb@atguigu.com");
//调用方法
int rows = userMapper.insert(user);
System.out.println(rows);
System.out.println(user);
}
mp默认主键策略,生成唯一的值
@TableId
该注解用于标记实体类中的主键字段。如果你的主键字段名为 id,你可以省略这个注解。
可以通过该注解设置主键策略
Mybatis-Plus分页查询
创建配置类,配置分页插件
@Configuration
public class MpConfig {
//配置分页插件
/**
* 分页插件
*/
@Bean
public MybatisPlusInterceptor optimisticLockerInnerInterceptor(){
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
//向Mybatis过滤器链中添加分页拦截器
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
调用mapper里面方法进行分页查询
//分页查询
@Test
public void selectPage() {
//创建page对象,传递分页参数:当前页和每页显示记录数
Page<User> page = new Page<>(1,3);
//调用mapper里面方法实现分页查询,返回Page对象,Page对象里面包含分页之后所有数据
IPage<User> pageModel = userMapper.selectPage(page, null);
List<User> list = pageModel.getRecords();
list.forEach(user->{
System.out.println(user.getName()+"::"+user.getAge());
});
long total = pageModel.getTotal();
System.out.println(total);
}