关键词:
SpringBoot入门到精通系列
- SpringBoot入门到精通-Spring的注解编程(一)
- SpringBoot入门到精通-SpringBoot入门(二)
- SpringBoot入门到精通-Spring的基本使用(三)
- SpringBoot入门到精通-SpringBoot集成SSM(四)
前言
上一篇文章我们讲的是SpringBoot的基本用法,本篇文章我们来学习一下SpringBoot如何整合web,以及Mybatis以及事务。
五.SpringBoot集成SSM
1.WEB集成
1.1.集成Thymeleaf
现在的项目基本上都采用前后端分离架构,也就是项目后台不需要处理页面,但是在一些小型的项目中还是把页面耦合在后台项目中,这就需要集成视图技术(模板技术)。常见的模板技术有 thymeleaf ;freemaker ;Velotity ; jsp 。
jsp相信大家都使用过,因为性能问题现在基本被淘汰,SpringBoot官方推荐使用thymeleaf 。
第一步:集成thymeleaf 需要导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
第二步:创建thymeleaf模板文件 , 在resources/templates中创建 index.html 文件,内容如下
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>成功!</h1>
<!--使用语法th:text 将div里面的文本内容设置为 -->
<div th:text="$msg">这是显示欢迎信息</div>
</body>
</html>
文件中需要一个 msg 内容来填充, 注意:它不是一个静态资源html,而是thymeleaf的模板文件
第三步:编写实controller
@Controller
public class HelloController
@RequestMapping("/index")
public String index(Model model)
model.addAttribute("msg","惊不惊喜,刺不刺激");
//返回视图名
return "index";
第四步:访问http://localhost:9999/index,效果如下
如果你需要对thymeleaf有些个性化 配置,可以在application.yml中配置如下
spring:
thymeleaf:
encoding: utf-8
prefix: classpath:/templates/ #默认去哪个路径找页面
cache: true #是否开启缓存
enabled: true #是否使用 thymeleaf 的开关
suffix: .html #页面的后缀,可以修改
到这里thymeleaf就集成成功了,剩下的就是thymeleaf的语法了,如果您公司有用到thymeleaf那你可以专门早点资料去学习一下,这里不是重点,不做过多描述。
1.2.webjars
WebJars能使Maven的依赖管理支持OSS的JavaScript库/CSS库,比如jQuery、Bootstrap等;WebJars是将Web前端Javascript和CSS等资源打包成Java的Jar包,这样在Java Web开发中我们可以借助Maven这些依赖库的管理,保证这些Web资源版本唯一性。可以在( http://www.webjars.org/)网站查找你需要的依赖。
这里以jQuery为例,第一步:导入jquery的jar
<dependency>
<groupId>org.webjars</groupId>
<artifactId>jquery</artifactId>
<version>3.4.1</version>
</dependency>
第二步:在页面导入jquery的js即可使用
<script src="/webjars/jquery/3.4.1/jquery.js"></script>
1.3.注册拦截器
我们可以回顾一下在SpringMVC XML中是如何注册拦截器的,首先需要定义拦截器类,实现HandlerInterceptor或者继承HandlerInterceptorAdapter也行。然后需要在xml中注册拦截器
<!-- 配置拦截器:-->
<mvc:interceptors>
<mvc:interceptor>
<!-- 拦截所有请求,排除拦截 /login 请求 -->
<mvc:mapping path="/**"/>
<mvc:exclude-mapping path="/login"/>
<bean class="cn.xx.MyInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
那么在SpringBoot中是如何注册拦截器的呢?第一个动作是一样的,都需要定义一个拦截器类,第二步注册拦截器在SpringBoot中提供了一个 WebMvcConfigurer
接口,专门用来对SpirngMVC做配置。步骤如下
第一步:创建拦截器类 和以前的创建方式一样
@Component
public class MyHandlerInterceptor extends HandlerInterceptorAdapter
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception
System.out.println("preHandle................:"+request.getRequestURI());
return super.preHandle(request, response, handler);
第二步:注册拦截器, 在配置类上实现WebMvcConfigurer,复写addInterceptors,该方法提供了一个InterceptorRegistry专门用来注册拦截器,如下:
@SpringBootApplication
public class ApplicationConfig implements WebMvcConfigurer
@Autowired
private MyHandlerInterceptor myHandlerInterceptor;
/**
* 注册拦截器
* @param registry :拦截器的注册器
*/
@Override
public void addInterceptors(InterceptorRegistry registry)
//指定要拦截器的请求/** 代表所有, excludePathPatterns代表要排除的请求
registry.addInterceptor(myHandlerInterceptor).addPathPatterns("/**").excludePathPatterns("/login");
1.4.添加视图控制器
ViewControllers被叫做视图控制器,当项目中涉及大量的页面跳转,我们可以使用addViewControllers方法实现无业务逻辑跳转,从而减少控制器代码的编写。WebMvcConfigurer的addViewControllers方法可以实现将一个请求直接映射为视图,不需要编写控制器来实现,从而简化了页面跳转。
@Override
public void addViewControllers(ViewControllerRegistry registry)
//当访问 /xx 路径 ,自动跳转到 templates/xx.html 页面
registry.addViewController("/xx").setViewName("xx.html");
当访问/xx 定位到 templates/xx.html
2.Mybatis集成
SpringBoot集成Mybatis之前我们也回顾一下传统的Spring和Mybatis整合的步骤,重要是在Spring的xml配置中
<!--1 引入属性文件,在配置中占位使用 -->
<context:property-placeholder location="classpath*:db.properties" />
<!--2 配置数据源 -->
<bean id="datasource" class="org.apache.ibatis.datasource.pooled.PooledDataSource">
<!--驱动类名 -->
<property name="driver" value="$mysql.driver" />
<!-- url -->
<property name="url" value="$mysql.url" />
<!-- 用户名 -->
<property name="username" value="$mysql.username" />
<!-- 密码 -->
<property name="password" value="$mysql.password" />
</bean>
<!--3 会话工厂bean sqlSessionFactoryBean -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 数据源 -->
<property name="dataSource" ref="datasource"></property>
<!-- 别名 -->
<property name="typeAliasesPackage" value="cn.whale.domian"></property>
<!-- sql映射文件路径 -->
<property name="mapperLocations" value="classpath*:mapper/*Mapper.xml"></property>
<!-- <property name="configLocation" value="classpath*:mybatis-config.xml"></property>-->
<!-- <property name="plugins"></property>-->
</bean>
<!--4 自动扫描对象关系映射 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 指定要自动扫描接口的基础包,实现接口 -->
<property name="basePackage" value="cn.whale.mapper"></property>
</bean>
其实是非常麻烦的,那么在SpringBoot中又是如何配置的呢?
2.1.集成DataSource
集成Mybatis肯定是需要先集成DataSource,SpringBoot已经提供了自动装配DataSource功能。我们只需要在ymal中做简单配置即可。
第一步:导入依赖 , 我这里把连接池,驱动,mybatis全导入进来
<!-- 阿里巴巴的连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.20</version>
</dependency>
<!-- mysql 数据库驱动. -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- mybatis的依赖 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.1.1</version>
</dependency>
第二步:配置DataSource
spring:
datasource:
username: root
password: admin
url: jdbc:mysql:///test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
driver-class-name: com.mysql.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource #指定使用druid的连接池
这里我指定了type指向了DruidDataSource连接池,如果不指定,默认会使用HikariDataSource作为连接池
2.2.集成MyBatis
集成mybatis就需要创建domain , mapper等组件了,还要准备数据库.
第一步:User实体类如下
//lombok,自动生成get,set
@Data
public class User
private Long id;
private String username;
第二步:mapper/UserMapper接口如下
public interface UserMapper
User selectAll();
第三步:resources/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">
<mapper namespace="cn.whale.mapper.UserMapper">
<select id="selectAll" resultType="cn.whale.domain.User">
SELECT id,username FROM t_user
</select>
</mapper>
第四步:数据库如下
第五步:配置mybatis , application.yml如下
mybatis:
type-aliases-package: "cn.whale.domain" #别名
mapper-locations: classpath:mapper/UserMapper.xml #扫描SQL映射文件
#config-location: mybatis-config.xml #mybatis配置文件
第六步:配置Mapper接口扫描
@SpringBootApplication
//mapper映射器自动扫描
@MapperScan("cn.whale.mapper")
public class ApplicationConfig
...
@MapperScan的作用等同于传统Spring配置Mybatis时配置的 MapperScannerConfigurer ,可以实现mapper映射器的自动扫描。
第七步:编写service
public interface IUserService
List<User> selectAll();
@Service
public class UserServiceImpl implements IUserService
@Autowired
private UserMapper userMapper ;
@Override
public List<User> selectAll()
return userMapper.selectAll();
第八步:编写Controller
@RestController
public class UserController
@Autowired
private IUserService userService;
@RequestMapping("/users")
public List<User> userList()
return userService.selectAll();
最后结构如下
第九步:启动测试,效果如下
3.集成事务
在Spring中我们有两种配置事务的方式,一是在XML中使用<aop>
的方式统一配置,这种方式比较麻烦新项目一般不用,二是使用注解@Transcationl注解的方式,这种方式需要开启<tx:annotation-driven
注解支持,当然两种方式都需要配置DataSourceTransactionManager 的支持,而在SpringBoot中使用简单的两个注解就可以完成啦。
3.1.注解方式事务支持
第一步:开启事务,在配置类贴上@EnableTransactionManagement
,该注解功能和<tx:annotation-driven
一样是开启事务支持,只要导入了Mybatis的依赖默认情况下SpringBoot会帮我们自动创建DataSourceTransactionManager。
@SpringBootApplication
@MapperScan("cn.whale.mapper")
//开启事务支持
@EnableTransactionManagement
public class ApplicationConfig
...
PS:其实在SpringBoot环境中,不贴该注解也是可以的,默认就开启了的
第二步:给service添加事务,只需要在需要有事务的类上,或者方法上标记@Transactional即可
@Transactional
@Service
public class UserServiceImpl ...
3.2.使用xml方式配置(了解)
第一步:这种方式不推荐使用,做一个了解就可以了,首选需要导入一个依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
第二步:使用一个xml配置事务:applicationContext.xml
<!-- 配置事物管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 扫描哪些类需要事务支持 -->
<aop:config>
<aop:pointcut expression="execution(* cn.itsource.web.controller.service..*.*(..))" id="coreServicePointcut"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="coreServicePointcut"/>
</aop:config>
<!-- aop应用事务管理 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="select*" read-only="true"/>
<tx:method name="*" propagation="REQUIRED" />
</tx:attributes>
</tx:advice>
第三步:在配置类导入xml配置文件,让其生效
@SpringBootApplication
@MapperScan("cn.whale.mapper")
@ImportResource("classpath:applicationContext.xml")
public class ApplicationConfig
...
4.PageHelper的集成
PageHelper是一个mybatis的分页插件,可以帮我们自动生成查询count的sql和分页limit。可以简化我们的代码
4.1.第一步:导入依赖
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.3</version>
</dependency>
4.2.编写查询语句
<select id="selectPage" resultType="cn.whale.User">
select id,username from t_user
</select>
注意:用了pagehelper之后 ,查询总条数的sql不用写 , limit 不用写
分页查询
@Override
public Page<User> selectPage()
//设置分页条件,1是查询第几页,5是查询条数
PageHelper.startPage(1,5 );
Page<User> page = (Page<User>) userMapper.selectPage();
return page;
-
PageHelper.startPage(1,5 ):设置当前页和每页条数
-
Page :是pagehelper自己封装的页面对象,如同我们以前的PageList ,里面有总条数,列表,总页数等等
4.3.获取结果
Page<User> page = UserService.selectPage();
System.out.println("总条数:"+page.getTotal());
for (User user : page.getResult())
System.out.println(user);
5.使用外置Tomcat运行
在企业中,有些开发者认为SpringBoot内置的Tomcat并不是最优的选择,需要有一些自定义的配置,这个时候就需要把SpringBoot打成war
包然后部署到外置的Tomcat中。
产生一个可部署war包的第一步是提供一个 SpringBootServletInitializer
子 类,并覆盖它的 configure
方法,这充分利用了Spring框架对Servlet 3.0的支 持,并允许你在应用通过servlet容器启动时配置它。
5.1.编写SpringBootServletInitializer实现
第一步:启动类实现SpringBootServletInitializer接口
//SpringBootServletInitializer 实现了 WebApplicationInitializer,用来使用传统的 WAR 部署运行SpringApplication 。
// 它将Servlet 、 Filter和ServletContextInitializer bean 从应用程序上下文绑定到服务器
@SpringBootApplication
@MapperScan("cn.whale.mapper")
public class ApplicationConfig extends SpringBootServletInitializer
public static void main(String[] args)
SpringApplication.run(ApplicationConfig.class,args);
//把当前配置类和
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application)
<springboot入门到精通-spring的注解编程(代码片段)
SpringBoot入门到精通系列SpringBoot入门到精通-Spring的注解编程(一)SpringBoot入门到精通-SpringBoot入门(二)SpringBoot入门到精通-Spring的基本使用(三)SpringBoot入门到精通-SpringBoot集成SSM(四)前言SpringBoot并不是一个新技术了,但是我发现... 查看详情
springboot入门到精通-spring的基本使用(代码片段)
SpringBoot入门到精通系列SpringBoot入门到精通-Spring的注解编程(一)SpringBoot入门到精通-SpringBoot入门(二)SpringBoot入门到精通-Spring的基本使用(三)SpringBoot入门到精通-SpringBoot集成SSM(四)前言上一篇文章我们讲的是SpringBoot的入门程序,... 查看详情
springboot入门到精通-springboot自动配置原理(代码片段)
SpringBoot源码解析SpringBoot入门到精通-Spring的注解编程(一)SpringBoot入门到精通-SpringBoot入门(二)SpringBoot入门到精通-Spring的基本使用(三)SpringBoot入门到精通-SpringBoot集成SSM(四)SpringBoot入门到精通-SpringBoot自动配置原理(五)SpringBoot入门... 查看详情
java之springboot入门到精通idea版springboot原理分析,springboot监控(一篇文章精通系列)下(代码片段)
目录Java之SpringBoot入门到精通【IDEA版】(一篇文章精通系列)【上】Java之SpringBoot入门到精通【IDEA版】SpringBoot整合其他框架【Junit,Redis,MyBatis】(一篇文章精通系列)【中】Java之SpringBoot入门到精通【IDEA版】SpringBo... 查看详情
springboot入门到精通-springboot自定义starter(代码片段)
定义自己的starterSpringBoot入门到精通-Spring的注解编程(一)SpringBoot入门到精通-SpringBoot入门(二)SpringBoot入门到精通-Spring的基本使用(三)SpringBoot入门到精通-SpringBoot集成SSM(四)SpringBoot入门到精通-SpringBoot自动配置原理(五)SpringBoot入门... 查看详情
springboot从入门到精通
这一节我们一起用springboot开发一个应用程序,应用程序里的核心概念是玩家获取英雄列表上的英雄信息。1、定义实体模型:代码如下:packagecom.dota.herolist.entity;importjavax.persistence.Entity;importjavax.persistence.GeneratedValue;importjavax.persist... 查看详情
springboot从入门到精通
...始第三节之前,先补充一下第二节里出现的小问题,就是springboot的application.properties,我在文件中添加了server.port=9090这个参数,但是启动项目后并未生效,检查了一下原因,是因为未读取到该文件,这里可以通过buildpath添加source... 查看详情
springboot从入门到精通
springboot到底有什么好处?有什么优势?这个先不用看,我们只要知道它有很多优势,现在要做的事只有一件,那就是撸代码!撸完就知道有多少料!首先,在案例中,我们会构建一个英雄列表应用。操作如下:1、初始化一... 查看详情
快速开发架构springboot从入门到精通附源码
...7;作者:陈彦斌出处:https://www.cnblogs.com/chenyanbin/#SpringBoot基础SpringBoot简介SpringBoot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring 查看详情
三.kafka入门到精通-springboot整合kafka(上)
...用,顺应如今企业流行的开发模式,当然要使用SpringBoot和Kafka进行整合。SpringBoot整合Kafka第一步:我们基于SpringBoot来快速入门Kafka,我这里使 查看详情
java之springboot入门到精通idea版(一篇文章精通系列)上(代码片段)
一、SpringBoot概述SpringBoot提供了一种快速使用Spring的方式,基于约定优于配置的思想,可以让开发人员不必在配置与逻辑业务之间进行思维的切换,全身心的投入到逻辑业务的代码编写中,从而大大提高了开发的... 查看详情
java之springboot入门到精通,springboot项目部署jar包方式,war包方式(一篇文章精通系列)(代码片段)
SpringBoot项目开发完毕后,支持两种方式部署到服务器:SpringBoot项目部署【jar包方式,war包方式】一、创建SpringBoot工程1、创建工程2、创建UserController二、jar包(官方推荐)1、打包2、运行jar包三、war包1、修改pom.xml的打包方式... 查看详情
java基础教程从入门到精通,社招面试心得
一、SpringBoot相关(1)SpringBoot面试专题什么是SpringBoot?SpringBoot有哪些优点?什么是JavaConfig?如何重新加载SpringBoot上的更改,而无需重新启动服务器?SpringBoot中的监视器是什么?如何在SpringBoot中... 查看详情
springboot从入门到精通-项目搭建
参考技术ASpringBoot极大的简化了java项目的开发,在之前如果想要开发一个java项目,需要安装tomcat或者其他容器插件。但是SpringBoot内部已经集成了tomcat,因此项目的启动异常的方便。而且SpringBoot的开发中有很多默认的配置,帮助... 查看详情
java之springboot入门到精通idea版springboot整合其他框架junit,redis,mybatis(一篇文章精通系列)中(代码片段)
SpringBoot整合其他框架【Junit,Redis,MyBatis】一、SpringBoot整合Junit①搭建SpringBoot工程②引入starter-test起步依赖③编写测试类(1)在启动类傍边其他类④添加测试相关注解⑤编写测试方法二、SpringBoot整合Redis1、搭建SpringBoot工... 查看详情
springboot从入门到精通(三十四)如何集成jwt实现token验证
...逐渐被基于Token的身份验证模式取代。接下来介绍如何在SpringBoot项目中集成JWT实现Token验证。一、JWT入门1.什么是JWTJWT(Jsonwebtoken)是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC7519)。它定义了一种紧凑的... 查看详情
dubbo从入门到精通与springboot集成的三种方式(十一)(代码片段)
1 方式一(注解方式)导入dubbo-starter,在application.properties配置属性,使用@Service【暴露服务】使用Reference【引用服务】新版本的dubbo 是@DubboService 和@DubboReference然后在启动类上面 标 @EnableDubbo 开启基于注解的du... 查看详情
springboot从入门到精通(二)通过实体类生成数据库表的方式
1.需要添加的依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><groupId>m 查看详情