Mybatis-plus快速入门

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;
    }
}

在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林多多@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值