数据持久化技术——MP

     阅读:38


  mybatis-plus(简称 MP)是一个 MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

1 环境搭建

1.1 创建一个maven的project

在这里插入图片描述

1.2 pom.xml文件导入web开发依赖

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.6.6</version>
</parent>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

1.3 创建SpringBoot项目的主程序入口

@SpringBootApplication
public class MainApplication {
    public static void main(String[] args) {
        SpringApplication.run(MainApplication.class, args);
    }
}

2 代码生成器

  顾名思义,代码生成器就是用来直接生成代码的一个程序。首先导入相关依赖

<!--Mybatis-Plus生成器依赖-->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-generator</artifactId>
    <version>3.3.1.tmp</version>
</dependency>

<!--freemarker 模板引擎(没有用原生的模板引擎)-->
<dependency>
    <groupId>org.freemarker</groupId>
    <artifactId>freemarker</artifactId>
    <version>2.3.31</version>
</dependency>

  生成的代码需要使用lombok简化实体类开发导入相关依赖

<!--lombok简化实体类开发,如果之前没有下载过依赖的同名插件的话需要下载安装,然后重启一下idea-->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>

  创建utils包,拷贝代码生成器,需要修改的两个地方:数据库连接的数据库名、项目目录名。运行main方法,报错java.lang.ClassNotFoundException:com.mysql.jdbc.Driver,没有驱动,需要导入数据库连接依赖

<!--数据库连接驱动-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.32</version>
</dependency>

  生成成功之后,mapper层的接口上加@mapper注解或者在主程序入口出添加,简单说一下service的方法都从哪里来,也就是Ctrl进源码看他继承方法内部又实现的接口里定义了后面需要使用到的所有方法。

3 配置数据库

导入mybatis-plus的场景启动器

<!--mybatis-plus的场景启动器 内置了jdbc的启动器无需重复引用-->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.1</version>
</dependency>

resources目录下创建配置文件application.yml,配置数据库的相关信息

server:
  # 修改后端项目运行时的端口号信息
  port: 8888

spring:
  # 配置数据源信息
  datasource:
    url: jdbc:mysql://localhost:3306/music
    username: root
    password: 123456
    driver-class-name: com.mysql.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource

  上面使用到了pool(池子),数据库连接池也就是数据源,所谓的数据库连接池从字面意思上翻译就是将数据库连接放到一个池子里。相比之前的好处就是只需要创建一次连接,后面的都直接用不用一次次创建。数据源使用到了Druid的,需要导入Druid的依赖

<!--整合druid的数据源-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.1.17</version>
</dependency>

4 导入前端页面

  resources目录下创建templates文件夹,将前端页面导入。由于SpringBoot默认的打包方式是jar包,但是JSP不支持在jar包(一种压缩包)中编译,所以SpringBoot默认不支持JSP,于是我们需要引入第三方的模板引擎技术——Thymeleaf实现页面的渲染。
导入thymeleaf引擎的场景启动器

<!--thymeleaf引擎的场景启动器-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

5 开始前端控制器的编码

复制controller层的框架整体,和前端进行交互的页面

@RequestMapping("/queryAll")
public List<Singer> queryAll() {
	// 先演示普通的查询,再逆序查询
	
    return null;
}

@RequestMapping("/queryByName")
public List<Singer> queryByName(String name) {
	// 使用lambdaQueryWrapper 的like方法模糊查询
	
	// list方法查询到所有的符合条件值并返回
    return null;
}

@PostMapping("/save")
public String save(HttpServletRequest request) {
	Singer singer = new Singer();
    singer.setName(request.getParameter("name"))
            .setSex(Integer.parseInt(request.getParameter("sex")))
            .setPic(request.getParameter("pic"))
            .setBirth(new Date())
            .setLocation(request.getParameter("location"))
            .setIntroduction(request.getParameter("introduction"));
	
	// 调用save方法,并判断返回值的正误,返回前端对应的字符串
	
    return null;
}

