学习SSM中的M+(MyBatis Plus 3.4.0)~这一篇足够了

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 在宏观上我们能用它来什么将Mybatis + 通用Mapper + PageHelper,把它们打包升级成,简单来说:它们三个能做的MyBatis Plus能做,它们三个不能做的MyBatis Plus也能做简介 | MyBatis-Plus(简称 MP)是一个MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。首先先翻译一下wrapper (包装器),不知道大家有没有听过包装类,主要应用在一种模式上面叫装饰 设计模式 里面出现的其实就是包装类。


1,MyBatis Plus 概述
在宏观上我们能用它来什么

1.1:简介
官网:https://baomidou.com/

参考教程:简介 | MyBatis-Plus

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

1.2:优点(归纳了Mybatis-plus全部特点)

2,入门案例
2.1:搭建环境

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

    <!-- web 开发 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!--MySQL数据库驱动-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
    <!--支持lombok-->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>
    <!--测试-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-boot-starter -->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.4.0</version>
    </dependency>
</dependencies>









2.2:数据库和表

2.3:入门:查询所有

package com.czxy.domain;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

import java.util.List;
@Data
@TableName("tmp_customer")
public class Customer {

@TableId(type = IdType.AUTO)
private Integer cid;
private String cname;
private String password;
private String telephone;
private String money;

private Integer version;

@TableField(exist = false)
private List<Integer> ids;

}

package com.czxy.mp.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.czxy.mp.domain.Customer;
import org.apache.ibatis.annotations.Mapper;

/**

  • Created by 爱吃豆的土豆

*/
@Mapper
public interface CustomerMapper extends BaseMapper {
}

package com.czxy.mp;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**

  • Created by 爱吃豆的土豆

*/
@SpringBootApplication
public class MybatisPlusApplication {

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

}

package com.czxy;

import com.czxy.mp.MybatisPlusApplication;
import com.czxy.mp.domain.Customer;
import com.czxy.mp.mapper.CustomerMapper;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import javax.annotation.Resource;
import java.util.List;

/**

  • Created by 爱吃豆的土豆

*/
@RunWith(SpringRunner.class)
@SpringBootTest(classes = MybatisPlusApplication.class)
public class TestDemo01 {

@Resource
private CustomerMapper customerMapper;

@Test
public void testFindAll() {
    List<Customer> list = customerMapper.selectList(null);
    list.forEach(System.out::println);
}

}
3,基本操作
3.1:最的常见API
BaseMapper 封装CRUD操作,泛型 T 为任意实体对象

@Test
public void testselectAll(){
    List<Customer> list = customerMapper.selectList(null);  //条件查询先传入条件为null
    for (Customer c : list) {
        System.out.println(c.toString());
    }
}

3.2:添加
@Test

public void insert(){
    Customer customer = new Customer();
    customer.setCname("Nihao1");
    customer.setPassword("1234");
    int i = customerMapper.insert(customer);
    System.out.println(i);
}

 添加成功返回结果为1,添加失败返回结果为0,否则抛异常

3.3:更新

@Test
public void testUpdate() {
    Customer customer = new Customer();
    customer.setCid(15);
    customer.setCname("测试777");
    customer.setPassword("777");

    // 需要给Customer设置@TableId
    customerMapper.updateById(customer);
}

@Test
public void testUpdate2() {
    Customer customer = new Customer();
    customer.setCname("测试777");
    customer.setPassword("777");
    // 更新所有
    customerMapper.update(customer,null);
}

3.4:删除

@Test

public void testDelete() {
    // 需要给Customer设置@TableId
    int i = customerMapper.deleteById(11);
    System.out.println(i);
}

@Test

public void testBatchDelete() {
    // 需要给Customer设置@TableId
    int i = customerMapper.deleteBatchIds(Arrays.asList(9,10));
    System.out.println(i);
}

4,查询
4.1:Map条件
第一种没有放入任何条件查询:查询所有

@Test
public void selectByMap(){
    //简单多条件查询 -使用map设置数据,依次eq查询(等值查询)
    HashMap<String, Object> map = new HashMap<>();
    List<Customer> customerList = customerMapper.selectByMap(map);
    for (Customer c : customerList) {
        System.out.println(c.toString());
    }
}

