Spring Boot:现代化Java应用开发的艺术

目录

什么是Spring Boot?

为什么选择Spring Boot?

Spring Boot的核心概念

详细步骤:创建一个Spring Boot应用

步骤1:使用Spring Initializr创建项目

步骤2:解压并导入项目

步骤3:构建和配置项目

pom.xml(Maven项目)

application.yml(配置文件)

步骤4:创建实体和仓库

User.java(实体类)

步骤5:创建映射方法

   Mapper,BaseMapper

步骤6:创建服务类

UserService.java(服务类)

步骤7:创建映射文件

    EmpDaoMapperInfo.xml

步骤8:创建控制类

   Controller

步骤9:运行应用

步骤10:测试应用

总结


1.什么是Spring Boot?

Spring Boot是Pivotal团队(现为VMware的一部分)提供的一套快速开发Spring应用的脚手架。它基于Spring框架,通过提供一系列的“Starters”和自动配置,简化了Spring应用的初始搭建和开发过程。Spring Boot的目标是让你尽可能快地运行和部署Spring应用。

2.为什么选择Spring Boot?

  1. 快速开发:Spring Boot提供了快速构建和部署Spring应用的能力。
  2. 开箱即用:内嵌了Tomcat、Jetty等服务器,无需部署WAR文件。
  3. 自动配置:根据添加的依赖自动配置Spring应用,减少手动配置。
  4. 无代码生成:不需要生成额外的XML或Java配置代码。
  5. 生产就绪:提供了监控和管理应用的工具,如指标、健康检查等。

3.Spring Boot的核心概念

  1. Spring Boot Starter:提供项目所需的依赖集合,简化依赖管理。
  2. Spring Boot Auto-Configuration:自动配置Spring和第三方库,无需手动配置。
  3. Spring Boot Actuator:提供应用监控和管理的端点。
  4. Spring Boot CLI:命令行工具,用于快速开发和测试Spring应用。
  5. Spring Initializr:在线工具,用于快速生成Spring Boot项目结构。

4.详细步骤:创建一个Spring Boot应用

步骤1:使用Spring Initializr创建项目

访问Spring Initializr,选择以下选项:

  • Project: Maven Project 或 Gradle Project
  • Language: Java
  • Spring Boot版本:选择最新的稳定版本
  • Group: com.example
  • Artifact: demo
  • Dependencies: Spring Web, Spring Data JPA, H2 Database

点击“Generate”按钮,下载生成的项目压缩包。

步骤2:解压并导入项目

将下载的压缩包解压,并使用IDE(如IntelliJ IDEA或Eclipse)导入项目。

步骤3:构建和配置项目

pom.xml(Maven项目)

确保pom.xml文件中包含了以下依赖:

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--spring-mybatis整合包--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.1.3</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.10</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies>
application.yml(配置文件)

src/main/resources目录下,编辑application.properties文件,添加数据库配置:

#DB Configuration:
spring:#连接池配置datasource:type: com.alibaba.druid.pool.DruidDataSourcedruid:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/schoolbase?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghaiusername: rootpassword: 123456initial-size: 1                     #连接池初始大小max-active: 20                      #连接池中最大的活跃连接数min-idle: 1                         #连接池中最小的活跃连接数max-wait: 60000                     #配置获取连接等待超时的时间pool-prepared-statements: true    #打开PSCache,并且指定每个连接上PSCache的大小max-pool-prepared-statement-per-connection-size: 20validation-query: SELECT 1 FROM DUALvalidation-query-timeout: 30000test-on-borrow: false             #是否在获得连接后检测其可用性test-on-return: false             #是否在连接放回连接池后检测其可用性test-while-idle: true             #是否在连接空闲一段时间后检测其可用性#mybatis配置
mybatis:mapper-locations: classpath:mapper/*MapperInfo.xmltype-aliases-package: com.fs.pojoconfiguration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

步骤4:创建实体和仓库

User.java(实体类)
package com.fs.pojo;import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import org.springframework.format.annotation.DateTimeFormat;import java.util.Date;@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Emp {private Integer empno;private String ename;private String pass;private String job;private Integer deptno;private Integer mgr;@DateTimeFormat(pattern = "yyyy-MM-dd") //提交请求的日期转换@JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") //响应json转换private Date hiredate;private Double sal;
}

步骤5:创建映射方法

   Mapper,BaseMapper

这是基础映射接口:

package com.fs.mapper;import java.io.Serializable;
import java.util.List;//基础映射接口,公共的方法public interface BaseMapper<T> {/*** 插入一条记录* @param entity* 实体对象* @return int*/Integer insert(T entity) throws  Exception;/*** 根据 ID 修改* @param entity* 实体对象* @return int*/Integer update(T entity)throws  Exception;/*** 根据 ID 删除* @param id* 主键ID* @return int*/Integer deleteById(Serializable id) throws  Exception;/*** 根据 ID 查询* @param id* 主键ID* @return T*/T selectById(Serializable id) throws  Exception;/*** 查询所有* @return List<T>*/List<T> selectAll() throws  Exception;}

