Mybatis Plus是一个基于Mybatis的优秀框架,它提供了许多功能来简化Mybatis的操作,其中最重要的是多表查询和分页查询。
多表查询是在同一个SQL查询中查询多个表的数据,可以在Mybatis Plus中使用注解,XML映射文件来实现多表查询。
Mybatis Plus提供了@TableName注解,可以用来为每个表指定表名,还可以使用@TableField注解为每个字段指定列名,以及@TableJoin注解来为表之间指定连接关系。
分页查询是一种特殊查询,可以让用户在数据库查询指定页数的数据,而不是将所有的数据进行提取,从而提高了查询效率。
Mybatis Plus提供了Page对象来实现分页查询,可以通过Page对象指定每页多少条数据以及第几页,Mybatis Plus会自动将这些信息添加到查询语句中。总之,Mybatis Plus提供了大量的功能来简化Mybatis的操作,其中最重要的是多表查询和分页查询,可以使程序员更轻松地操作数据库。
Mybatis Plus提供了多表查询和分页查询等功能,能够方便我们更轻松地操作数据库。以User(用户)、Order(订单)进行举例。
首先通过maven进行pom.xml依赖的导入
<dependencies>
<!--Spring Boot Web依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--MyBatisPlus依赖-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.2</version>
</dependency>
<!--Mysql驱动依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.11</version>
</dependency>
<!--数据连接池Druid依赖-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.20</version>
</dependency>
<!--Spring Boot单元测试依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
修改springBoot的基础配置
# 添加MySQL驱动
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
# MySQL URL
spring.datasource.url=jdbc:mysql://localhost:3306/mydb?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
# MySQL用户名
spring.datasource.username=root
# MySQL密码
spring.datasource.password=admin
# 数据库连接池类型
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
# MyBatis Plus日志实现
mybatis-plus.configuration.Log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
# 禁止Thymeleaf缓存
spring.thymeleaf.cache=false
Spring Boot控制器是一种特殊的组件,用于处理从Web浏览器发出的HTTP请求,它可以从请求中提取参数,并将其映射到控制器方法中。控制器方法可以使用这些参数来执行业务逻辑,然后将响应发送回浏览器。
创建UserController、OrderController控制器
UserController用于处理用户相关的请求:
注解 | 作用 | 用法 |
@RestController | 标记控制器类 | 在类上使用 |
@GetMapping | 标记Get请求的映射 | 在方法上使用 |
@PostMapping | 标记POST请求的映射 | 在方法上使用 |
@DeleteMapping | 标记Delete请求的映射 | 在方法上使用 |
@TableField | 用于实体类和表字段的映射关系 | 在字段上使用 |
@RestController
public class UserController {
/**Atuowired注解的作用是:
能够自动按照类型进行注入,可以对类成员变量、方法以及构造函数进行标注
从而完成自动装配的工作,可以消除setter()方法。
说人话就是:@AutoWired的作用是自动把相关联的类或者接口的对象创建出来。
*/
@Autowired
private UserMapper userMapper;
//查询所有用户,返回查询到的用户列表。
@GetMapping("/user/findAll")
public List<User> find() { return userMapper.selectAllUserAndOrders();
}
/**
* 保存用户
* @param user 传入的User对象
* @return 返回成功或失败的消息
*/
@PostMapping("/user")
public String save(User user) {
int i = userMapper.insert(user);
System.out.println(user);
if (i > 0) {
return "插入成功!!!!!!";
} else {
return "插入失败!";
}
}
/**
* 根据id删除用户
* @param id 需要删除用户的id
* @return 返回成功或失败的消息
*/
@DeleteMapping("/user/{id}")
public String delete(@PathVariable Long id) {
int result = userMapper.deleteById(id);
if (result>0){
return "删除成功";
}else {
return "删除失败";
}
}
}
//OrderController
@RestController
public class OrderController {
@Autowired
private OrderMapper orderMapper;
@GetMapping("/order/findAll")
public List findAll () {
List orders = orderMapper.selectAllOrderAndUser();
return orders;
}
}
创建User、Order类
public class User {
@TableId(type = IdType.AUTO)
private int id;
private String username;
private String password;
private String birthday;
/**@TableField注解用于实体类和表字段的映射关系,它可以定义实体类中的属性和表中字段的映射关系,用于解决实体类属性和表字段不一致的问题。它可以在字段上使用,它有以下几个参数:
value:指定字段名称,如果实体类字段和表字段名称一致,可以省略不指定。
exist:标记此字段在数据库中是否存在,默认为true,如果该字段在数据库中不存在,可以将该字段设置为false。
fill:标记插入或更新操作时该字段的填充策略,默认为 FieldFill.DEFAULT,可以设置为 FieldFill.INSERT和FieldFill.UPDATE。
*/
//将order进行排除,避免查询时,将orders加入查询。
@TableField(exist = false)
private List<Order> orders;
public List<Order> getOrders() {
return orders;
}
public void setOrders(List<Order> orders) {
this.orders = orders;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", birthday='" + birthday + '\'' +
", orders=" + orders+
'}';
}
}
user表结构如下:
![](https://i-blog.csdnimg.cn/blog_migrate/49e602ca0af04613ca9f97da2744a6b6.png)
t_order表结构:
![](https://i-blog.csdnimg.cn/blog_migrate/9346ca4e40b3904f53ccac3ea97dd96d.png)
public class Order {
private int id;
private String order_time;
private int total;
private int uid;
@TableField(exist = false)
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public String getOrder_time() {
return order_time;
}
public void setOrder_time(String order_time) {
this.order_time = order_time;
}
public int getTotal() {
return total;
}
@Override
public String toString() {
return "Order{" +
"id=" +id +
"order_time='" + order_time + '\'' +
", total=" + total +
", uid=" + uid +
", user=" + user+
'}';
}
public void setTotal(int total) {
this.total = total;
}
public int getUid() {
return uid;
}
public void setUid(int uid) {
this.uid = uid;
}
}
创建UserMapper、OrderMapper接口
Mybatis Plus的UserMapper接口是Mybatis Plus的核心接口,它继承了Mybatis的UserMapper接口,并提供了一系列额外的方法,以更加高效地操作数据库。Mybatis Plus的UserMapper接口可以更轻松、更快速地执行增删改查操作,并可以完成复杂的SQL查询。
注解 | 功能/作用 | 用法 |
@Results | 定义映射关系 | 在方法上使用 |
@Select | 标记查询方法 | 在方法上使用 |
@Mapper | 标记接口为Mybatis Mapper接口 | 在接口上使用 |
@Result | 标记实体类和表字段的映射关系 | 在字段上使用 |
@One | 标记一对一的查询结果 | 在@Result中使用 |
@More | 标记一对多的查询结果 | 在@Result中使用 |
@Mapper
public interface OrderMapper extends BaseMapper {
@Select("select * from t_order where uid = #{uid};")
List<Order> selectByUid(int uid);
@Select("select * from t_order")
@Results({
@Result(column = "id",property = "id"),
@Result(column = "ordertime",property = "ordertime"),
@Result(column = "total",property = "total"),
//定义Mybatis Plus查询结果的映射关系,它将uid字段映射到实体类的uid属性,并且将查询结果转换为实体类对象,one参数用于指定一对一的查询方法,该方法的返回值将被设置到实体类中。
@Result(column = "uid",property = "uid",javaType = User.class,
one=@One(select = "com.example.mpdemo.mapper.UserMapper.selectById"))
})
List<Order> selectAllOrderAndUser();
}
@Mapper
public interface UserMapper extends BaseMapper <User>{
@Select("select * from user where id = #{id}")
User selectById(int id);
@Select("select * from user")
@Results(
{
@Result(column = "id",property = "id"),
@Result(column = "username",property = "username"),
@Result(column = "password",property = "password"),
@Result(column = "id",property = "orders",javaType = List.class,
many = @Many(select = "com.example.mpdemo.mapper.OrderMapper.selectByUid")
)
}
)
List<User> selectAllUserAndOrders();
}