第二种放入条件:按照条件进行查询

@Test
public void selectByMap(){
    //简单多条件查询 -使用map设置数据,依次eq查询(等值查询)
    HashMap<String, Object> map = new HashMap<>();
    map.put("cname","jack");
    map.put("password","1234");
    List<Customer> customerList = customerMapper.selectByMap(map);
    for (Customer c : customerList) {
        System.out.println(c.toString());
    }
}

4.2:Wrapper条件
4.2.1:wrapper介绍
首先先翻译一下wrapper (包装器),不知道大家有没有听过包装类,主要应用在一种模式上面叫装饰 设计模式 里面出现的其实就是包装类。

大家应该见过请求或者响应包装类:分别是

HttpServletRequestWrapper , HttpServletResponseWrapper 

 像现在在Mybatis-plus 中也用到了wrapper ,它的意思就是把条件查询中的条件给它封装一下

//结合idea向大家介绍一下

idea中  Shift + Ctrl + a  弹出来搜索框:

 点进去wrapper中按CTRL + H  查看继承树

 

4.2.2:条件查询(练习两个方法)
注意:条件查询里面的条件,column 对应的是数据库中的列,而不是JavaBean中的属性

selectOne           根据条件查询一个,结果:0或者1,如果查询多个异常

 三种情况:第一种情况:查询成功一条数据  查询名称为rose的

 第二种情况:查询失败,查询到了多个数据  查询名称为发大财,查询到两个

 抛出的异常信息(我用中文翻译一下哈哈):期望结果为一个或者为null,但是发现两个

 第三种情况:查询为null,不存在该条数据,查询名称大钱,返回结果为null数据库中没有该数据

 再练习一个

 模糊查询:like 。需要注意的是:之前在Mybatis中模糊查询需要自己手动加入%%

在Mybatis-plus中不需要进行添加在底层中已经进行封装

@Test
public void TestSelectList(){
    QueryWrapper<Customer> queryWrapper = new QueryWrapper<>();
    //模糊查询

// queryWrapper.like("cname","c"); //左右加入了%
// queryWrapper.likeLeft("cname","c"); //左加入了%
// queryWrapper.likeRight("cname","c"); //右加入了%

    //范围查询  比如年龄大于19的小于20的
    queryWrapper.ge("age",19);
    queryWrapper.le("age",30);
    List<Customer> customerList = customerMapper.selectList(queryWrapper);
    for (Customer c : customerList) {
        System.out.println(c.toString());
    }
}

4.3.3:条件更新
测试一个更新:需求更新电话号码为626115的信息,将该数据的名称更新为爱吃豆的土豆

@Test

public void testUpdate(){
    Customer customer = new Customer(21, "爱吃豆子的土豆", "123", "123", 1000.0, 0, null, null);
    UpdateWrapper<Customer> updateWrapper = new UpdateWrapper<>();
    updateWrapper.eq("telephone",626115);
    int update = customerMapper.update(customer, updateWrapper);
    System.out.println(update);
}

 控制台sql语句执行的流程建议多看看:

4.3:分页
4.3.1:内置插件

4.3.2:配置类(配置类可以去官网复制也可以在这里直接复制)
@Configuration
public class MybatisPlusConfig {

/**
 * 配置插件
 * @return
 */
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){

    MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
    // 分页插件
    mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));

    return mybatisPlusInterceptor;
}

/**
 * 新的分页插件,一缓和二缓遵循mybatis的规则,需要设置 MybatisConfiguration#useDeprecatedExecutor = false 避免缓存出现问题(该属性会在旧插件移除后一同移除)
 * @return
 */
@Bean
public ConfigurationCustomizer configurationCustomizer() {
    return configuration -> configuration.setUseDeprecatedExecutor(false);
}

}

4.4.3:分页(用的还是比较多的,应该多练习)

