2万字实操案例之在Springboot框架下基于注解用Mybatis开发实现基础操作MySQL之预编译SQL主键返回增删改查

本文涉及的产品
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 2万字实操案例之在Springboot框架下基于注解用Mybatis开发实现基础操作MySQL之预编译SQL主键返回增删改查

环境准备

准备数据库表

use mybatis;
 
-- 部门管理
create table dept(
                     id int unsigned primary key auto_increment comment '主键ID',
                     name varchar(10) not null unique comment '部门名称',
                     create_time datetime not null comment '创建时间',
                     update_time datetime not null comment '修改时间'
) comment '部门表';
 
insert into dept (id, name, create_time, update_time) values(1,'学工部',now(),now()),(2,'教研部',now(),now()),(3,'咨询部',now(),now()), (4,'就业部',now(),now()),(5,'人事部',now(),now());
 
 
 
-- 员工管理
create table emp (
                     id int unsigned primary key auto_increment comment 'ID',
                     username varchar(20) not null unique comment '用户名',
                     password varchar(32) default '123456' comment '密码',
                     name varchar(10) not null comment '姓名',
                     gender tinyint unsigned not null comment '性别, 说明: 1 男, 2 女',
                     image varchar(300) comment '图像',
                     job tinyint unsigned comment '职位, 说明: 1 班主任,2 讲师, 3 学工主管, 4 教研主管, 5 咨询师',
                     entrydate date comment '入职时间',
                     dept_id int unsigned comment '部门ID',
                     create_time datetime not null comment '创建时间',
                     update_time datetime not null comment '修改时间'
) comment '员工表';
 
INSERT INTO emp
(id, username, password, name, gender, image, job, entrydate,dept_id, create_time, update_time) VALUES
                                                                                                    (1,'jinyong','123456','金庸',1,'1.jpg',4,'2000-01-01',2,now(),now()),
                                                                                                    (2,'zhangwuji','123456','张无忌',1,'2.jpg',2,'2015-01-01',2,now(),now()),
                                                                                                    (3,'yangxiao','123456','杨逍',1,'3.jpg',2,'2008-05-01',2,now(),now()),
                                                                                                    (4,'weiyixiao','123456','韦一笑',1,'4.jpg',2,'2007-01-01',2,now(),now()),
                                                                                                    (5,'changyuchun','123456','常遇春',1,'5.jpg',2,'2012-12-05',2,now(),now()),
                                                                                                    (6,'xiaozhao','123456','小昭',2,'6.jpg',3,'2013-09-05',1,now(),now()),
                                                                                                    (7,'jixiaofu','123456','纪晓芙',2,'7.jpg',1,'2005-08-01',1,now(),now()),
                                                                                                    (8,'zhouzhiruo','123456','周芷若',2,'8.jpg',1,'2014-11-09',1,now(),now()),
                                                                                                    (9,'dingminjun','123456','丁敏君',2,'9.jpg',1,'2011-03-11',1,now(),now()),
                                                                                                    (10,'zhaomin','123456','赵敏',2,'10.jpg',1,'2013-09-05',1,now(),now()),
                                                                                                    (11,'luzhangke','123456','鹿杖客',1,'11.jpg',5,'2007-02-01',3,now(),now()),
                                                                                                    (12,'hebiweng','123456','鹤笔翁',1,'12.jpg',5,'2008-08-18',3,now(),now()),
                                                                                                    (13,'fangdongbai','123456','方东白',1,'13.jpg',5,'2012-11-01',3,now(),now()),
                                                                                                    (14,'zhangsanfeng','123456','张三丰',1,'14.jpg',2,'2002-08-01',2,now(),now()),
                                                                                                    (15,'yulianzhou','123456','俞莲舟',1,'15.jpg',2,'2011-05-01',2,now(),now()),
                                                                                                    (16,'songyuanqiao','123456','宋远桥',1,'16.jpg',2,'2010-01-01',2,now(),now()),
                                                                                                    (17,'chenyouliang','123456','陈友谅',1,'17.jpg',NULL,'2015-03-21',NULL,now(),now());

