1. 传统的ssm开发
我们先来使用传统的ssm开发一个具有添加员工、查询所有的功能。
开发一个项目的基本流程
# 项目
开发一个项目的基本流程
- 需求分析 概要设计(库表设计) 详细设计(验证库表正确性) 编码(环境搭建+业务代码) 测试 部署上线
本次开发的基本流程
# 员工添加 查询所有功能 SSM
- 库表 库: ssm 数据库:mysql 表: id name birthday salary
# 编码 环境搭建 ssm spring springmvc 一个团队开发 无缝整合
- springmvc spring mybatis
因为本次实现的是一个简单的小功能,所以很多项目开发的步骤不需要,省略了。
- 概要设计(库表设计)
- 编码(环境搭建+业务代码)
- ssm环境搭建,在pom.xml中引入相关依赖
- spring
- springmvc
- mybatis
- mysql
- druid
- mybatis-spring
- 转换json的依赖
- aop的依赖
<!--spring-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.3.6</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</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-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-jdbc</artifactId>
<version>5.3.6</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.3.6</version>
</dependency>
<!--spring web mvc-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.6</version>
</dependency>
<!--druid-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.4</version>
</dependency>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
<!--mybatis-spring-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.6</version>
</dependency>
<!-- jackson 转换json-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.3</version>
</dependency>
<!-- aspectj aop切面-->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.5</version>
</dependency>
<!--aspectj-->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.9.5</version>
</dependency>
ssm这三个框架是由spring框架作为中间桥梁,spring框架和springmvc框架是天生的无缝整合,但是和mybatis框架并不是如此,所以我们接下来要做的是先整合spring框架和mybatis框架(配置spring.xml配置文件)。
spring整合mybatis的配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
<!--开启注解扫描-->
<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="root"/>
</bean>
<!--创建sqlSessionFactory-->
<bean class="org.mybatis.spring.SqlSessionFactoryBean" name="sqlSessionFactory">
<property name="dataSource" ref="dataSource"/>
<!-- mapper配置文件的位置 -->
<property name="mapperLocations" value="classpath:com/baizhi/mapper/*.xml"/>
<!-- 实体别名 类名 类名小写-->
<property name="typeAliasesPackage" value="com.baizhi.eneity"/>
</bean>
<!--创建DAO-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
<property name="basePackage" value="com.baizhi.dao"/>
</bean>
<!--创建事务管理器-->
<bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager" id="transactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--开启注解事务生效 @Transactional-->
<tx:annotation-driven transaction-manager="transactionManager"/>
</beans>
# 小知识点
对于java包下的文件来说java包就是根目录
在java包(及子包)中下级文件用 . 比如建eneity包时 com.baizhi.eneity
对于resources包下的文件来说resources包就是根
在resources包(及子包)中下级文件用 / 比如建mapper包时 com.baizhi.mapper
下面我们需要开发实体类、DAO接口、Mapper配置文件,我们先看一下它们在项目中的位置
实体类Emp
public class Emp {
private Integer id;
private String name;
private Date birthday;
private double salary;
// 有参、无参构造、get、set、to_String这些方法都是要写的
// 为了不影响阅读,这里没有粘,但实际上是有的
}
EmpDAO接口
public interface EmpDAO {
// 保存
void save(Emp emp);
// 查询所有
List<Emp> findAll();
}
EmpMapper配置文件
<?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">
<mapper namespace="com.baizhi.dao.EmpDAO">
<!--保存-->
<insert id="save" parameterType="com.baizhi.eneity.Emp" useGeneratedKeys="true" keyProperty="id">
insert into emp values(#{id}, #{name}, #{birthday}, #{salary})
</insert>
<!--查询所有-->
<select id="findAll" resultType="com.baizhi.eneity.Emp">
select id, name, birthday, salary from emp;
</select>
</mapper>
这里其实应该测试一下,但是由于这个业务比较简单,所以我们把它和service放到一起测试。
接下来需要开发EmpService接口、EmpService接口的实现类,还要进行测试,我们先来看一下它们在项目中的位置。
EmpService接口
public interface EmpService {
// 保存
void save(Emp emp);
// 查询所有
List<Emp> findAll();
}
实现EmpService接口的实现类EmpServiceImpl
@Service
@Transactional
public class EmpServiceImpl implements EmpService{
private EmpDAO empDAO;
@Autowired
public void setEmpDAO(EmpDAO empDAO) {
this.empDAO = empDAO;
}
@Override
public void save(Emp emp) {
empDAO.save(emp);
}
@Override
public List<Emp> findAll() {
return empDAO.findAll();
}
}
测试类
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(), 23.23));
// 3. 调用方法
empService.findAll().forEach(emp -> System.out.println(emp));
}
}
mybatis和spring已经整合完了,接下来开始springmvc的整合,
springmvc的配置文件springmvc.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--开启注解扫描--> <!--子工厂,只扫描controller包即可-->
<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>
</beans>
在服务器启动的时候需要把springmvc的工厂启动起来,所以我们需要配置web.xml
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<!-- 加载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,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的映射-->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
开发控制器
@RestController // 代表类中返回值转为json响应到浏览器
public class EmpController {
private EmpService empService;
@Autowired
public void setEmpService(EmpService empService) {
this.empService = empService;
}
// 保存
@RequestMapping("save")
public void save(Emp emp){
empService.save(emp);
}
// 查询所有
@RequestMapping("findAll")
List<Emp> findAll(){
return empService.findAll();
}
}
2. 现有SSM开发存在问题
- 大量maven冗余配置
- 每次构建项目都要书写大量相同配置极大浪费了项目开发时间
- 每次整合第三方技术都需要编写相关配置文件
- 项目测试每次都需要部署到tomcat
注意:这就是早期的SSM或者SSH开发存在问题,是不是很麻烦☹️☹️☹️
3. SpringBoot的引言
SpringBoot是由Pivotal团队提供的全新框架,其设计的目的是用来简化Spring应用的 初始搭建以及开发过程。该框架使用了特定的方式进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,SpringBoot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者。
SpringBoot 全新框架 作用:简化Spring应用初始搭建和开发过程。
如何简化:开发人员使用SpringBoot只要基于特定方式进行配置 简化spring使用
SpringBoot 微框架:5分钟完成之前ssm中环境搭建
springboot(微框架)= springmvc(控制器)+ spring core(项目管理)
4. SpringBoot的优势
- 创建完整的独立的Spring引用程序 springboot只有一个容器
- 从根本上避免了父子容器污染问题(传统的ssm中父、子容器不能污染,父容器:spring,子容器:springmvc,不能污染,即子容器不能扫描到父容器,父容器不能扫描到子容器)
- 嵌入的Tomcat,无需部署WAR文件 springboot内嵌tomcat 应用跑在内嵌服务器
- 简化Maven配置,自动配置Spring SpringMVC,没有XML配置 springboot中只需要引几个依赖
- 用了springboot,spring应用再无xml
5. SpringBoot的约定
-
springboot 项目中必须在src/main/resources中放入application.yml(.properties)核心配置文件 名字必须为:application
-
springboot 项目中必须在src/main/java中所有子包之外构建全局入口类型,xxApplication,入口类一个springboot项目只能有一个
6. SpringBoot环境搭建
环境要求
# 1. System Requirements
JDK 1.8+
MAVEN 3.2+
Spring Framework 5.x+
# 2. ServletContainers
Tomcat 9.0+
# 3. 开发工具
IDEA 2021版本
新建项目
在下面环境搭建过程中包结构
在pom.xml文件中引入依赖
<!--继承springboot的父项目 便于维护版本-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.0</version>
</parent>
<dependencies>
<!--引入springboot的web支持-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<!--因为引入依赖很慢,所以我们可以使用阿里云镜像,在pom.xml文件下加入下面语句-->
<repositories>
<repository>
<id>aliyun-repos</id>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>aliyun-plugin</id>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
创建application.yml配置文件
配置文件里面什么都不写就行
创建入口类
// 这个注解:修饰范围:用在类上 只能用在入口类上 只能出现一次
// 作用:标志这个类是springboot的入口类 启动整个springboot项目的总入口
@SpringBootApplication
public class SpringBootDay1Application {
public static void main(String[] args) {
// 启动springboot应用 参数1:指定入口类的类对象 .class 参数2:main函数参数
SpringApplication.run(SpringBootDay1Application.class, args);
}
}
注:到这里项目环境已经搭建成功了,仅需要5分钟
springboot搭建环境总结
- pom.xml文件引入依赖
- resources目录生成application.yml
- 创建入口类加入@SpringBootApplication注解 在main函数中启动应用
接下来我们来测试一下
开发一个Controller
@RestController
public class HelloController {
// 测试控制器 测试地址:在以前使用ssm开发时测试http://localhost:端口号/项目名/请求路径
// 但是,注意:springboot项目默认启动没有项目名 http://localhost:8080/hello
@RequestMapping("hello")
public String Hello(){
System.out.println("hello springboot......");
return "hello springboot";
}
}
注意:springboot项目默认启动没有项目名
如果想要修改内嵌服务器的端口号,则在application.xml文件中加入:
#后面的是注释
server:
port: 8081 # 修改内嵌服务器的端口号
springboot默认在访问时不需要项目名,如果想要在访问时指定项目名,则可以在application.xml文件中加入:
server:
servlet:
context-path: /springboot_day1 # 修改项目名 注意:项目名必须 "/" 开头