@Test
public void testPage(){
    //条件查询条件
    QueryWrapper<Customer> queryWrapper = new QueryWrapper<Customer>();

// queryWrapper.le()
// queryWrapper.like()

    //分页查询的条件
    int current = 1; // 当前页,相当于pagenum
    int size =2;
    Page<Customer> customerPage = new Page<>(current,size);
    //分页查询
    customerMapper.selectPage(customerPage,queryWrapper);
    //处理结果
    customerPage.getRecords().forEach(System.out::println);

//分页数据

    System.err.println("当前页码:" + customerPage .getCurrent());
    System.err.println("每页显示记录数:" + customerPage .getSize());
    System.err.println("总页数:" + customerPage .getPages());
    System.err.println("总记录数:" + customerPage .getTotal());
    System.err.println("是否有下一页:" + customerPage .hasNext());
    System.err.println("是否有上一页:" + customerPage .hasPrevious());
}

另外注意一种情况 (当你发现分页信息都无效的时候),首先要考虑有没有配置分页拦截器

5,常见注解(主要给大家演示三个最常用的注解)
5.1:表名注解:@TableName
@TableName 里面属性还是很多的

 最常用的两种

 (value属性)如果在该注解中只用到了一个属性值value,且是一对,则value可以省略:如果所示

 (keepGlobalPrefix属性)大家在以后的开发项目中,会发现一个项目中表都有固定的前缀,既然有前缀那我们就想一想能不能把这个前缀进行抽取出来,放到一个固定的位置,这个属性就起到了该作用:如图所示

5.2:主键注解:@TableId
value主键名就不多说了,主要说一下type主键类型,也称为主键生成策略

 IdType.AUTO,自动增长:

 IdType.ASSIGN_UUID

IdType.ASSIGN_ID 

5.3:字段注解(非主键):@TableField

1,value:对应表中的列名称 
2,fill(在目录(第7)高级中详细讲解)

 3,exist:设置是否存储到数据库中:

例如:以后在开发中我们要进行批量删除,为了满足需求我们创建了一个集合或者数组来接收前端传递过来的数据,但这个数据又需要写进数据库中,数据库中也没有对应的列。这样我们就可以用这个属性来控制是否写进数据库中。

注意:Mybatis-plus 中默认一个JavaBean和一张表是一一对应的,如果JavaBean中多出一个成员变量,它就去表里面找对应的列,没有的话就报错,这样就可以用这个属性进行声明

6,常见配置
讲一下配置在yml文件中Mybatis-plus的常见配置(我这里是springboot项目)

mybatis-plus:
configuration:

log-impl: org.apache.ibatis.logging.stdout.StdOutImpl  #输出日志
map-underscore-to-camel-case: true  #驼峰命名

global-config:

db-config:
  id-type: auto  #全局配置,id自动增强
  table-prefix: tmp_ #表名前缀

type-aliases-package: com.czxy.mp.domain #别名包扫描路径
mapper-locations: classpath:/mapper//.xml #映射文件位置
日志介绍(给大家讲解了各种日志):

开启驼峰(用图和大家解释):

全局配置主键策略和全局配置表名的前缀 :

xml相关配置,整合XML版本开发 (重要):

mapper-locations: 就是mapper映射的XML文件位置(如下图)。因为经常用注解开发很少写XML版开发,所以不怎么写。

 type-aliases-package:这个应用场景打个比方就是,如果以后开发中你做了十几个查询功能,返回类型都是同一个,这样每一次都全部输入显得很麻烦,我们可以通过这个配置进行起别名操作。(详细讲解如图)

 XML文件中内容(官方模板):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper

    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">


7,高级(插件机制)
7.1:自动填充
项目中经常会遇到一些数据,每次都使用相同的方式填充,例如记录的创建时间,更新时间等。

我们可以使用MyBatis Plus的自动填充功能,完成这些字段的赋值工作:

7.1.1:原理

7.1.2:基本操作(实际操作和大家介绍一下)
解释一下:这个自动填充就是相当于为程序添加一个拦截器,当用户改变自己的信息的时候,拦截一下自动把更改的时间进行装填到数据库中。在以后工作中会经常用到

alter table tmp_customer add column create_time date;
alter table tmp_customer add column update_time date;

package com.czxy.mp.domain;

import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;

import java.util.Date;

/**

  • Created by 爱吃豆的土豆.

*/
@Data
@TableName("tmp_customer")
public class Customer {

@TableId(type = IdType.AUTO)
private Integer cid;
private String cname;
private String password;
private String telephone;
private String money;

@TableField(value="create_time",fill = FieldFill.INSERT)
private Date createTime;

@TableField(value="update_time",fill = FieldFill.UPDATE)
private Date updateTime;

}
步骤三:编写处理类  
package com.czxy.mp.handler;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.util.Date;