创建Springboot工程 引入对应的依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
 
    <!--所有项目的父工程 指定了springboot工程的版本-->
    <parent>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-parent</artifactId>
       <version>3.2.5</version>
       <relativePath/> <!-- lookup parent from repository -->
    </parent>
 
    <!-- Generated by https://start.springboot.io -->
    <!-- 优质的 spring/boot/data/security/cloud 框架中文文档尽在 => https://springdoc.cn -->
    <groupId>com.bigdate</groupId>
    <artifactId>Mybatis</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>Mybatis</name>
    <description>Mybatis</description>
    <properties>
       <java.version>17</java.version>
    </properties>
    <dependencies>
 
       <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-web</artifactId>
       </dependency>
 
       <!--mybatis起步依赖-->
       <dependency>
          <groupId>org.mybatis.spring.boot</groupId>
          <artifactId>mybatis-spring-boot-starter</artifactId>
          <version>3.0.3</version>
       </dependency>
 
       <!--MySQL驱动包-->
       <dependency>
          <groupId>com.mysql</groupId>
          <artifactId>mysql-connector-j</artifactId>
          <scope>runtime</scope>
       </dependency>
 
       <!--Springboot单元测试所需要的依赖-->
       <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-test</artifactId>
          <scope>test</scope>
       </dependency>
 
       <dependency>
          <groupId>org.mybatis.spring.boot</groupId>
          <artifactId>mybatis-spring-boot-starter-test</artifactId>
          <version>3.0.3</version>
          <scope>test</scope>
       </dependency>
 
       <!-- druid连接池 -->
       <dependency>
          <groupId>com.alibaba</groupId>
          <artifactId>druid-spring-boot-starter</artifactId>
          <version>1.2.8</version>
       </dependency>
 
       <!-- lombok -->
       <dependency>
          <groupId>org.projectlombok</groupId>
          <artifactId>lombok</artifactId>
       </dependency>
 
    </dependencies>
 
    <build>
       <plugins>
          <plugin>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-maven-plugin</artifactId>
          </plugin>
       </plugins>
    </build>
 
</project>

引入数据库的连接信息

spring.application.name=Mybatis
 
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
 
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis
 
spring.datasource.username=root
 
spring.datasource.password=123456
 
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource

创建实体类并用lombok工具 通过注释简化书写

package com.bigdate.mybatis.pojo;
 
import lombok.*;
 
import java.time.LocalDate;
import java.time.LocalDateTime;
 
//@Getter
//@Setter
//@ToString
//@EqualsAndHashCode
 
@Data
@NoArgsConstructor  //无参构造
@AllArgsConstructor //带参构造
 
public class User {
    //ID
    private Integer id;
    //用户名
    private String username;
    //密码
    private String password;
    //姓名
    private String name;
    //性别
    private Short gender;
    //图像
    private String image;
    //职位
    private Short job;
    //入职时间
    private LocalDate entrydate;
    //部门ID
    private Integer deptID;
    //创建时间
    private LocalDateTime creatTime;
    //修改时间
    private LocalDateTime updateTime;
 
}

准备好Mapper接口 将数据库中拿到的实体类对象交给ioc容器

package com.bigdate.mybatis.mapper;
 
 
import com.bigdate.mybatis.pojo.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
 
import java.util.List;
 
@Mapper//表示当前是Mybatis的一个接口 此时程序运行时框架会自动生成实现类对象(代理对象) 并交给spring的ioc容器
public interface UserMapper {
 
   
 
}

基础工程

删除操作

删除数据库表中的数据

package org.example.mybatis.mapper;
 
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Mapper;
 
@Mapper//表示当前是Mybatis的一个接口 此时程序运行时框架会自动生成实现类对象(代理对象) 并交给spring的ioc容器
public interface UserMapper {
 
    //根据ID删除数据
    @Delete("delete from emp where id = #{id}")
 
    //返回值代表的是操作影响的数据数
    public  int delete(Integer id);
 
 
}
package org.example.mybatis;
 
 
 
import org.example.mybatis.mapper.UserMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
 
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
 
@SpringBootTest //springboot整合单元测试的注解
class MybatisApplicationTests {
 
