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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
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
目录
相关文章
|
8天前
|
数据采集 监控 前端开发
二级公立医院绩效考核系统源码,B/S架构,前后端分别基于Spring Boot和Avue框架
医院绩效管理系统通过与HIS系统的无缝对接,实现数据网络化采集、评价结果透明化管理及奖金分配自动化生成。系统涵盖科室和个人绩效考核、医疗质量考核、数据采集、绩效工资核算、收支核算、工作量统计、单项奖惩等功能,提升绩效评估的全面性、准确性和公正性。技术栈采用B/S架构,前后端分别基于Spring Boot和Avue框架。
|
20天前
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
36 4
|
17天前
|
Java API 数据库
Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐
本文通过在线图书管理系统案例,详细介绍如何使用Spring Boot构建RESTful API。从项目基础环境搭建、实体类与数据访问层定义,到业务逻辑实现和控制器编写,逐步展示了Spring Boot的简洁配置和强大功能。最后,通过Postman测试API,并介绍了如何添加安全性和异常处理,确保API的稳定性和安全性。
28 0
|
12天前
|
前端开发 Java 数据库连接
Spring 框架:Java 开发者的春天
Spring 框架是一个功能强大的开源框架,主要用于简化 Java 企业级应用的开发,由被称为“Spring 之父”的 Rod Johnson 于 2002 年提出并创立,并由Pivotal团队维护。
34 1
Spring 框架:Java 开发者的春天
|
4天前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,帮助开发者提高开发效率和应用的可维护性。
13 2
|
3天前
|
消息中间件 NoSQL Java
springboot整合常用中间件框架案例
该项目是Spring Boot集成整合案例,涵盖多种中间件的使用示例,每个案例项目使用最小依赖,便于直接应用到自己的项目中。包括MyBatis、Redis、MongoDB、MQ、ES等的整合示例。
44 1
|
11天前
|
Java 数据库连接 开发者
Spring 框架:Java 开发者的春天
【10月更文挑战第27天】Spring 框架由 Rod Johnson 在 2002 年创建,旨在解决 Java 企业级开发中的复杂性问题。它通过控制反转(IOC)和面向切面的编程(AOP)等核心机制,提供了轻量级的容器和丰富的功能,支持 Web 开发、数据访问等领域,显著提高了开发效率和应用的可维护性。Spring 拥有强大的社区支持和丰富的生态系统,是 Java 开发不可或缺的工具。
|
18天前
|
人工智能 开发框架 Java
总计 30 万奖金,Spring AI Alibaba 应用框架挑战赛开赛
Spring AI Alibaba 应用框架挑战赛邀请广大开发者参与开源项目的共建,助力项目快速发展,掌握 AI 应用开发模式。大赛分为《支持 Spring AI Alibaba 应用可视化调试与追踪本地工具》和《基于 Flow 的 AI 编排机制设计与实现》两个赛道,总计 30 万奖金。
|
19天前
|
人工智能 Java API
阿里云开源 AI 应用开发框架:Spring AI Alibaba
近期,阿里云重磅发布了首款面向 Java 开发者的开源 AI 应用开发框架:Spring AI Alibaba(项目 Github 仓库地址:alibaba/spring-ai-alibaba),Spring AI Alibaba 项目基于 Spring AI 构建,是阿里云通义系列模型及服务在 Java AI 应用开发领域的最佳实践,提供高层次的 AI API 抽象与云原生基础设施集成方案,帮助开发者快速构建 AI 应用。本文将详细介绍 Spring AI Alibaba 的核心特性,并通过「智能机票助手」的示例直观的展示 Spring AI Alibaba 开发 AI 应用的便利性。示例源
|
18天前
|
SQL 运维 关系型数据库
MySQL 运维 SQL 备忘
MySQL 运维 SQL 备忘录
43 1