这是自己的Mapper直接继承BaseMapper,再写一些额外的方法

package com.fs.mapper;import com.fs.pojo.Emp;
import com.fs.vo.Condition;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;import java.util.List;@Repository
@Mapper  //接口实现映射代理
public interface EmployeeMapper extends BaseMapper<Emp>{/*** 登录功能* @param employeeModel 密码 用户名* @return 用户对象*/Emp login(Emp employeeModel);/*** 根据条件查询* @param condition 条件对象* @return 结果集合*/List<Emp> selectByCondition(Condition condition);}

步骤6:创建服务类

UserService.java(服务类)

服务类接口:

package com.fs.service;import com.fs.pojo.Emp;
import com.fs.vo.Condition;import java.util.List;public interface EmpService {int addEmp(Emp employeeModel) throws Exception;//int updateEmp(EmployeeModel employeeModel) throws Exception;int delete(int empno) throws Exception;List<Emp> queryEmps() throws Exception;Emp login(Emp employeeModel);//条件查询List<Emp> queryByCondition(Condition condition);
}

实现类:

package com.fs.service.impl;import com.fs.mapper.EmployeeMapper;
import com.fs.pojo.Emp;
import com.fs.service.EmpService;
import com.fs.vo.Condition;
import org.springframework.stereotype.Service;import javax.annotation.Resource;
import java.util.List;@Service
public class EmpServiceImpl implements EmpService {//注入映射代理@Resourceprivate EmployeeMapper employeeMapper;@Overridepublic int addEmp(Emp employeeModel) throws Exception {return employeeMapper.insert(employeeModel);}@Overridepublic int delete(int empno) throws Exception {return employeeMapper.deleteById(empno);}@Overridepublic List<Emp> queryEmps() throws Exception {return employeeMapper.selectAll();}@Overridepublic Emp login(Emp employeeModel) {return employeeMapper.login(employeeModel);}@Overridepublic List<Emp> queryByCondition(Condition condition) {return employeeMapper.selectByCondition(condition);}
}

步骤7:创建映射文件

    EmpDaoMapperInfo.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.fs.mapper.EmployeeMapper"><select id="selectAll" resultMap="empmap">select * from emp</select><select id="login" parameterType="Emp" resultMap="empmap">select * from emp whereename=#{ename} and pass=#{pass}</select><delete id="deleteById" parameterType="int">delete from emp where empno = #{empno}</delete><select id="selectById" parameterType="java.lang.Integer" resultMap="empmap">select * from emp where empno=#{no}</select><insert id="insert" parameterType="Emp">insert into emp (empno,ename,job,sal,pass,hiredate)values (#{empno},#{ename},#{job},#{sal},#{pass},#{hiredate})</insert><select id="selectByCondition" parameterType="com.fs.vo.Condition"resultMap="empmap">select * from emp</select><resultMap id="empmap" type="Emp"><id column="empno" property="empno"></id><result column="ename" property="ename"></result><result column="job" property="job"></result><result column="sal" property="sal"></result><result column="pass" property="pass"></result><result column="hiredate" property="hiredate"></result></resultMap></mapper>

步骤8:创建控制类

   Controller
package com.fs.controller;import com.fs.pojo.Dept;
import com.fs.pojo.Emp;
import com.fs.service.DeptService;
import com.fs.service.EmpService;
import com.fs.vo.CommonResultVo;
import com.fs.vo.Condition;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;@RestController
//@RequestMapping("/emp")
public class EmyController {@Resourceprivate EmpService empService;@Resourceprivate DeptService deptService;@RequestMapping("/test")public String empTest(){return "test";}@PostMapping("/add")public Map add(Emp employeeModel) throws Exception {int i = empService.addEmp(employeeModel);Map map = new HashMap();map.put("code",200);map.put("msg","插入成功");//转换成json对象return map;}@RequestMapping("/query")public Map queryAll() throws Exception {//查询所有数据List<Emp> employeeModels = empService.queryEmps();Map map = new HashMap();map.put("code",200);map.put("msg","查询成功");map.put("data",employeeModels);map.put("totals",employeeModels.size());return map;}@RequestMapping("/querybyconition")public CommonResultVo<Emp> queryByCondition(Condition condition){List<Emp> employeeModels = empService.queryByCondition(condition);//返回统一的公共响应类型对象CommonResultVo<Emp> commonResultVo = new CommonResultVo();commonResultVo.setCode(200);commonResultVo.setMsg("多条件查询成功");commonResultVo.setList(employeeModels);commonResultVo.setTotal(employeeModels.size());return commonResultVo;}//@RequestMapping("/login")@PostMapping("/login")public CommonResultVo login(Emp employeeModel){Emp employee = empService.login(employeeModel);CommonResultVo commonResultVo = new CommonResultVo();if (employee!= null) {commonResultVo.setCode(200);commonResultVo.setMsg("登录成功");commonResultVo.setData(employee);}else{commonResultVo.setCode(500);commonResultVo.setMsg("登录失败");}return commonResultVo;}@RequestMapping("/queryDept")public CommonResultVo getAllDept() throws Exception {List<Dept> depts = deptService.queryAll();CommonResultVo commonResultVo = new CommonResultVo();commonResultVo.setCode(200);commonResultVo.setMsg("部门查询成功");commonResultVo.setList(depts);return  commonResultVo;}}
温馨提示:当然你还可以写一些前端页面用于展示

步骤9:运行应用

运行主应用类DemoApplication,应用将启动并监听默认的8080端口。

步骤10:测试应用

使用Postman或任何HTTP客户端工具,发送请求到http://localhost:8080/users来测试你的应用。