/**

  • @author 爱吃豆的土豆

*/
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

/**
 * 插入填充
 * @param metaObject
 */
@Override
public void insertFill(MetaObject metaObject) {
    this.setFieldValByName("createTime", new Date(), metaObject);
}

/**
 * 更新填充
 * @param metaObject
 */
@Override
public void updateFill(MetaObject metaObject) {
    this.setFieldValByName("updateTime", new Date(), metaObject);
}

}

@Test
public void testInsert() {
    Customer customer = new Customer();
    customer.setCname("测试888");

    customerMapper.insert(customer);
}

@Test
public void testUpdate() {
    Customer customer = new Customer();
    customer.setCid(11);
    customer.setTelephone("999");

    customerMapper.updateById(customer);
}

7.2:乐观锁(主要讲一下乐观锁的版本号机制)

7.2.1:什么是乐观锁

7.2.2:实现

步骤一:修改表结构,添加version字段  
    

步骤二:修改JavaBean,添加version属性

步骤三:元对象处理器接口添加version的insert默认值 (保证version有数据)

package com.czxy.mp.config;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.util.Date;

/**

  • Created 爱吃豆的土豆.

*/
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

/**
 * 插入填充
 * @param metaObject
 */
@Override
public void insertFill(MetaObject metaObject) {
    this.setFieldValByName("createTime", new Date(), metaObject);
    this.setFieldValByName("version", 1, metaObject);
}

/**
 * 更新填充
 * @param metaObject
 */
@Override
public void updateFill(MetaObject metaObject) {
    this.setFieldValByName("updateTime", new Date(), metaObject);
}

}
步骤四:修改 MybatisPlusConfig 开启乐观锁
/**

  • Created 爱吃豆的土豆.

*/
@Configuration
public class MybatisPlusConfig {

 */
/**
 * 配置插件
 * @return
 */
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){

    MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
    // 分页插件
    mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
    // 乐观锁
    mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());

    return mybatisPlusInterceptor;
}

}

@Test
public void testUpdate() {
    Customer customer = new Customer();
    customer.setCid(14);
    customer.setCname("测试999");
    // 与数据库中数据一致,将更新成功,否则返回失败。
    customer.setVersion(1);

    int i = customerMapper.updateById(customer);
    System.out.println(i);
}

7.2.3:注意事项

7.3:逻辑删除
7.3.1:什么是逻辑删除
逻辑删除,也称为假删除。就是在表中提供一个字段用于记录是否删除,实际该数据没有被删除。(像大部分用户信息,如果你联系客服让他注销的话,只是客观意义上找不到用户信息,实际上还是存在的,只是进行了逻辑删除。)

7.3.2:实现

/**

  • Created 爱吃豆的土豆.

*/
@Data
@TableName("tmp_customer")
public class Customer {

@TableId(type = IdType.AUTO)
private Integer cid;
private String cname;
private String password;
private String telephone;
private String money;
@Version
@TableField(fill = FieldFill.INSERT)
private Integer version;

@TableLogic
@TableField(fill = FieldFill.INSERT)
private Integer deleted;

}

/**

  • Created 爱吃豆的土豆

*/
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

/**
 * 插入填充
 * @param metaObject
 */
@Override
public void insertFill(MetaObject metaObject) {
    this.setFieldValByName("createTime", new Date(), metaObject);
    this.setFieldValByName("version", 1, metaObject);
    this.setFieldValByName("deleted", 0, metaObject);
}

/**
 * 更新填充
 * @param metaObject
 */
@Override
public void updateFill(MetaObject metaObject) {
    this.setFieldValByName("updateTime", new Date(), metaObject);
}

}

@Test
public void testDelete() {
    // 删除时,必须保证deleted数据为“逻辑未删除值”
    int i = customerMapper.deleteById(12);
    System.out.println(i);
}

7.3.3:注意

7.3.4:全局配置

mybatis-plus:
global-config:

db-config:
  logic-delete-field: deleted  # 局逻辑删除的实体字段名
  logic-delete-value: 1  # 逻辑已删除值(默认为 1)
  logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)

7.3.5:恢复