  @Autowired
  //声明接口类型的对象 将此对象注入进来
  private UserMapper userMapper;
 
  @Test
  public void testDelete(){
 
    int ans=userMapper.delete(14);
    //拿到返回值 并且输出到控制台
    System.out.println(userMapper.delete(ans));
 
  }
 
}

一般来说返回值是不需要的

返回值类型都设置为void

预编译SQL

我们不知道Java底层执行了什么样子的SQL语句

所以我们要打开日志

在配置文件中配置

指定输出到控制台

spring.application.name=Mybatis
 
#驱动类名称
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
 
#数据库连接url
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis
 
#连接数据库的用户名
spring.datasource.username=root
 
#连接数据库的密码
spring.datasource.password=123456
 
#换数据库连接池
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
 
#配置mybatis的日志 指定输出到控制台
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

这样就能输出执行的SQL语句

这个语句叫预编译SQL语句

?是预编译过程中的数据占位符

采用这种预编译的方式 性能更高 而且更安全

#和 {} 最后会被 ?替换

SQL具有缓存机制

小结

新增操作

往员工表中插入数据

实际前端页面是一个表单提交数据

基本信息录入完毕后

就能将数据提交到服务端

然后服务端将数据写入数据库

实体类封装参数

注意字段要一一对应

如果字段名对应不上就难以通过测试

这边改了半个小时

先定义接口方法

再获取接口 写测试类

package org.example.mybatis.mapper;
 
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.example.mybatis.pojo.User;
 
@Mapper//表示当前是Mybatis的一个接口 此时程序运行时框架会自动生成实现类对象(代理对象) 并交给spring的ioc容器
public interface UserMapper {
 
    //根据ID删除数据
    @Delete("delete from emp where id = #{id}")
 
    //返回值代表的是操作影响的数据数
    public  int delete(Integer id);
 
    //新增数据
    @Insert("insert into emp (id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time)" +
            "values (#{id},#{username},#{password},#{name},#{gender},#{image},#{job},#{entryDate},#{deptID},#{creatTime},#{updateTime})")
    public void insert(User user);
 
 
}
package org.example.mybatis;
 
 
 
import org.example.mybatis.mapper.UserMapper;
import org.example.mybatis.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
 
import java.sql.*;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
 
@SpringBootTest //springboot整合单元测试的注解
class MybatisApplicationTests {
 
    @Autowired
    //声明接口类型的对象 将此对象注入进来
    private UserMapper userMapper;
 
    @Test
    public void testDelete(){
 
       int ans=userMapper.delete(14);
       //拿到返回值
       System.out.println(userMapper.delete(ans));
 
    }
 
    @Test
    public void testInsert(){
 
       User user=new User();
       
       //-- 插入数据
       //insert into emp(id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time)
       //values (133,'Dduo',1234,'多多','1','100.jpg','1',now(),1,now(),now());
 
       user.setId(1332);
       user.setUsername("Dduo");
       user.setPassword("1234");
       user.setName("多多");
       user.setGender((short) 1);
       user.setImage("1.jpg");
       user.setJob((short)1);
       user.setEntryDate(LocalDate.of(2000,1,1));
       user.setDeptID(1);
       user.setCreatTime(LocalDateTime.now());
       user.setUpdateTime(LocalDateTime.now());
 
       //执行新增员工信息的操作
       userMapper.insert(user);
 
    }
 
 
}

写在Mapper接口里的方法

写在测试类里面的启动测试案例

主键返回

在数据添加成功后

需要获取插入数据库数据的主键

例如在添加套餐数据时 还需要维护套餐菜品关系表的数据

我们需要怎么去做呢

代码演示

package org.example.mybatis.mapper;
 
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Options;
import org.example.mybatis.pojo.User;
 
@Mapper//表示当前是Mybatis的一个接口 此时程序运行时框架会自动生成实现类对象(代理对象) 并交给spring的ioc容器
public interface UserMapper {
 
    //根据ID删除数据
    @Delete("delete from emp where id = #{id}")
 
    //返回值代表的是操作影响的数据数
    public  int delete(Integer id);
 
