SpringBoot
4562字约15分钟
2025-11-21
创建项目
在下面这个网站中生成SpringBoot项目
https://start.spring.io/
然后将生成的项目导入idea中,等待idea下载依赖

三层结构


分层解耦
层与层之间尽量少的连接


IOC容器 / DI 注入
优先使用 @RestController 、@Service、@Repository 这三个注解
@RestController:@Controller + @ResponseBody 组合注解


@Component // 将当前类交给IOC容器管理,成为IOC容器的bean
class A extends T {
String name = "a1";
}@Primary // 当多个类有 @Component 注解时,默认使用该类
@Component
class B extends T {
String name = "b1";
}class C {
@Autowired // 将IOC容器中提供的bean赋值给当前变量,也叫依赖注入
T t;
System.out.println(a.name); // b1
// 类名首字母要小写
@Resource("a") // 表示使用 class A 这个类
T t;
System.out.println(a.name); // a1
}Lombok

pom.xml
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>Lombok会在编译时,自动生成对应的java代码。我们使用lombok时,还需要安装一个lombok的插件
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data // 相当于代码块中的属性都拥有set、get、toString、equals和hashcode方法
@NoArgsConstructor // 相当于设置了无参构造器
@AllArgsConstructor // 相当于设置了有参构造器
public class User {
private Integer id;
private String name;
private Short age;
private Character gender;
private Short bumen_id;
}日志
pom.xml
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>@Slf4j只能在类和枚举上使用
@Slf4j
public class User {
public void cehsi() {
log.info("日志测试");
// 业务代码......
}
}访问网站
|-- src
| |-- main
| | |-- java
| | | `-- com
| | | `-- example
| | | `-- demo
| | | |-- DemoApplication.java // 运行程序
| | | `-- controller
| | | `-- Hello.java // 网站访问资源Hello.java
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController // 该注解的作用:返回的值将自动转换成json格式
public class Hello {
// 设置Springboot网站的访问路径
// 127.0.0.1/hi即可访问
@RequestMapping("/hi")
public String hi() {
return "第一个SpringBoot";
}
}实体参数请求
|-- src
| |-- main
| | |-- java
| | | `-- com
| | | `-- example
| | | `-- demo
| | | |-- DemoApplication.java
| | | |-- controller
| | | | `-- Hello.java // 网站访问资源
| | | `-- pojo
| | | `-- User.java // 资源存放封装
public class User {
private String name;
private int age;
// 向Add_类中传值
private Add_ add;
// 省略set、get和toString代码
...
}public class Add_ {
private String name;
// 省略set、get和toString代码
...
}Hello.java(访问)
import com.example.demo.pojo.User;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class Hello {
// 当网站访问127.0.0.1:8080/User?name=tom&age=20时
// 即可往User类中传入数据(name=tom age=20)
@RequestMapping("/User")
public String user(User user) {
System.out.println(user);
return "ok";
}
}使用add.name即可向Add_类传入值
http://127.0.0.1:8080/user?name=tom&age=20&add.name=zhangsan数组参数请求
@RequestMapping("/arr")
public String arr(String[] strs) {
System.out.println(Arrays.toString(strs));
return "Arr ok";
}
// 访问:127.0.0.1:8080/arr?strs=tom&strs=jray&strs=zhangsan
@RequestMapping("/list")
public String arr(@RequestParam List<String> list) {
System.out.println(list);
return "List ok";
}
// 访问:127.0.0.1:8080/list?list=tom&list=jray&list=zhangsan// 给属性设置别名,该方法主要是用在http请求中的别名
@RequestParam("list")
// @Param则是设置MyBatis接口的别名参数默认值
// 设置参数默认值
public void page(@RequestParam(defaultValue = "1") Integer page) { }时间参数请求
@RequestMapping("/time")
public String time(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")LocalDateTime time) {
System.out.println(time);
return "time ok";
}
// 访问:127.0.0.1:8080/time?time=2025-10-15 10:00:01JSON参数请求
@RequestMapping("/user1")
public String user1(@RequestBody User user1) {
System.out.println(user1);
return "ok";
}发送json数据

路径参数请求
@RequestMapping("/path/{id}/{name}")
public String path(@PathVariable Integer id, @PathVariable String name) {
System.out.println(id);
System.out.println(name);
return "" + id + " " + name;
}
// 访问:127.0.0.1:8080/path/1/tom
// 此时id和name被赋值:id=1,name=tom自定义返回参数
// 自定义返回参数类
public class Result {
// 响应码,1成功,0失败
private int code;
// 提示信息
private String mass;
// 返回数据
private Object data;
public Result() {
}
public Result(int code, String mass, Object data) {
this.code = code;
this.mass = mass;
this.data = data;
}
// 成功 - 返回数据
public static Result success(Object object) {
return new Result(1, "success", object);
}
// 成功
public static Result success() {
return new Result(1, "success", null);
}
// 失败 - 失败信息
public static Result error(String mass) {
return new Result(0, mass, null);
}
// set和get方法
// ...
}@RequestMapping("/path1/{id}/{name}")
public Result path1(@PathVariable Integer id, @PathVariable String name) {
System.out.println(id);
System.out.println(name);
return Result.success(id + " " + name);
}
// 访问:127.0.0.1:8080/path1/1/n// 返回参数json
{
"code": 1,
"mass": "success",
"data": "1 n"
}自定义访问请求
某个连接需要指定使用某个请求时使用
// 访问该链接只能使用Post请求访问,其他请求同理
@PostMapping("/hi")
public List<User> hi() {
List<User> userList = userMapper.list();
log.info("日志测试");
return userList;
}数据库增删改查
在 application.properties 中配置数据库的连接信息,然后连接数据库
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# 要连接的数据库
spring.datasource.url=jdbc:mysql://localhost:3306/sql01
# 用户名
spring.datasource.username=root
# 密码
spring.datasource.password=123456properties --转--> yml
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/sql01
username: root
password: 123456数据库属性信息
@Data // 相当于代码块中的属性都拥有set、get、toString、equals和hashcode方法
@NoArgsConstructor // 无参构造器
@AllArgsConstructor // 有参构造器
public class User {
private Integer id;
private String name;
private Short age;
private Character gender;
private Short bumen_id;
}增删改查数据库信息
@Mapper // 会自动生成该接口的实现类对象(代理对象),交给IOC容器管理
public interface UserMapper {
// 将sql语句查询的信息赋值给集合
@Select("select * from user1")
public List<User> list();
// 删除对应id的sql语句
// Integer id值是什么值 #{id}就是什么值
@Delete("delete from user1 where id = #{id}")
public void delete(Integer id);
@Options(useGeneratedKeys = true, keyProperty = "id") // 获取主键值
@Insert("insert into user1(name, age, gender, bumen_id)" +
"values (#{name}, #{age}, #{gender}, #{bumen_id})") // 添加数据
public void insert(User user);
// #{name} 表示的是 User 类中的 name 属性,其他的以此类推
// 更新数据
@Update("update user1 " +
"set name=#{name}, age=#{age}, gender=#{gender}, bumen_id=#{bumen_id} " +
"where id=#{id}")
public void update(User user);
}输出数据库信息
@RestController // 该注解的作用:返回的值将自动转换成json格式
public class Hello {
@Autowired // 将IOC容器中提供的bean赋值给当前变量,也叫依赖注入
private UserMapper userMapper;
// 读取数据
@RequestMapping("/hi")
public List<User> hi() {
List<User> userList = userMapper.list();
return userList;
}
// 删除数据
public void deleteUser() {
userMapper.delete(1);
}
// 添加数据
public void insertUser() {
User user = new User();
user.setName("ceshi");
user.setAge((short) 20);
user.setGender('男');
user.setBumen_id((short) 1);
// 传入添加的数据
userMapper.insert(user);
}
// 更新数据
public void updateUser() {
User user = new User();
user.setId(1);
user.setName("ceshi");
user.setAge((short) 20);
user.setGender('男');
user.setBumen_id((short) 1);
userMapper.update(user);
}
}
@Delete("delete from user1 where id = #{id}")
public void delete(Integer id);当占位符是 #{} 时,会启动sql预编译

数据封装
类中的属性名和数据库中的列名如果是一致的,则 MyBatis 会自动封装该数据,不一致则不会
解决方法:
使类中的属性名和数据库中的列名保持一致
自动封装
在
application.properties中配置MyBatis# 在控制台中显示 mybatis 日志 mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl # 开启mybatis驼峰名称自动映射 # 例子:a_cloud --自动映射到类中的--> aCloud(需要严格执行该格式) mybatis.configuration.map-underscore-to-camel-case=true给列名起别名
@Select("select id, name, age, gender, bumen_id bumenId " + "from user1;") public List<User> list1();bumen_id bumenId:bumen_id是列名,bumenId是属性名手动封装
// 手动封装 @Results({ @Result(column = "id_card", property = "idCard"), @Result(column = "bumen_id", property = "bumenId") }) @Select("select * from user1") public List<User> list1();

条件查询
@Select("select * from user1 " +
"where name like '%${name}%' and bumen_id=#{bumen_id}")
public List<User> findByName(@Param("name") String name, @Param("bumen_id") Short bumen_id);@Autowired // 将IOC容器中提供的bean赋值给当前变量,也叫依赖注入
private UserMapper userMapper;
@Test
public void selectUser() {
// 条件:名字中含有c,且部门id为1的员工
List<User> ca = userMapper.findByName("c", (short) 1);
ca.stream().forEach(user1 -> {
System.out.println(user1);
}
);
}MyBatis
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">
<!--com.mao.mapper.UserMapper:实现接口-->
<mapper namespace="com.mao.mapper.UserMapper">
<!-- id = 映射的类名-->
<!-- resultType:指定 SQL 语句执行后返回结果的类型 -->
<select id="findByName" resultType="com.mao.pojo.User">
select * from user1
where name like '%${name}%' and bumen_id=#{bumen_id};
</select>
</mapper>public List<User> findByName(@Param("name") String name, @Param("bumen_id") Short bumen_id);相当于是将mysql语句集中写在一个文件中,不用写在代码块上
动态语句(增删改查)
查询
xml:src/main/resources/com/mao/mapper/UserMapper.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"> <!--com.mao.mapper.UserMapper:实现接口--> <mapper namespace="com.mao.mapper.UserMapper"> <!-- id = 映射的类名--> <!-- resultType:指定 SQL 语句执行后返回结果的类型 --> <select id="findByName" resultType="com.mao.pojo.User"> select * from user1 -- where标签,会判断if标签是否为true,然后来决定是否拼接where语句 -- if条件为true,则添加where语句 -- if条件为false,则不添加where语句 <where> <if test = "name != null"> name like '%${name}%' </if> <if test = "bumen_id != null"> and bumen_id = #{bumen_id} </if> </where> </select> </mapper>实现接口:src/main/java/com/mao/mapper/UserMapper.java
public List<User> findByName(@Param("name") String name, @Param("bumen_id") Short bumen_id);运行:src/main/java/com/mao/controller/Hello.java
@Autowired // 将IOC容器中提供的bean赋值给当前变量,也叫依赖注入 private UserMapper userMapper; @Test public void selectUser() { List<User> ca = userMapper.findByName(null, null); ca.stream().forEach(user1 -> { System.out.println(user1); } ); }
更新
xml:src/main/resources/com/mao/mapper/UserMapper.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"> <!--com.mao.mapper.UserMapper:实现接口--> <mapper namespace="com.mao.mapper.UserMapper"> <!-- id = 映射的类名--> <update id="update1"> update user1 -- set标签:作用是自动处理字段间的逗号分隔问题,避免因动态条件导致的 SQL 语法错误 <set> <if test="name != null"> name=#{name}, </if> <if test="age != null"> age=#{age}, </if> <if test="gender != null"> gender=#{gender}, </if> <if test="bumen_id != null"> bumen_id=#{bumen_id} </if> </set> where id = #{id} </update> </mapper>实现接口:src/main/java/com/mao/mapper/UserMapper.java
public void update1(User user);运行:src/main/java/com/mao/controller/Hello.java
@Autowired // 将IOC容器中提供的bean赋值给当前变量,也叫依赖注入 private UserMapper userMapper; @Test // 只会更新 id = 1 的内容 // 且只更新年龄,其他值不会为null public void updateUser() { User user = new User(); user.setId(1); user.setAge((short) 22); userMapper.update1(user); }
删除
xml:src/main/resources/com/mao/mapper/UserMapper.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"> <!--com.mao.mapper.UserMapper:实现接口--> <mapper namespace="com.mao.mapper.UserMapper"> <!-- id = 映射的类名--> <delete id="deleteById"> delete from user1 where id in -- (5, 6, 7) <foreach collection="ids" item="id" separator="," open="(" close=")"> #{id} </foreach> </delete> </mapper>实现接口:src/main/java/com/mao/mapper/UserMapper.java
public void deleteById(@Param("ids") List<Integer> ids);运行:src/main/java/com/mao/controller/Hello.java
@Autowired // 将IOC容器中提供的bean赋值给当前变量,也叫依赖注入 private UserMapper userMapper; @Test public void deleteAll() { List<Integer> arr = Arrays.asList(5, 6, 7); userMapper.deleteById(arr); }
<foreach>标签循环遍历集合(List、数组等),通常在 SQL 语句中动态生成批量操作的语法(如批量插入、批量删除、批量更新等)
<foreach> 标签有几个关键属性,必须根据场景正确配置:
| 属性 | 作用 |
|---|---|
collection | 指定要遍历的集合 / 数组的名称(关键属性,需与参数名对应)。 |
item | 遍历过程中,当前元素的别名,指代集合中当前迭代的元素(类型由集合泛型决定) |
separator | 元素之间的分隔符(如 ,,用于拼接时分隔多个元素)。 |
open | 遍历结果的开头拼接的字符串(如 ()。 |
close | 遍历结果的结尾拼接的字符串(如 ))。 |
index | 可选,遍历列表 / 数组时表示索引;遍历 Map 时表示键(key)。 |
添加
xml:src/main/resources/com/mao/mapper/UserMapper.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"> <!--com.mao.mapper.UserMapper:实现接口--> <mapper namespace="com.mao.mapper.UserMapper"> <!-- id = 映射的类名--> <insert id="insert1"> insert into user1(name, age, gender, bumen_id) values <foreach collection="list" item="user" separator=","> ( #{user.name}, -- 对应name字段 #{user.age}, -- 对应age字段 #{user.gender}, -- 对应gender字段 #{user.bumen_id} -- 对应bumen_id字段 ) </foreach> </insert> </mapper>实现接口:src/main/java/com/mao/mapper/UserMapper.java
public void insert1(@Param("list") List<User> user1);运行:src/main/java/com/mao/controller/Hello.java
@Autowired // 将IOC容器中提供的bean赋值给当前变量,也叫依赖注入 private UserMapper userMapper; @PostMapping("/hi") public Result save(@RequestBody List<User> user) { userMapper.insert1(user); return Result.success(); }发送json
[ { "name": "tom", "age": 20, "gender": "男", "bumen_id": 1 }, { "name": "jerry", "age": 22, "gender": "女", "bumen_id": 2 } ]
sql片段(代码复用)
代码复用
<?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">
<!--com.mao.mapper.UserMapper:实现接口-->
<mapper namespace="com.mao.mapper.UserMapper">
<!-- 定义重复利用的sql语句 -->
<sql id="select1">
select id,name,age,bumen_id from user1
</sql>
<select id="findByName" resultType="com.mao.pojo.User">
<!-- 引入重复利用的sql语句,输入对应的id值 -->
<include refid="select1"/>
<where>
<if test = "name != null">
name like '%${name}%'
</if>
<if test = "bumen_id != null">
and bumen_id = #{bumen_id}
</if>
</where>
</select>
</mapper>介绍
# Spring Boot依赖选项 Web |- Spring Web SQL |- MyBatis Framework |- MySQL DriverMyBatis的优势
数据库连接池
SpringBoot中自带数据库连接池代码,当然我们也可以自己切换数据库连接池
切换方法就是在
pom.xml中引用新的数据库连接池即可切换
接口
通过接口实现增删改查
查询
pojo文件夹中存放用于封装数据的实体类
Result.java // 自定义返回json格式
User.java // 封装数据库数据的实体类mapper
@Mapper // 会自动生成该接口的实现类对象(代理对象),交给IOC容器管理
public interface UserMapper {
@Select("select * from user1")
public List<User> list();
}controller
@Autowired
private UserMapper userMapper;
@GetMapping("/hi")
public Result hi() {
log.info("数据查询");
List<User> userList = userMapper.list();
return Result.success(userList);
}删除
pojo文件夹中存放用于封装数据的实体类
Result.java // 自定义返回json格式
User.java // 封装数据库数据的实体类mapper
@Mapper // 会自动生成该接口的实现类对象(代理对象),交给IOC容器管理
public interface UserMapper {
@Delete("delete from user1 where id = #{id}")
public void delete(Integer id);
}controller
@Autowired
private UserMapper userMapper;
@DeleteMapping("/hi/{id}")
public Result delete(@PathVariable Integer id) {
log.info("删除数据");
userMapper.delete(id);
return Result.success("删除成功: " + id);
}更新和添加操作类似,参考 动态语句(增删改查)
分页查询
分页查询插件推荐:PageHelper,需要在maven中引入
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.4.7</version>
</dependency>前端访问类:com/mao/controller/UserUrl.java
@Slf4j
@RestController
public class UserUrl {
@Autowired
private UserService userService;
@GetMapping("/page")
public Result page(@RequestParam(defaultValue = "1") Integer page,
@RequestParam(defaultValue = "10") Integer pageSize) {
log.info("分页查询");
// page:页数;pageSize:每页显示多少条数据
PageBean pageBean = userService.page(page, pageSize);
return Result.success(pageBean);
}
}分页查询封装类:com/mao/pojo/PageBean.java
/*
* 分页查询结果的封装类
* */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class PageBean {
// 数据库总数据数
private long page;
// 当前页数据列表
private List<User> rows;
}分页查询服务接口:com/mao/service/UserService.java
public interface UserService {
PageBean page(Integer page, Integer pageSize);
}分页查询服务类:com/mao/service/impl/UserServiceImpl.java
@Service
public class UserServiceImpl implements com.mao.service.UserService {
@Autowired
private UserMapper userMapper;
@Override
public PageBean page(Integer page, Integer pageSize) {
// 方法一
// 查询数据总数
Long count = userMapper.count();
// 每页第一项的索引值 1页 -> 0, 2页 -> 10
Integer start = (page - 1) * pageSize;
// 将每页的查询结果传到List中
List<User> userList = userMapper.page(start, pageSize);
// 将数据总数和每页的数据传到 PageBean类中
PageBean pageBean = new PageBean(count, userList);
// 方法二
// PageHelper写法:
// 页码,以及每页展示的信息数量
PageHelper.startPage(page, pageSize);
// 查询数据库中的所有数据
List<User> list = userMapper.count1();
Page<User> p = (Page<User>) list;
// p.getTotal()数据总数量,p.getResult()返回查询数据()
PageBean pageBean = new PageBean(p.getTotal(), p.getResult());
return pageBean;
}
}MyBatis:com/mao/mapper/UserMapper.java
// 方法一
// 查询数据数量
@Select("select count(*) from user1")
public Long count();
// 分页查询
@Select("select * from user1 limit #{page}, #{pageSize}")
public List<User> page(@Param("page") Integer page,
@Param("pageSize") Integer pageSize);
// 方法二
// PageHelper写法
@Select("select * from user1")
public List<User> count1();条件分页查询
前端访问类:com/mao/controller/UserUrl.java
@Slf4j
@RestController
public class UserUrl {
@Autowired
private UserService userService;
@GetMapping("/page")
public Result page(@RequestParam(defaultValue = "1") Integer page,
@RequestParam(defaultValue = "5") Integer pageSize,
String name, Short age, Character gender, Short bumen_id) {
log.info("分页查询: {} {} {} {}", name, age, gender, bumen_id);
PageBean pageBean = userService.page(page, pageSize, name, age, gender, bumen_id);
return Result.success(pageBean);
}
}分页查询封装类:com/mao/pojo/PageBean.java
/*
* 分页查询结果的封装类
* */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class PageBean {
// 数据库总数据数
private long page;
// 当前页数据列表
private List<User> rows;
}分页查询服务接口:com/mao/service/UserService.java
public interface UserService {
PageBean page(Integer page, Integer pageSize,
String name, Short age, Character gender, Short bumen_id);
}分页查询服务类:com/mao/service/impl/UserServiceImpl.java
@Service
public class UserServiceImpl implements com.mao.service.UserService {
@Autowired
private UserMapper userMapper;
@Override
public PageBean page(Integer page, Integer pageSize,
String name, Short age, Character gender, Short bumen_id) {
// 页码,以及每页展示的信息数量
PageHelper.startPage(page, pageSize);
// 查询数据库中的所有数据
List<User> list = userMapper.count1(name, age, gender, bumen_id);
Page<User> p = (Page<User>) list;
// p.getTotal()数据总数量,p.getResult()返回查询数据()
PageBean pageBean = new PageBean(p.getTotal(), p.getResult());
return pageBean;
}
}MyBatis:com/mao/mapper/UserMapper.java
public List<User> count1(@Param("name") String name, @Param("age") Short age,
@Param("gender") Character gender, @Param("bumen_id") Short bumen_id);MyBatis映射文件:src/main/resources/com/mao/mapper/UserMapper.xml
<select id="count1" resultType="com.mao.pojo.User">
select *
from user1
<where>
<if test="name != null and name != ''">
name like concat('%',#{name},'%')
</if>
<if test="age != null">
and age = #{age}
</if>
<if test="gender != null">
and gender = #{gender}
</if>
<if test="bumen_id != null">
and bumen_id = #{bumen_id}
</if>
</where>
</select>上传文件
SpringBoot默认单个上传文件大小限制为1M
修改文件上传大小限制设置
# 配置application.properties文件
# 单个文件最大上传大小
spring.servlet.multipart.max-file-size=10MB
# 单个请求最大上传大小(一个请求可以上传多个文件)
spring.servlet.multipart.max-request-size=100MBsrc/main/resources/static/index.html
// 这是一个以 POST 方法、multipart/form-data 编码格式
// 向 /update123 接口提交数据(支持文件上传)的 HTML 表单
<form action="/update123" method="post" enctype="multipart/form-data">
姓名:<input type="text" name="username"><br>
文件:<input type="file" name="file"><br>
<input type="submit" value="提交">
</form>src/main/java/com/mao/controller/UserUrl.java
@PostMapping("/update123")
// 接收文件的参数名要和input标签中的name名保持一致,不一样的可以可以使用别名
// MultipartFile接收文件
public Result file(String username, MultipartFile file) throws IOException {
log.info("上传文件:{} {}", username, file);
// 获取上传文件的原始名称
String fileName = file.getOriginalFilename();
// 获取文件后缀
int i = fileName.lastIndexOf(".");
String houzui = fileName.substring(i);
// uuid
String newFile = UUID.randomUUID().toString().replace("-", "") + houzui;
file.transferTo(new File("D:\\book\\" + newFile));
return Result.success();
}配置文件
二选一
配置一:src/main/resources/application.properties
ceshi=测试配置文件// 调用配置文件中的信息
@Value("${ceshi}")
String ceshi;
@RequestMapping("/ceshi")
public String ceshi() {
return ceshi;
}
// 访问:http://localhost:8080/ceshi
// 浏览器显示:测试配置文件配置二:src/main/resources/application.yml(名称必须交application.yml)

server:
port: 9000
# Map集合
user:
name: zhangsan
age: 20
# List/Set集合
list1:
-java
-Steam
-c++@Value
@Value("${server.port}")
String ceshi;
@RequestMapping("/ceshi")
public String ceshi() {
return ceshi;
}
// 显示 9000@ConfigurationProperties
ceshi:
hi1: 测试配置文件1
hi2: 测试配置文件2@Data
@Component
// yml文件中的ceshi(hi1和hi2共同拥有的)
@ConfigurationProperties(prefix = "ceshi")
public class YmlFile {
// 属性名要和yml中的名字保持一致
private String hi1;
private String hi2;
}@Autowired
private YmlFile ymlFile;
@RequestMapping("/ceshi")
public String ceshi() {
String ce = ymlFile.getHi1();
return ce;
}
// 显示 测试配置文件1用 @EnableConfigurationProperties + @ConfigurationProperties(推荐):
绝大多数 Spring Boot 场景(如自定义 starter、配置绑定),语义清晰、适配 Spring Boot 的配置体系,支持配置校验、属性转换等高级特性。
例:@EnableConfigurationProperties(YmlFile.class) + @ConfigurationProperties(prefix = "ceshi")
转换格式
properties --转--> yml
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# 要连接的数据库
spring.datasource.url=jdbc:mysql://localhost:3306/sql01spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/sql01

