ORM
- ORM(Object Relational Mapping,对象关系映射)是为了解决面向对象与关系数据库存在的互不匹配现象的一种技术。
- ORM通过使用描述对象和数据库之间映射的元数据将程序中的对象自动持久化到关系数据库中。
- ORM框架的本质是简化编程中操作数据库的编码
MyBatis-Plus
- MyBatis是一款优秀的数据持久层ORM框架,被广泛地应用于应用系统。
- MyBatis能够非常灵活地实现动态SQL,可以使用XML或注解来配置和映射原生信息,能够轻松地将Java的POJO(Plain
Ordinary Java Object,普通的Java对象)与数据库中的表和字段进行映射关联。 - MyBatis-Plus是一个 MyBatis 的增强工具,在 MyBatis 的基础上做了增强,简化了开发
添加依赖
mybatis-plus依赖于mybatis
<!-- 链接数据库 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.20</version>
</dependency>
在application.properties中配置据库数链接信息:
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis?useSSL=false
spring.datasource.username=root
spring.datasource.password=root
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
其中useSSL=false 表示在建立 MySQL 连接时是否启用 SSL 加密连接,false 表示不启用 SSL 加密连接。如果设置为true,则说明开启 SSL 加密连接。使用 SSL可以提高数据传输的安全性,但会使连接变慢,而且需要额外的配置和证书。一般情况下,开发环境中不需要使用 SSL。
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
这句代码用来设置 Mybatis-Plus 打印 SQL 语句的日志实现类。其中,log-impl属性表示日志实现类的全限定名。该具体实现类 org.apache.ibatis.logging.stdout.StdOutImpl 是Mybatis 默认提供的一个将 SQL 语句输出到控制台的日志实现类。你也可以定制自己的日志实现类,例如将 SQL 语句输出到文件中等。
别的大家应该自己就能看懂了
创建User实体类,一定要有Getter,Setter方法。
实体类是根据我的表来定义的
package com.example.demo.demos.web.entity;
/**
* @author <a href="mailto:chenxilzx1@gmail.com">theonefx</a>
*/
public class User {
private int id;
private String name;
private Integer age;
private String email;
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", email='" + email + '\'' +
'}';
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
创建Mapper接口,实现动态SQL。
然后我们需要在启动类加一个注解
把mapper包进行扫描
然后新建UserMapper接口
mybatis常用注解
现在我们来书写UserMapper
@Mapper
public interface UserMapper {
@Select("select * from user")
public List<User> find();
}
最后在路由中调用
@RestController
public class UserController{
@Autowired
private UserMapper userMapper;
@GetMapping(value = "/user")
public String getUser(){
List<User> list = userMapper.find();
System.out.println(list);
return "User";
}
}
但是一般返回给前端的数据是json类型的
我们只需要这里更改就可以了
插入
因为业务逻辑很简单,这里就不设计service了
注意,我这里的id在设计的表的时候设置为自动递增了。
增删改查的话这么写就行了,这里就不一一演示了
mybatis-plus写法
直接注释或者删除掉之前的,然后继承一个BaseMapper接口
然后我们传入一个泛型,告诉它我们要操作的对象
看看controller有什么变化
结果是一样的
mybatis-plus注解
@TableName
这个注解适用于我们的类名和表名不一致的情况
@TableId
这个注解用来标识我们的主键,例如
这个是告诉它,我们的id是自增的
这样的话打印的id就不是0了
@TableField
这个注解就是说字段和数据库不对应,可以通过这个注解解决
具体的大家看官网就能看懂
多表查询
实现复杂关系映射,可以使用@Results注解,@Result注解,@One注解, @Many注解组合完成复杂关系的配置
这几个注解是由mybatis提供的,mybatis-plus就是对单表进行增强,对多表其实没做什么修改
我们新建一张订单表order,然后加上一些字段
然后我们填充一个数据
现在我们想查询用户的时候,还想查询用户下有什么订单
创建Order实体类
package com.example.demo.demos.web.entity;
public class Order {
private int id;
private String orderTime;
private String total;
public int getId() {
return id;
}
@Override
public String toString() {
return "Order{" +
"id=" + id +
", orderTime='" + orderTime + '\'' +
", total='" + total + '\'' +
", uid=" + uid +
'}';
}
public void setId(int id) {
this.id = id;
}
public String getOrderTime() {
return orderTime;
}
public void setOrderTime(String orderTime) {
this.orderTime = orderTime;
}
public String getTotal() {
return total;
}
public void setTotal(String total) {
this.total = total;
}
public int getUid() {
return uid;
}
public void setUid(int uid) {
this.uid = uid;
}
private int uid;
}
User实体类
记得还要创建对应的getset方法
假如,我们现在书写下面这段代码进行查询
我们这样访问会发现order是null
Results是做结果集的映射
@Result是给每一个字段进行赋值
column代表表里面的字段
property代表类里面的属性
UserMapper.java
package com.example.demo.demos.web.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.demos.web.entity.User;
import org.apache.ibatis.annotations.*;
import java.util.List;
@Mapper
public interface UserMapper extends BaseMapper<User> {
@Select("select * from user")
@Results( {
@Result(column = "id", property = "id"),
@Result(column = "name", property = "name"),
@Result(column = "age", property = "age"),
@Result(column = "email", property = "email"),
@Result(column = "id", property = "orders", javaType = List.class,
many = @Many(select = "com.example.demo.demos.web.mapper.OrderMapper.selectByUid")
),
})
List<User> selectAllUserAndOrders();
}
OrderMapper.java
package com.example.demo.demos.web.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.demos.web.entity.Order;
import com.example.demo.demos.web.entity.User;
import org.apache.ibatis.annotations.*;
import java.util.List;
@Mapper
public interface OrderMapper extends BaseMapper<Order> {
@Select("select * from order where uid = #{uid}")
List<Order> selectByUid(int uid);
}
这个查询结果返回给orders属性,这样就完成了orders的赋值
这里有一处需要注意:
这里的SQL 语句中的表名 order 与 MySQL 保留字冲突了,所以可以将 SQL 语句修改为使用反引号将表名 order 包裹起来
要不会报错的
我们可以看到查询成功了
现在需求变化,我们先根据订单查询用户
这是个一对一的关系,一个订单只有一个用户
首先,我们需要更改Order实体类
现在需要在Order.Mapper中这么去写,跟上面的其实是一个意思
// 查询所有订单,同时查询订单的用户
@Select("select * from `order`")
@Results({
@Result(column = "id",property = "id"),
@Result(column = "orderTime",property = "orderTime"),
@Result(column = "total",property = "total"),
@Result(column = "uid",property = "user",javaType = User.class,
one = @One(select = "com.example.demo.demos.web.mapper.UserMapper.selectById")
)
})
List<Order> selectAllOrdersAndUser();
然后需要给UserMapper加上查询
当然,我们可以不写,直接用mybatis-plus的方法
分页查询
进行插件的分页配置
我们编写一个配置文件
package com.example.demo.demos.web.config;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor paginationInterceptor(){
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(DbType.MYSQL);
interceptor.addInnerInterceptor(paginationInnerInterceptor);
return interceptor;
}
}