方案2:直接使用update语句,==不能==解决问题。

@Test
public void testUpdate() {
    Customer customer = new Customer();
    customer.setCid(13);
    customer.setDeleted(0);
    //更新
    customerMapper.updateById(customer);
}

 方案3:修改Mapper,添加 recoveryById 方法,进行数据恢复。

@Mapper
public interface CustomerMapper extends BaseMapper {

@Update("update tmp_customer set deleted = 0 where cid = #{cid}")
public void recoveryById(@Param("cid") Integer cid);

}
8,通用service(就和通用BaseMapper差不多,封装了好多方法,直接调用就行)
8.1:分析

8.2:基本使用
标准service:接口 + 实现  

service接口

public interface CustomerService extends IService {
}
 service实现类

@Service
@Transactional
public class CustomerServiceImpl extends ServiceImpl<CustomerMapper,Customer> implements CustomerService {

}
8.3:常见方法(比较常见的方法可以记住几个)

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Day62MybatisPlusApplication.class)
public class TestDay62CustomerService {
//导入通用service

@Resource
private CustomerService customerService;

//测试查询所有

@Test
public void testSelectList() {
    List<Customer> list = customerService.list();
    list.forEach(System.out::println);
}

//测试添加

@Test
public void testInsert() {
    Customer customer = new Customer();
    customer.setCname("张三");
    customer.setPassword("9999");
    // 添加
    customerService.save(customer);
}

//测试更新

@Test
public void testUpdate() {
    Customer customer = new Customer();
    customer.setCid(14);
    customer.setCname("777");
    customer.setPassword("777");

    customerService.updateById(customer);
}

//测试添加或更新

@Test
public void testSaveOrUpdate() {
    Customer customer = new Customer();
    customer.setCid(15);
    customer.setCname("999");
    customer.setPassword("99");

    customerService.saveOrUpdate(customer);
}

//测试通过id进行删除

@Test
public void testDelete() {
    customerService.removeById(15);
}

9,新功能
9.1:执行SQL分析打印
该功能依赖 p6spy 组件,完美的输出打印 SQL 及执行时长

p6spy 依赖引入

<groupId>p6spy</groupId>
<artifactId>p6spy</artifactId>
<version>3.9.1</version>


核心yml配置

spring:
datasource:

  # p6spy 提供的驱动代理类,
driver-class-name: com.p6spy.engine.spy.P6SpyDriver
# url 固定前缀为 jdbc:p6spy,跟着冒号为对应数据库连接地址
url: jdbc:p6spy:mysql://127.0.0.1:3306...