  • GET /users:获取所有用户列表。
  • POST /users:创建一个新用户。

5.总结

Spring Boot通过提供一系列的Starters、自动配置和简化的部署流程,极大地提高了Java应用的开发效率。通过上述步骤,你可以快速搭建一个具有RESTful API的Spring Boot应用,并使用Spring Data JPA进行数据持久化。Spring Boot的这些特性使得它成为现代Java应用开发的不二选择。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/54085.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python实战实例:素数回文数的个数

题目描述 求 11 到 n 之间&#xff08;包括 n&#xff09;&#xff0c;既是素数又是回文数的整数有多少个。 输入格式 一个大于 11小于 10000。 输出格式 11 到 n之间的素数回文数个数。 输入输出样例 输入 # 23 输出 # 1 说明/提示 回文数指左右对称的数&#xff…

高德地图2.0 绘制、编辑多边形覆盖物(电子围栏)

1. 安装 npm i amap/amap-jsapi-loader --save移步&#xff1a;官方文档 2. map组件封装 <script lang"ts" setup> import AMapLoader from amap/amap-jsapi-loader import { onMounted, ref } from vue import { propTypes } from /utils/propTypesdefineO…

企业CAD图纸防泄密措施有哪些?10个真实有效方法分享

在工程设计领域&#xff0c;CAD图纸作为核心设计资料&#xff0c;其安全性至关重要。为了确保CAD图纸在存储、传输和使用过程中的机密性&#xff0c;企业需采取多种加密方法。以下介绍十种常用的CAD图纸加密方法&#xff0c;帮助企业有效保护其知识产权。 1.安秉网盾图纸加密 …

venn可视化

文章目录 前言一、数据准备二、可视化1.二维2.三维 3.数据保存总结 前言 韦恩图&#xff08;Venn diagram&#xff09;是一种用于可视化集合之间关系的图形工具。它是由英国逻辑学家约翰韦恩于1880年引入的。 韦恩图由一组圆和它们的交集区域组成。每个圆代表一个集合&#x…

LIMS实验室管理系统的特点

LIMS实验室管理系统在实验室管理中发挥着不可或缺的作用。首要特点是其强大的自动化数据管理功能&#xff0c;该系统能够无缝集成实验室从样品接收到测试结果录入与存储的全过程&#xff0c;显著提升了数据的准确性和可靠性&#xff0c;减少了人为错误的可能性。 流程优化是LI…

Mac笔记本上查看/user/目录下的文件的几种方法

在Mac笔记本上查看/user/下的文件&#xff0c;可以通过多种方法实现。以下是一些常见的方法&#xff1a; 一、使用Finder 打开Finder&#xff1a;点击Dock栏中的Finder图标&#xff0c;或者使用快捷键Command F。 导航到用户目录&#xff1a; 在Finder的菜单栏中&#xff0…

简单了解微服务--黑马(在更)

认识微服务 单体架构 不适合大型复杂项目 微服务架构 将单体结构的各个功能模块拆分为多个独立的项目 拆取的独立项目分别开发&#xff0c;在部署的时候也要分别去编译打包&#xff0c;分别去部署&#xff0c;不同的模块部署在不同的服务器上&#xff0c;对外提供不同的功能…

9月14日,每日信息差

第一、苹果已预订台积电 3 纳米制程并传闻将包下 2 纳米及后续 A16 首批产能&#xff0c;预计 2 纳米技术最快将在明年的 iPhone 17 Pro 中使用。台积电和苹果对于这些市场传闻均未予以证实。 第二、中国科学家利用 「爱因斯坦探针」 空间 X 射线天文台&#xff0c;首次从太空…

2024ICPC网络赛1: C. Permutation Counting 4

题意&#xff1a; 给定 n n n个区间 [ L i , R i ] [L_i,R_i] [Li​,Ri​]设集合 A { { p i } ∣ p i 为排列&#xff0c; L i < p i < R i } A\{ \{ p_i\} | p_i为排列&#xff0c;Li<p_i<R_i\} A{{pi​}∣pi​为排列&#xff0c;Li<pi​<Ri​}&#xff…

MySQL底层为什么选择用B+树作为索引

首先&#xff0c;我们来想想为什么这么多数据结构&#xff0c;为什么要用树这种数据结构&#xff1f; 众多的数据结构在逻辑层面可分为&#xff1a;线性结构 和 非线性结构。 线性结构有&#xff1a;数组、链表&#xff0c;基于它们衍生出的有哈希表&#xff08;哈希表也称散…

[网络]从零开始的计算机网络基础知识讲解

一、本次教程的目的 本次教程我只会带大叫了解网络的基础知识&#xff0c;了解网络请求的基本原理&#xff0c;为后面文章中可能会用到网络知识做铺垫。本次我们只会接触到网络相关的应用层&#xff0c;并不涉及协议的具体实现和数据转发的规则。也就是说&#xff0c;这篇教程是…

Windows11:解决近期更新补丁后无法上网的问题

点击开始菜单&#xff0c;打开设置&#xff0c;点击Windows更新&#xff0c;点击更新历史记录&#xff0c;点击“卸载更新“&#xff0c;找到这个补丁更新卸载即可。

【Linux】网络层协议——IP

一、IP协议 在前面&#xff0c;我们学习了应用层和传输层&#xff0c;接下来&#xff0c;我们来学习网络层&#xff0c;网络层的主要功能是在复杂的网络环境中确定一个合适的路由。 1.1 IP协议的基本概念 主机&#xff1a;配有IP地址&#xff0c;有可以进行路由控制的设备路由…

基于flask做大模型SSE输出

默认情况下&#xff0c;Fask以多线程模式运行&#xff0c;每个请求都落在一个新线程上。 SSE&#xff1a;基于HTTP的协议&#xff0c;用于实现服务器向客户端推送实时数据。使用长轮询机制&#xff0c;客户端通过HTTP连接向服务器发送请求&#xff0c;并保持该连接打开&#x…

香港电讯SASE解决方案:终端与云端的安全护航

现代工作模式存在网络安全隐忧 随着远程办公模式的普及&#xff0c;越来越多员工使用各种个人终端设备&#xff0c;如台式电脑、笔记本电脑、智能手机、平板电脑等进行协作办公。然而&#xff0c;由于IT人才短缺和员工隐私等因素&#xff0c;许多企业无法统一管理端点设备的安…

【自动驾驶】决策规划算法(一)决策规划仿真平台搭建 | Matlab + Prescan + Carsim 联合仿真基本操作

写在前面&#xff1a; &#x1f31f; 欢迎光临 清流君 的博客小天地&#xff0c;这里是我分享技术与心得的温馨角落。&#x1f4dd; 个人主页&#xff1a;清流君_CSDN博客&#xff0c;期待与您一同探索 移动机器人 领域的无限可能。 &#x1f50d; 本文系 清流君 原创之作&…

FewShotChatMessagePromptTemplate 和 FewShotPromptTemplate区别

FewShotChatMessagePromptTemplate 和 FewShotPromptTemplate 都是 LangChain 框架中用于少样本学习的提示模板&#xff08;Prompt Template&#xff09;&#xff0c;但它们在设计和用途上存在一些区别。 FewShotChatMessagePromptTemplate 用途&#xff1a;主要用于聊天场景…

开源免费的工贸一体行业ERP管理系统

引言 在当今数字化浪潮汹涌澎湃的时代&#xff0c;中小企业面临着前所未有的挑战与机遇。如何实现数字化转型发展&#xff0c;成为了众多中小企业主心头的大事。 据相关数据显示&#xff0c;目前我国中小企业数量已经超过了 4000 万户&#xff0c;然而成功实现数字化转型的比例…

『功能项目』按G键持续显示对话内容【61】

本章项目成果展示 我们打开上一篇60靠近Npc显示可对话标识的项目&#xff0c; 本章要做的事情是当靠近Npc按G键显示内容后&#xff0c;再按G键实现两个人的对话显示功能 首先将以下资源图片放进Art文件夹中并设置为精灵模式 在桌面上创建一个文本 讲一下对话内容复制到文本中 …

k8s(kubernetes)的PV / PVC / StorageClass(理论+实践)

NFS总是不支持PVC扩容 先来个一句话总结&#xff1a;PV、PVC是K8S用来做存储管理的资源对象&#xff0c;它们让存储资源的使用变得可控&#xff0c;从而保障系统的稳定性、可靠性。StorageClass则是为了减少人工的工作量而去自动化创建PV的组件。所有Pod使用存储只有一个原则&…