    //新增数据
    @Options(useGeneratedKeys = true , keyProperty = "id")
    @Insert("insert into emp (id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time)" +
            "values (#{id},#{username},#{password},#{name},#{gender},#{image},#{job},#{entryDate},#{deptID},#{creatTime},#{updateTime})")
    public void insert(User user);
 
 
}

更新修改操作

点击操作的编辑按钮时

就会根据当前数据的主键ID

来查找这条数据并将数据回填

我们直接修改

然后提交表单到服务端去完成数据库表结构中数据的修改

写在Mapper接口里的

写在测试类里面

package org.example.mybatis.mapper;
 
import org.apache.ibatis.annotations.*;
import org.example.mybatis.pojo.User;
 
@Mapper//表示当前是Mybatis的一个接口 此时程序运行时框架会自动生成实现类对象(代理对象) 并交给spring的ioc容器
public interface UserMapper {
 
    //根据ID删除数据
    @Delete("delete from emp where id = #{id}")
 
    //返回值代表的是操作影响的数据数
    public  int delete(Integer id);
 
    //新增数据
    @Options(useGeneratedKeys = true , keyProperty = "id")
    @Insert("insert into emp (id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time)" +
            "values (#{id},#{username},#{password},#{name},#{gender},#{image},#{job},#{entryDate},#{deptID},#{creatTime},#{updateTime})")
    public void insert(User user);
 
 
    //更新数据
    @Update("update emp set username=#{username},password=#{password},name=#{gender}," +
            "gender=#{gender},image=#{image},job=#{job}," +
            "entrydate=#{entryDate},dept_id=#{deptID},create_time=#{creatTime} ,update_time=#{updateTime} " +
            "where id=#{id}")
    public void update(User user);
 
 
}
package org.example.mybatis;
 
 
 
import org.example.mybatis.mapper.UserMapper;
import org.example.mybatis.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
 
import java.sql.*;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
 
@SpringBootTest //springboot整合单元测试的注解
class MybatisApplicationTests {
 
    @Autowired
    //声明接口类型的对象 将此对象注入进来
    private UserMapper userMapper;
 
    @Test
    public void testDelete(){
 
       int ans=userMapper.delete(14);
       //拿到返回值
       System.out.println(userMapper.delete(ans));
 
    }
 
    @Test
    public void testInsert(){
 
       User user=new User();
       
       //-- 插入数据
       //insert into emp(id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time)
       //values (133,'Dduo',1234,'多多','1','100.jpg','1',now(),1,now(),now());
 
       user.setId(14);
       user.setUsername("Dduo1");
       user.setPassword("1234");
       user.setName("多多");
       user.setGender((short) 1);
       user.setImage("1.jpg");
       user.setJob((short)1);
       user.setEntryDate(LocalDate.of(2000,1,1));
       user.setDeptID(1);
       user.setCreatTime(LocalDateTime.now());
       user.setUpdateTime(LocalDateTime.now());
 
       //执行新增员工信息的操作
       userMapper.insert(user);
 
    }
 
    @Test
    public void testUpdata(){
 
       User user=new User();
 
       user.setId(14);
       user.setUsername("Dduo1");
       user.setPassword("1234");
       user.setName("多多");
       user.setGender((short) 1);
       user.setImage("1.jpg");
       user.setJob((short)1);
       user.setEntryDate(LocalDate.of(2000,1,1));
       user.setDeptID(1);
       user.setCreatTime(LocalDateTime.now());
       user.setUpdateTime(LocalDateTime.now());
 
       //执行新增员工信息的操作
       userMapper.update(user);
 
    }
 
 
}

查看日志 更新的数据为一条

根据ID查询

写在Mapper接口里

写在测试类里面

package org.example.mybatis;
 
 
 
import org.example.mybatis.mapper.UserMapper;
import org.example.mybatis.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
 
import java.sql.*;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
 
@SpringBootTest //springboot整合单元测试的注解
class MybatisApplicationTests {
 
    @Autowired
    //声明接口类型的对象 将此对象注入进来
    private UserMapper userMapper;
 
    @Test
    public void testDelete(){
 
       int ans=userMapper.delete(14);
       //拿到返回值
       System.out.println(userMapper.delete(ans));
 
    }
 
