Spring Boot学习随笔-SpringBoot的引言,回顾传统SSM开发

news/2025/2/14 6:21:02/

学习视频:【编程不良人】2021年SpringBoot最新最全教程

第一章、传统SSM开发回顾以及问题

Spring + SpringMVC + Mybatis SSM 实现一个简单功能 员工添加、查询…

SSM项目简单实现

  • 项目

    需求分析 —>概要设计 —>(库表设计) —> 详细设计 —>(验证库表正确性) —> 编码(环境搭建+业务代码)—>测试 —>部署上线

    这是一般整个项目的开发步骤,但是我们选择简单项目实现

  • 功能:员工添加、查询所有

    选择mysql数据库,库:ssm,表:emp,字段:id name birthday salary

  • 编码

    sql建库建表

    create DATABASE ssm;
    use ssm;
    create TABLE emp(
    id int(11) auto_increment PRIMARY KEY,
    name VARCHAR(40),
    birthday TIMESTAMP,
    salary DOUBLE
    )
    

    环境搭建 引入依赖

    <dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope></dependency><!--spring--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.6</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId><version>5.3.6</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>5.3.6</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.3.6</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>5.3.6</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>5.3.6</version></dependency><!--springmvc--><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.3.6</version></dependency><!--mybatis--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.9</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>3.0.0</version></dependency><!--mysql--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.47</version></dependency><!--druid--><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.19</version></dependency><!--aspect--><dependency><groupId>org.aspectj</groupId><artifactId>aspectjrt</artifactId><version>1.8.8</version></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.8.3</version></dependency><!--jackson 转换json--><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.14.2</version></dependency>
    </dependencies>
    

    spring.xml

    <!--开启注解扫描-->
    <context:component-scan base-package="com.baizhi.service"/>
    <!--创建数据源-->
    <bean class="com.alibaba.druid.pool.DruidDataSource" id="dataSource"><property name="driverClassName" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/ssm?characterEncoding=UTF-8"/><property name="username" value="root"/><property name="password" value="123456"/>
    </bean>
    <!--创建sqlSessionFactory-->
    <bean class="org.mybatis.spring.SqlSessionFactoryBean" id="sqlSessionFactory"><property name="dataSource" ref="dataSource"/><property name="mapperLocations" value="classpath:com.baizhi.mapper/*.xml"/><property name="typeAliasesPackage" value="com.baizhi.entity"/>
    </bean>
    <!--创建DAO-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/><property name="basePackage" value="com.baizhi.dao"/>
    </bean>
    <!--创建事务管理器-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/>
    </bean>
    <!--开启注解事务生效-->
    <tx:annotation-driven/>
    

    Mapper配置文件

    <!--useGeneratedKeys:开启自动生成主键,keyProperty:让该字段自动生成主键; 该功能仅MySQL支持-->
    <insert id="save" parameterType="Emp" useGeneratedKeys="true" keyProperty="id">INSERT into emp values(#{id},#{name},#{birthday},#{salary})
    </insert>
    <select id="findAll" resultType="com.baizhi.entity.Emp">select id,name,birthday,salary from emp
    </select>
    
    @Service
    @Transactionalpublic class EmpServiceImpl implements EmpService {private final EmpDAO empDAO;@Autowiredpublic EmpServiceImpl(EmpDAO empDAO) {this.empDAO = empDAO;}@Overridepublic void save(Emp emp) {empDAO.save(emp);}@Overridepublic List<Emp> findAll() {return empDAO.findAll();}
    }
    

    一步一步来,先测试Spring+Mybatis:

    public class TestEmpServiceImpl {public static void main(String[] args) {//1.运行工厂ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");//2.工厂中获取对象EmpService empService = (EmpService) context.getBean("empServiceImpl");empService.save(new Emp(null, "小米", new Date(), 44.564));//3.调用方法empService.findAll().forEach(emp -> System.out.println(emp));}
    }
    

    可以正常执行,进入下一步mvc的整合,springmvc.xml

    <!--开启注解扫描-->
    <context:component-scan base-package="com.baizhi.controller"/>
    <!--开启mvc注解驱动-->
    <mvc:annotation-driven/>
    <!--配置视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/"/><property name="suffix" value=".jsp"/>
    </bean>
    

    web.xml

    <!-- 加载spring.xml-->
    <context-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring.xml</param-value>
    </context-param>
    <!--配置spring工厂启动-->
    <listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener><!--配置springmvc-->
    <servlet><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:springmvc.xml</param-value></init-param>
    </servlet>
    <servlet-mapping><servlet-name>springmvc</servlet-name><url-pattern>/</url-pattern>
    </servlet-mapping>
    

    控制器

    @RestController //代表类中返回值转为json响应到浏览器
    public class EmpController {private final EmpService empService;@Autowiredpublic EmpController(EmpService empService) {this.empService = empService;}//保存@RequestMapping("save")public void save(Emp emp) {empService.save(emp);}//查询所有@RequestMapping("findAll")public List<Emp> findAll() {return empService.findAll();}
    }
    

    测试结果,可以正常添加和查询所有

现有SSM开发存在问题

  1. 配置繁琐:SSM框架需要进行大量的配置,包括XML配置文件、注解配置、依赖注入等。这些配置可能会变得繁琐,以及maven配置的冗余代码。
  2. 版本兼容性:maven引入的库,他们的版本必须一致,否则产生版本不兼容的问题

第二章、Spring Boot的引言

2.1 Spring Boot是什么

Spring Boot是由Pivotal团队提供的一套开源框架,Spring Boot的目标是让开发者更多地关注业务特性。它通过自动配置来简化开发流程,例如,当检测到Spring MVC在类路径上时,Spring Boot会自动添加必要的bean,该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。

Spring Boot 作用:简化Spring应用初始搭建和开发过程

如何简化:开发使用SpringBoot只要基于特定方式进行配置,就可以简化Spring使用

SpringBoot 微框架:5分钟完成之前ssm中的项目搭建,大大提高开发效率

SpringBoot (微框架)= SpringMVC(控制器) + Spring core(项目管理)

2.2 Spring Boot的优势

  1. 创建完整独立的Spring应用程序 ,只有一个容器;父子容器间的问题不存在。
  2. 嵌入的Tomcat,无需部署WAR文件 应用跑在内嵌服务器
  3. 简化Maven配置,自动配置Spring,没有XML配置

2.3 Spring Boot的约定

  • SpringBoot遵循“约定优于配置”的原则,提供了一些默认的约定必须遵守,以简化项目的配置和开发流程:
    1. 入口类:Spring Boot 项目必须设置入口类,通常位于项目的根目录下,命名为 ApplicationMain,并且使用 @SpringBootApplication 注解进行标记。
    2. 配置文件:Spring Boot 必须在项目根目录存在一个名为application.propertiesapplication.yml的配置文件。这些配置文件通常位于 src/main/resources 目录下。
    3. 项目结构:Spring Boot 项目通常采用标准的 Maven 或 Gradle 项目结构,主要包括 src 目录、main 目录和 test 目录。主要的 Java 代码文件通常位于 src/main/java 目录下,资源文件位于 src/main/resources 目录下。

下一章:Spring Boot学习随笔-第一个SpringBoot项目快速启动(org.springframework.boot、@SpringBootApplication、application.yml)


http://www.ppmy.cn/news/1264287.html

相关文章

【FPGA】Verilog:计数器 | 异步计数器 | 同步计数器 | 2位二进制计数器的实现 | 4位十进制计数器的实现

目录 Ⅰ. 实践说明 0x00 计数器(Counter) 0x01 异步计数器(Asynchronous Counter)

Redis中持久化策略RDB与AOF优缺点对比

Redis持久化策略对比 RDBAOF持久化方式定时对整个内存做快照记录每一次执行的命令数据完整性不完整,两次备份之间存在丢失相对完整,取决于刷盘策略文件大小会有压缩,文件体积小记录命令,文件体积较大宕机恢复速度很快慢数据恢复优先级低,数据完整性不如AOF高,记录了执行命令数据…

python pyaudio显示音频波形图

python pyaudio显示音频波形图 代码如下&#xff1a; import numpy as np import matplotlib.pylab as plb import wave# 读取 wav wf wave.open("./output.wav", "rb")# 获取音频相关参数&#xff1a;声道数、量化位数、采样频率、采样帧数 nchannels,…

TCP对数据的拆分

应用程序的数据一般都比较大&#xff0c;因此TCP会按照网络包的大小对数据进行拆分。 当发送缓冲区中的数据超过MSS的长度&#xff0c;数据会被以MSS长度为单位进行拆分&#xff0c;拆分出来的数据块被放进单独的网路包中。 根据发送缓冲区中的数据拆分情况&#xff0c;当判断…

(C)一些题11

1. #include<stdio.h> #include<string.h> void main() { char *s1"ABCDEF"&#xff0c;*s2"aB"&#xff1b; s1; s2; puts(s1)&#xff1b; puts(s2)&#xff1b; printf("%d\n",strcmp(s1,s2))&#xff1b; } 答案&#xff1…

OpenGL ES eglCreatePbufferSurface() 和 eglCreateWindowSurface() 的对比和使用

一、介绍 相同点&#xff1a; eglCreatePbufferSurface 和 eglCreateWindowSurface 都是 OpenGL ES 中用于创建不同类型的EGL表面的函数&#xff0c;以便在OpenGL ES中进行渲染。 不同点&#xff1a; 选择使用哪种表面类型取决于你的需求。如果你只是需要在内存中进行离屏渲…

Linux:进程优先级与命令行参数

目录 1.进程优先级 1.1 基本概念 1.2 查看系统进程 1.3 修改进程优先级的命令 2.进程间切换 2.1 相关概念 2.2 Linux2.6内核进程调度队列&#xff08;了解即可&#xff09; 3.命令行参数 1.进程优先级 1.1 基本概念 cpu资源分配的先后顺序&#xff0c;就是指进程的优…

C++ 面向对象补充

目录 初始化列表 explicit关键字 单参数构造函数 多参数构造函数 static成员 友元 内部类(不常用) 匿名对象 初始化列表 以一个冒号开始&#xff0c;接着是一个以逗号分隔的数据成员列表&#xff0c;每个成员变量后面跟 一个放在括号中的初始值或表达式。 class Date…