 spy.properties 配置

3.2.1以上使用

modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory,com.p6spy.engine.outage.P6OutageFactory

3.2.1以下使用或者不配置

modulelist=com.p6spy.engine.logging.P6LogFactory,com.p6spy.engine.outage.P6OutageFactory

自定义日志打印

logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger

日志输出到控制台

appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger

使用日志系统记录 sql

appender=com.p6spy.engine.spy.appender.Slf4JLogger

设置 p6spy driver 代理

deregisterdrivers=true

取消JDBC URL前缀

useprefix=true

配置记录 Log 例外,可去掉的结果集有error,info,batch,debug,statement,commit,rollback,result,resultset.

excludecategories=info,debug,result,commit,resultset

日期格式

dateformat=yyyy-MM-dd HH:mm:ss

实际驱动可多个

driverlist=org.h2.Driver

是否开启慢SQL记录

outagedetection=true

慢SQL记录标准 2 秒

outagedetectioninterval=2
9.2:数据安全保护
为了保护数据库配置及数据安全,在一定的程度上控制开发人员流动导致敏感信息泄露

步骤1-2:使用工具类生成秘钥以及对敏感信息进行加密
public class TestAES {

@Test
public void testAes() {
    String randomKey = AES.generateRandomKey();

    String url =  "jdbc:p6spy:mysql://127.0.0.1:3306/zx_edu_teacher?useUnicode=true&characterEncoding=utf8";
    String username = "root";
    String password = "1234";

    String urlAES = AES.encrypt(url, randomKey);
    String usernameAES = AES.encrypt(username, randomKey);
    String passwordAES = AES.encrypt(password, randomKey);

    System.out.println("--mpw.key=" + randomKey);
    System.out.println("mpw:" + urlAES);
    System.out.println("mpw:" + usernameAES);
    System.out.println("mpw:" + passwordAES);
}

}
// Jar 启动参数( idea 设置 Program arguments , 服务器可以设置为启动环境变量 )
//--mpw.key=fddd2b7a67460e16
//mpw:7kSEISvq3QWfnSh6vQZc2xgE+XF/sJ0WS/sgGkYpCOTQRjO1poLi3gfmGZNOwKzfqZUec0odiwAdmxcS7lfueENGIx8OmIe//d9imrGFpnkrf8jNSHdzfNPCUi3MbmUb
//mpw:qGbCMksqA90jjiGXXRr7lA==
//mpw:xKG9GABlywqar6CGPOSJKQ==
步骤3:配置加密信息
步骤4:使用秘钥启动服务  

最后:
        如果文章对您有帮助,就拿起小手赶紧给博主点赞💚评论❤️收藏💙 一下吧! 
       愿我们在未来的日子里。熠熠生辉!!!

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
Java 关系型数据库 MySQL
springboot学习五:springboot整合Mybatis 连接 mysql数据库
这篇文章是关于如何使用Spring Boot整合MyBatis来连接MySQL数据库,并进行基本的增删改查操作的教程。
57 0
springboot学习五:springboot整合Mybatis 连接 mysql数据库
|
2月前
|
Java 关系型数据库 数据库连接
mybatis-plus学习
MyBatis-Plus ,MyBatis 最佳搭档,只做增强不做改变,为简化开发、提高效率而生。
46 5
|
3月前
|
Java 数据库连接 Spring
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
文章是关于Spring、SpringMVC、Mybatis三个后端框架的超详细入门教程,包括基础知识讲解、代码案例及SSM框架整合的实战应用,旨在帮助读者全面理解并掌握这些框架的使用。
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
|
3月前
|
安全 Java 数据库连接
后端框架的学习----mybatis框架(3、配置解析)
这篇文章详细介绍了MyBatis框架的核心配置文件解析,包括环境配置、属性配置、类型别名设置、映射器注册以及SqlSessionFactory和SqlSession的生命周期和作用域管理。
后端框架的学习----mybatis框架(3、配置解析)
|
3月前
|
Java 数据库连接 mybatis
后端框架的学习----mybatis框架(9、多对一处理和一对多处理)
这篇文章介绍了在MyBatis框架中如何处理多对一和一对多的关联查询,通过定义`<resultMap>`和使用`<association>`与`<collection>`元素来实现对象间的关联映射。
|
3月前
|
Java 数据库连接 测试技术
后端框架的学习----mybatis框架(8、lombok)
这篇文章介绍了如何在MyBatis框架中使用lombok库来简化Java实体类的编写,包括在IDEA中安装Lombok插件、在项目中导入lombok依赖以及在实体类上使用Lombok提供的注解。
|
3月前
|
SQL Java 数据库连接
后端框架的学习----mybatis框架(5、分页)
这篇文章介绍了如何在MyBatis框架中实现分页功能,包括使用SQL的`limit`语句进行分页和利用MyBatis的`RowBounds`对象进行分页的方法。
|
3月前
|
SQL Java 数据库连接
后端框架的学习----mybatis框架(7、使用注解开发)
这篇文章讲述了如何使用MyBatis框架的注解方式进行开发,包括在接口上使用注解定义SQL语句,并通过动态代理实现对数据库的增删改查操作,同时强调了接口需要在核心配置文件中注册绑定。
|
3月前
|
Java 数据库连接 Maven
手把手教你如何搭建SSM框架、图书商城系统案例
这篇文章是关于如何搭建SSM框架以及实现一个图书商城系统的详细教程,包括了项目的配置文件整合、依赖管理、项目结构和运行效果展示,并提供了GitHub源码链接。
手把手教你如何搭建SSM框架、图书商城系统案例
|
2月前
|
Java 应用服务中间件 数据库连接
ssm项目整合,简单的用户管理系统
文章介绍了一个使用SSM框架(Spring、SpringMVC、MyBatis)构建的简单用户管理系统的整合过程,包括项目搭建、数据库配置、各层代码实现以及视图展示。
ssm项目整合,简单的用户管理系统