@RequestMapping("/update")
public String update(int id, String introduction) {
    // 使用eq和set去设置条件构造器
       
    // 调用update传入条件构造器,并判断返回值的正误,返回前端对应的字符串
    
    return null;
}

@RequestMapping("/delete")
public String delete(Integer id) {
	// 调用removeById方法直接删
	
    return null;
}

  SQL语句是数据持久化技术的核心,jdbc使用String字符串拼接SQL语句;mybatis使用xml映射文件在标签里编写SQL语句;但是,MP无需使用SQL语句(一些复杂的业务可以使用SQL语句来完成),直接调用方法即可在框架的底层实现SQL语句的拼接和执行。
  在这里来查看一下mp的官方开发文档,大概讲一下几个方法的大概用处,然后摁住Ctrl查看源码,知道为什么可以使用这些方法完成相应的功能。

首先是注入SingerService对象

@Autowired
private SingerService service;

  这里的用法是spring框架的控制反转,即将设计好的类对象注册进spring的IOC容器中将对象的控制权交给容器,当需要使用的时候就使用@Autowired注解让容器创建一个对象出来使用。完成的作用相当于使用new的方式调用类的构造器创建一个对象

查询所有的记录

@RequestMapping("/queryAll")
public List<Singer> queryAll() {

    List<Singer> singers = service.list();

    return singers;
}

  逆序查询的话就需要在SQL语句拼接order by id desc,这个拼接条件的功能就需要使用wrapper构造器来完成了

5.1 wrapper构造器

在这里插入图片描述  总而言之,wrapper构造器的作用就是用来拼装where,order by等条件语句的作用,如果你的增删改查无需条件的话,可以不用wrapper,但凡需要使用SQL语句需要拼接条件的话就需要使用wrapper。更加具体的wrapper案例分析参考博客wrapper构造器的简要案例分析

逆序查询所有记录的方法

逆序查询所有
http://localhost:8888/singer/queryAll
@RequestMapping("/queryAll")
public List<Singer> queryAll() {

    LambdaQueryWrapper<Singer> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    lambdaQueryWrapper.orderByDesc(Singer::getId);
    List<Singer> singers = service.list(lambdaQueryWrapper);

    return singers;
}

按照id查询

按照id查询
http://localhost:8888/singer/queryByName?name=王
@RequestMapping("/queryByName")
public List<Singer> queryByName(String name) {

    LambdaQueryWrapper<Singer> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    lambdaQueryWrapper.like(Singer::getName,name);

    List<Singer> singers = service.list(lambdaQueryWrapper);

    return singers;
}

编写添加记录的方法

@PostMapping("/save")
public String save(HttpServletRequest request) {

    Singer singer = new Singer();
    singer.setName(request.getParameter("name"))
            .setSex(Integer.parseInt(request.getParameter("sex")))
            .setPic(request.getParameter("pic"))
            .setBirth(new Date())
            .setLocation(request.getParameter("location"))
            .setIntroduction(request.getParameter("introduction"));


    boolean save = service.save(singer);
    String result = save == true ? "添加成功" : "添加失败";
    return result;

}

修改方法

修改
http://localhost:8888/singer/update?id=64&introduction=歌声甜美
@RequestMapping("/update")
public String update(int id, String introduction, HttpServletRequest request) {

    LambdaUpdateWrapper<Singer> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
    lambdaUpdateWrapper.eq(Singer::getId,id)
            .set(Singer::getIntroduction,introduction);

    boolean update = service.update(lambdaUpdateWrapper);

    String result = update == true ? "修改成功" : "修改失败";
    return result;
}

删除方法

删除
http://localhost:8888/singer/delete?id=64
@RequestMapping("/delete")
public String delete(Integer id) {

    boolean remove = service.removeById(id);
    String result = remove == true ? "删除成功" : "删除失败";
    return result;

}