SpringBoot企业级开发
课程介绍
主要内容:构建SpringBoot项目、核心配置与注解、数据访问
1.第一章:Spring Boot开发入门
1.学习目标
了解Spring Boot的优点。
掌握Spring Boot的项目构建。
熟悉Spring Boot的自动化配置原理以及执行流程。
掌握Spring Boot 的单元测试和热部署。
2.Spring Boot 概述
Spring Boot是Spring家族的一个子项目,其设计初衷是为了简化Spring配置,从而可以轻松构建独立运行的程序,并极大提高开发效率。
Spring Boot是基于Spring框架开发的全新框架,其设计目的是简化Spring应用的初始化搭建和开发过程。
Spring Boot整合了许多框架和第三方库配置,几乎可以达到“开箱即用”。
Spring Boot 优点
可快速构建独立的Spring应用
直接嵌入Tomcat、Jetty服务器(无需部署WAR文件)
提供依赖启动器简化构建配置
极大程度的自动化配置Spring和第三方库
使用Springboot整合SSM开发项目
一、创建一个SprigBoot项目
1、使用maven创建springboot项目
2、在idea创建springboot项目时,选择web和myabtis等组件
创建项目成功后,直接启动,看运行日志。
遇到下面错误:
那么就在File->settings里面设置:
启动后发现报错:
Description:
Failed to configure a DataSource: ‘url’ attribute is not specified and no embedded datasource could be configured.
Reason: Failed to determine a suitable driver class
报错的原因是:添加了mybatis组件,但是没有对其进行配置数据源。
注意:如果在Idea里面无法创建SpringBoot项目,那么我们可以使用网页在线创建SpringBoot项目,然后在导入到Idea中,步骤如下:
然后把demo.Zip下载,解压,导入到Idea中,在点击Maven->reimport重新导入依赖包。这样就创建好一个springboot项目
二、配置mybatis数据源
1)在主配置application.properties文件里面进行配置
#mysql8.0+
#spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#mysql8.0一下版本
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/cdcd?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=123456
如果编译时遇到下面报错:
那么修改pom.xml文件,添加指定maven编译版本
重新启动,发现启动成功
1)写一个简单的controller进行测试
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping(“/user”)
public class UserController {
@RequestMapping(“/show”)
@ResponseBody
public String show(){
return “hello springboot”;
}
@RequestMapping(“/show_register_page”)
public String show_register_page(){
return “register”;
}
}
三、添加支持jsp
1.在pom.xml文件中添加依赖
注意:重新reimport一下
2.设置Springmvc
在主配置文件里面添加设置
#mvc设置
spring.mvc.view.prefix=/jsp/
spring.mvc.view.suffix=.jsp
3 src/main下面创建一个文件目录webapp/jsp,然后添加一个register.jsp文件
3.测试
重启后,访问测试
1)http://localhost:8081/user/show
2)http://localhost:8081/user/show_register_page
四、添加mybatis配置
1、在application.properties配置mybats
#mybatis配置
#配置实体类别名包路径
mybatis.type-aliases-package=com.example.demo.entity
配置mapper映射文件的路径
mybatis.mapper-locations=classpath:mapper/*.xml
配置后台打印日志
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
#开启驼峰映射
mybatis.configuration.map-underscore-to-camel-case=true
2、添加server、mapper和实体类
1)添加entity目录,并在里面添加一个user类
2)添加一个service目录,并在里面添加一个UserService接口,然后在添加一个impl目录,并在这个目录下面添加一个UserServiceImpl类实现UserService接口,然后写上2个方法
public User findById(int id)
public void create(User user)
3)创建一个mapper,然后添加一个UserMapper接口
注意:为了方便,我们可以在启动类上面添加一个注解@MapperScan,这样就可以不要在每个Mapper接口类上面添加@Mapper了,如下:
然后在UserServiceImpl调用UserMapper接口方法
在resources里面添加一个mapper目录,然后在下面添加一个UserMapper.xml文件,添加mybatis语句
3、创建表
4、测试
注册用户成功
5、更新数据
步骤1:新建一个jsp页面edituser.jsp
<%@ page contentType=“text/html;charset=UTF-8” language=“java” %>
<title>管理员注册</title>
<script>
function checkPwd(){
// var pwd=document.frm.pwd.value;
// var pwd_confirm=document.frm.pwd_confirm.value;
// if(pwd!=pwd_confirm){
// alert("两次密码不一致!");
// return false;
// }
// return true;
}
</script>
<style>
.register_top{
background-color: #383d41;
height: 50px;
color: white;
}
.container{
margin-top: 10%;
width: 35%;
}
.btn-primary{
background-color: #007bff;
border-color: #0b2e13;
}
label{
font-size: large;
}
</style>
修改管理员信息
<form name="frm" action="/user/doedituser" method="post" onsubmit="return checkPwd();">
<div>
<table>
<tr><td width="30%"><label>姓 名:</label></td><td width="70%"><input type="text" value="${user.username}" name="username" required maxlength="50"></td></tr>
<tr><td width="30%"><label>昵 称:</label></td><td width="70%"><input type="text" value="${user.nickName}" name="nickName" required maxlength="20"></td></tr>
<tr><td><label>电 话:</label></td><td><input type="text" value="${user.tel}" name="tel" required maxlength="50"></td></tr>
<tr><td><label>密 码:</label></td><td><input type="password" value="${user.password}" name="password" required maxlength="50"></td></tr>
<tr><td><label>性 别:</label></td><td><input type="text" value="${user.sex}" name="sex" required maxlength="50"></td></tr>
<tr><td colspan="2"> </td></tr>
<tr><td colspan="2"> <span style="color: red">${error_msg}</span></td></tr>
<tr><td></td><td>
<input type="hidden" name="id" value="${user.id}">
<button class="btn btn-log btn-primary btn-dark" type="submit" >更新</button></td></tr>
</table>
</div>
</form>
步骤2:UserController里面编写更新函数,Service层自己写
// http://localhost:8081/user/edituserpage?id=3
@RequestMapping(“/edituserpage”)
public String showEditUserPage(int id, Map<String,Object> map){
User dbUser = userService.findById(id);
if(dbUser!=null){
map.put(“user”,dbUser);
}
return “edituser”;
}
@RequestMapping(“/doedituser”)
@ResponseBody
public String doEditUser(User user){
User dbUser = userService.findById(user.getId());
if(dbUser!=null){
userService.update(user);
}
return “修改用户信息成功”;
}
步骤3:UserMapper.xml里面编程执行sql
update user set
username=#{username},
password=#{password},
nick_name=#{nickName},
sex=#{sex},
tel=#{tel}
where
id=#{id}
6、删除数据
步骤1:UserController新增删除方法,Service层自己写
// http://localhost:8081/user/dodeleteuesr?id=3
@RequestMapping(“/dodeleteuesr”)
@ResponseBody
public String doDeleteUser(int id){
userService.deleteUserById(id);
return “删除用户信息成功”;
}
步骤2:UserMapper.java里面添加执行删除的语句
@Delete(“delete from user where id=#{id}”)
public void deleteUserById(int id);
7、解决注入mapper标红
在mapper接口上加上@Component注解,如下:
注意:如果在启动项目的时候出现下面的报错,那么需要到启动类里面,点击右键选择启动。或者再次启动项目。
注意:
Mapper.xml里面的命名课件值填写的时候,不能有前后空格,否则会报错
五、添加springmvc配置
1、在Springboot里面添加自定义的拦截器
步骤:1)添加一个拦截器,编写拦截的业务,2)添加一个配置类MyConfig,然后现实WebMvcConfigurer接口。
//步骤1:写一个Interceptor
public class AdminAuthInterceptor implements HandlerInterceptor {
//拦截前:进入controller控制器之前执行
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println(“AdminAuthIntercepter preHandle”);
return true;
}
//拦截后:controller控制器执行之后
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println(“AdminAuthIntercepter postHandle”);
}
//返回内容之后执行
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println(“AdminAuthIntercepter afterCompletion”);
}
}
//步骤2:写一个配置类com.hwadee.netstore.config.MyConfig
//步骤3:在这个配置类里面注册自定义的拦截器
//步骤3.1:添加一个配置类,并现实WebMvcConfigurer
@Configuration //@Configuration声明这是一个配置类
public class MyConfig implements WebMvcConfigurer {
// 步骤3.2:注册自定义拦截器
@Bean // @Bean 的作用:声明这个方法返回一个bean实例,并把这个bean交给spring容器管理
public AdminAuthInterceptor adminAuthInterceptor(){
return new AdminAuthInterceptor();
}
// 步骤3.3 把自定义的拦截器添加到springmvc拦截器链里面
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(adminAuthInterceptor()).addPathPatterns(“/admin/**”);
}
2、在Springboot里面添加自定义的转换器
步骤1:写一个转换器
package com.example.demo.converter;
import org.springframework.core.convert.converter.Converter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
//自定义日期转换器
//Converter<String, Date>: 泛型接口,其String表示指定输入参数类型,Date表示指定输出值的数据类型
public class MyDateConverter implements Converter<String, Date> {
//2021-02-01
//2021-02-01 12:21:59
@Override
public Date convert(String strDate) {
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
// trim():去掉字符串的前后空格
if(strDate!=null && strDate.trim().length()>0){
//2021-02-01 12:21:59
if(strDate.trim().length()>10){
sdf=new SimpleDateFormat(“yyyy-MM-dd hh:mm:ss”);
}
try {
Date date=sdf.parse(strDate);
return date;
} catch (ParseException e) {
System.out.println(“MyDateConverter.convert() 日期转换报错:转换目标=”+strDate);
}
}else{
System.out.println(“MyDateConverter.convert() 日期转换失败:转换目标为空”);
}
return null;
}
}
步骤2:写一个配置类com.hwadee.netstore.config.MyConfig
步骤3:在这个配置类里面注册自定义的转换器
// 注册自定义转换器
@Bean // @Bean 的作用:声明这个方法返回一个bean实例,并把这个bean交给spring容器管理
public MyDateConverter findMyDateConverter(){
return new MyDateConverter();
}
// 添加自定义转换器
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addConverter(findMyDateConverter());
}
3、在Springboot里面添加自定义的过滤器
1)使用注解写一个过滤器
package com.hwadee.train.filter;
import com.hwadee.train.entity.Admin;
import com.hwadee.train.sessionparameter.SeesionParmeter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
//自定义过滤器步骤:
//步骤1:写一个普通类
//步骤2:implements Filter
//步骤3:添加@WebFilter,并且配置过滤条件
//步骤4:写过滤业务
//步骤5:在启动类上面添加@ServletComponentScan 注解
@WebFilter(“/*”)
public class LoginFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest,
ServletResponse servletResponse,
FilterChain filterChain)
throws IOException, ServletException {
HttpServletRequest hsr=(HttpServletRequest)servletRequest;
HttpServletResponse hsrp=(HttpServletResponse)servletResponse;
String contextPath = hsr.getContextPath();
// http://localhost:8080/login
String requestURI = hsr.getRequestURI();
if(requestURI.contains(“login”)
||requestURI.contains(“login”)
|| requestURI.contains(“style”)){
// 不过滤的url,直接放行
filterChain.doFilter(servletRequest,servletResponse);
}else{
Object attribute = hsr.getSession().getAttribute(SeesionParmeter.ADMIN_INFO);
if(attribute!=null && attribute instanceof Admin){
// 已经登录
filterChain.doFilter(servletRequest,servletResponse);
}else{
// 没有登录,跳转到登录页面
hsrp.sendRedirect(“login”);
}
}
}
}
2)在启动类添加@ServletComponentScan注解
@SpringBootApplication
@MapperScan(“com.hwadee.netstore.mapper”)
@ServletComponentScan
public class NetstoreApplication { … }
4、在Springboot里面添加自定义的监听器
步骤1:使用注解写一个listener
@WebListener
public class TestListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent event) {
System.out.println(“项目启动成功:TestListener contextInitialized”);
}
@Override
public void contextDestroyed(ServletContextEvent event) {
System.out.println(“项目关闭成功TestListener contextDestroyed”);
}
}
步骤2:在启动类里面添加注解 @ServletComponentScan
@SpringBootApplication
@MapperScan(“com.hwadee.netstore.mapper”)
@ServletComponentScan
public class NetstoreApplication { …}
六、SpringBoot单元测试
1)Junit4
可以使用Junit4或者Junit5,下面介绍4的使用方法:
2)Junit5
下面介绍5的使用方法:
七、事务管理
比如:银行转账业务,1需要对支付方账号减少金额,2需要对收入方账户增加金额。这个各操作缺一不可,要么全部失败,要么全部成功。如果是一条sql语句执行,那么这个执行操作就是一个原子操作。
添加 注解方式:
步骤1:
步骤2:在业务层写转账业务:
//账号转账业务
@Transactional //@Transactional事务管理注解
public void changeAmount(int fromUserId,int toUserId,double amount){
System.out.println(“转账业务开始…”);
subAmount(fromUserId,amount);
addAmount(toUserId,amount);
System.out.println(“转账业务成功结束…”);
}
//账号减少金额
public void subAmount(int userId,double amount){
User user= userMapper.findById(userId);
double newAmount= user.getAmount()-amount;
userMapper.updateUserAmount(userId,newAmount);
System.out.println("减少金额成功......");
}
//账号增加金额
public void addAmount(int userId,double amount){
User user= userMapper.findById(userId);
// user=null;
double newAmount= user.getAmount()+amount;
userMapper.updateUserAmount(userId,newAmount);
System.out.println(“增加金额成功…”);
}
步骤3:查看数据库数据变化:
八、Springboot添加分页插件
1、在pom.xml文件里面添加
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.3.0</version>
</dependency>
2、代码中使用:
// 使用分页插件
// currentPage:当前页
// pageSize:分页大小
PageHelper.startPage(currentPage,pageSize);
九、打包部署
idea默认打成jar包
1 打包方式
① Jar
② War
如果前端页面使用jsp,那么需要打war.
在pom.xml里面指定打包方式为war
war
步骤:
1)把test单元测试跳过,打包的时候不需要,
2)然后点击packpage打包
上面就是打包成功后的包位置和包名称
2:运行war包
把这个包copy到E盘等其他位置,cmd里面执行java -jar 包名称,这样就可以直接运行了。注意:需要能够运行java程序的环境。
然后可以在浏览器里面正常访问。
在cmd里面,使用Ctrl+c关闭应用。