    @Test
    public void testInsert(){
 
       User user=new User();
 
       //-- 插入数据
       //insert into emp(id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time)
       //values (133,'Dduo',1234,'多多','1','100.jpg','1',now(),1,now(),now());
 
       user.setId(14);
       user.setUsername("Dduo1");
       user.setPassword("1234");
       user.setName("多多");
       user.setGender((short) 1);
       user.setImage("1.jpg");
       user.setJob((short)1);
       user.setEntryDate(LocalDate.of(2000,1,1));
       user.setDeptID(1);
       user.setCreatTime(LocalDateTime.now());
       user.setUpdateTime(LocalDateTime.now());
 
       //执行新增员工信息的操作
       userMapper.insert(user);
 
    }
 
    @Test
    public void testUpdata(){
 
       User user=new User();
 
       user.setId(14);
       user.setUsername("Dduo1");
       user.setPassword("1234");
       user.setName("多多");
       user.setGender((short) 1);
       user.setImage("1.jpg");
       user.setJob((short)1);
       user.setEntryDate(LocalDate.of(2000,1,1));
       user.setDeptID(1);
       user.setCreatTime(LocalDateTime.now());
       user.setUpdateTime(LocalDateTime.now());
 
       //执行新增员工信息的操作
       userMapper.update(user);
    }
 
    @Test
    public void testGetById(){
       User user=userMapper.getById(2);
       System.out.println(user);
    }
 
}

控制台进行反馈

但是在控制台中 字段值没有全部封装

而日期类的数据没有封装

在我们进行单元测试的时候我们会发现有些字段没有封装到实体类对象里面

处理方案

但是这种方案比较繁琐 不使用

我们应该打开Mybatis 自动映射开关

驼峰命名自动映射的开关

mybatis.configuration.map-underscore-to-camel-case=true

这样在Mapper接口中既不用手动封装也不用去取别名了

直接把原代码放开

package org.example.mybatis.mapper;
 
import org.apache.ibatis.annotations.*;
import org.example.mybatis.pojo.User;
 
@Mapper//表示当前是Mybatis的一个接口 此时程序运行时框架会自动生成实现类对象(代理对象) 并交给spring的ioc容器
public interface UserMapper {
 
    //根据ID删除数据
    @Delete("delete from emp where id = #{id}")
 
    //返回值代表的是操作影响的数据数
    public  int delete(Integer id);
 
    //新增数据
    @Options(useGeneratedKeys = true , keyProperty = "id")
    @Insert("insert into emp (id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time)" +
            "values (#{id},#{username},#{password},#{name},#{gender},#{image},#{job},#{entryDate},#{deptID},#{creatTime},#{updateTime})")
    public void insert(User user);
 
 
    //更新数据
    @Update("update emp set username=#{username},password=#{password},name=#{gender}," +
            "gender=#{gender},image=#{image},job=#{job}," +
            "entrydate=#{entryDate},dept_id=#{deptID},create_time=#{creatTime} ,update_time=#{updateTime} " +
            "where id=#{id}")
    public void update(User user);
 
 
    //查询数据
    @Select("select * from emp where id=#{id}")
    public User getById(Integer id);
 
    //方案1 给字段起别名 让别名与实体类的属性一致
//    @Select("select id, username, password, name, gender, image, job, " +
//            "entrydate entryDate, dept_id  deptID, create_time creatTime, update_time updateTime" +
//            " from emp where id=#{id}")
//    public User getById1(Integer id);
 
 
    //方案2 通过@Results @Result注解手动映射封装
//    @Results({
//            @Result(column = "entrydate",property = "entryDate"),
//            @Result(column = "dept_id",property = "deptID"),
//            @Result(column = "create_time",property = "creatTime"),
//            @Result(column = "update_time",property = "updateTime")
//    })
//    @Select("select * from emp where id=#{id}")
//    public User getById2(Integer id);
 
}

小结

条件查询

完成根据ID查询员工信息后

我们该学习员工列表信息查询

在上面填入搜索条件后 点击查询

提交给服务端查找

select *
from emp
where name like '%张%'
  and gender = 1
  and entrydate between '2010-01-01' and '2020-01-01'
order by update_time;

写在Mapper接口里的接口方法

写在测试类里的测试方法

启动测试 我们已经开启驼峰自动映射 自动封装字段名

使用$符号增强了代码的灵活性

但就不是预编译SQL

性能低而且不安全

存在SQL注入的问题

改进方法

select *
from emp
where name like '%张%'
  and gender = 1
  and entrydate between '2010-01-01' and '2020-01-01'
order by update_time;
 
 
 
select concat('hello' , 'mysql' ,'world');
 
# 改写
select *
from emp
where name like concat('%','张','%')
  and gender = 1
  and entrydate between '2010-01-01' and '2020-01-01'
order by update_time;

同理

现在生成的SQL语句就是预编译SQL

早期的springboot要在先前版本中额外的加上注解

这是因为先前编译的时候不会保留形参的名称

对应不起来

现在的Springboot内置插件 会自动将形参保存下来

但是以后在实际开发中遇到@Param注解要能明白是什么意思

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
16天前
|
Java 数据库连接 数据库
大事件后端项目05-----springboot整合mybatis
大事件后端项目05-----springboot整合mybatis
大事件后端项目05-----springboot整合mybatis
|
11天前
|
Java 数据库连接 Maven
文本,使用SpringBoot工程创建一个Mybatis-plus项目,Mybatis-plus在编写数据层接口,用extends BaseMapper<User>继承实体类
文本,使用SpringBoot工程创建一个Mybatis-plus项目,Mybatis-plus在编写数据层接口,用extends BaseMapper<User>继承实体类
|
12天前
|
XML Java 关系型数据库
Action:Consider the following: If you want an embedde ,springBoot配置数据库,补全springBoot的xml和mysql配置信息就好了
Action:Consider the following: If you want an embedde ,springBoot配置数据库,补全springBoot的xml和mysql配置信息就好了
|
10天前
|
SQL 自然语言处理 网络协议
【Linux开发实战指南】基于TCP、进程数据结构与SQL数据库:构建在线云词典系统(含注册、登录、查询、历史记录管理功能及源码分享)
TCP(Transmission Control Protocol)连接是互联网上最常用的一种面向连接、可靠的、基于字节流的传输层通信协议。建立TCP连接需要经过著名的“三次握手”过程: 1. SYN(同步序列编号):客户端发送一个SYN包给服务器,并进入SYN_SEND状态,等待服务器确认。 2. SYN-ACK:服务器收到SYN包后,回应一个SYN-ACK(SYN+ACKnowledgment)包,告诉客户端其接收到了请求,并同意建立连接,此时服务器进入SYN_RECV状态。 3. ACK(确认字符):客户端收到服务器的SYN-ACK包后,发送一个ACK包给服务器,确认收到了服务器的确
|
14天前
|
SQL 分布式计算 DataWorks
DataWorks产品使用合集之在使用ODPSSQL节点进行SQL任务开发时,如何执行大量的SQL语句
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
26 4
|
12天前
|
Java 数据库连接 mybatis
SpringBoot配置Mybatis注意事项,mappers层下的name命名空间,要落实到Dao的video类,resultType要落到bean,配置好mybatis的对应依赖。
SpringBoot配置Mybatis注意事项,mappers层下的name命名空间,要落实到Dao的video类,resultType要落到bean,配置好mybatis的对应依赖。
|
9天前
|
SQL NoSQL 关系型数据库
若依修改02,若以提供了多种版本,RuoYi-Cloud和SpringBoot+Vue都是PC端的,如果想要适配手机端,用Uniapp+vue,导入Mysql和启动Redis
若依修改02,若以提供了多种版本,RuoYi-Cloud和SpringBoot+Vue都是PC端的,如果想要适配手机端,用Uniapp+vue,导入Mysql和启动Redis
|
14天前
|
Java 关系型数据库 MySQL
Spring Boot中集成MySQL数据库的步骤和技巧
Spring Boot中集成MySQL数据库的步骤和技巧
|
17天前
|
XML Java 数据库连接
|
18天前
|
SQL Java 数据库连接
Mybatis如何使用mapper代理开发
Mybatis如何使用mapper代理开发