论spring boot的崛起
spring boot
- 定义
Spring Boot是由Pivotal团队提供的框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。
该框架使用了特定的方式(继承starter,约定优先于配置)来进行配置,从而使开发人员不再需要定义样板化的配置
- 使用springboot的有点
1.使编码更加的简单
2.使配置更加的简单
3.使部署更加简单
4.使监控更加简单 - spring boot提供的功能
简言之:
Springboot其本质还是spring相关的框架,不过为开发者提供了一系列默认的starter,大大降低了spring项目开发的配置工作,所谓约定大于配置。
但其也有缺点,就是使用简单,但很多原理性的东西可能对于不了解spring springMvc Mybatis Hibernate JPA等相关框架的开发者而言还是需要重新学习。
spring boot的入门学习
- 环境要求
开发环境JDK 1.8
项目管理工具( Maven )
开发工具(Eclipse) - 创建项目步骤
1.创建一个maven项目
2.导入spring boot的依赖
<!--
spring boot 父节点依赖,引入这个之后相关的引入就不需要添加version配置,spring boot会自动选择最合适的版本进行添加。
-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.10.RELEASE</version>
</parent>
java.version 指定jdk版本号:
<java.version>1.8</java.version>
添加spring-boot-starter-web依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 使用热部署 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
<!-- 可执行jar包 -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
3.写测试
新建control
@RestController
public class HelloControl {
@RequestMapping("/hello")
public String Hello(){
return "hello-word";
}
}
=============================================================
新建一个启动类
@SpringBootApplication
public class Start {
public static void main(String[] args) {
SpringApplication.run(Start.class, args);
}
}
- 热部署的配置spring-boot-devtools
spring-boot-devtools 是一个为开发者服务的一个模块,其中最重要的功能就是自动应用代码更改到最新的App上面去。原理是在发现代码有更改之后,重新启动应用,但是速度比手动停止后再启动还要更快,更快指的不是节省出来的手工操作的时间。
其深层原理是使用了两个ClassLoader,一个Classloader加载那些不会改变的类(第三方Jar包),另一个ClassLoader加载会更改的类,称为 restart ClassLoader
,这样在有代码更改的时候,原来的restart ClassLoader 被丢弃,重新创建一个restart ClassLoader,由于需要加载的类相比较少,所以实现了较快的重启时间
本节主要是SpringBoot的基本引入及热部署的集成
Spring boot web
-
步骤:
创建Maven web project
引入依赖
配置application.properties对jsp支持
编写测试Controller
编写JSP
编写启动start -
创建Maven Web Project
使用Eclipse新建一个Maven Web Project ,项目取名为:spring-boot-jsp -
导入maven依赖
<properties>
<java.version>1.8</java.version>
</properties>
<!-- Inherit defaults from Spring Boot -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.10.RELEASE</version>
</parent>
<!-- Add typical dependencies for a web application -->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional> <!-- 表示依赖不会传递 -->
</dependency>
<!--必须有才能编译jsp -->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
<!-- Package as an executable jar -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
- 配置application.properties对jsp支持
添加src/main/resources/application.properties:
#tomcat server port
server.port=80
# 页面默认前缀目录
spring.mvc.view.prefix=/WEB-INF/jsp/
# 响应页面默认后缀
spring.mvc.view.suffix=.jsp
# 自定义属性,可以在Controller中读取
application.hello=Hello Angel From application
Yaml 方式
server:
port: 8080
name: kd
spring:
mvc:
view:
prefix: /WEB-INF/jsp/
suffix: .jsp
- 编写测试类
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class HelloController {
@RequestMapping("/hello")
public String helloJsp(Model model){
System.out.println("HelloController.helloJsp().hello=hello");
model.addAttribute("hello", "你好");
return "hello";
}
}
- 编写jsp界面
在 src/main 下面创建 webapp/WEB-INF/jsp 目录用来存放我们的jsp页面:helloJsp.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
helloJsp
<hr>
${hello}
</body>
</html>
- 编写启动start
@SpringBootApplication
public class Start {
public static void main(String[] args) {
SpringApplication.run(Start.class, args);
}
}
- 获取json对象
@RequestMapping("/json")
@ResponseBody
public Person json(){
return new Person(1L,"kd");
}
SpringBoot搭建web项目非常简单,和原SpringMVC的使用方式类似,但启动方式和配置方式有区别。
Spring boot 持久化
Spring Boot就数据库持久化支持,支持原生Jdbc,也支持Mybatis和JPA。
- Spring boot JdbcTemplate
引入spring-boot-starter-jdbc
只需要在需要使用的类中加入:
@Resource
private JdbcTemplate jdbcTemplate;
- 引入maven依赖MySQL、jdbc
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
- 数据库信息配置
在application.properties文件中配置mysql连接配置文件
########################################################
###datasource
########################################################
spring.datasource.driverClassName = com.mysql.jdbc.Driver
spring.datasource.url = jdbc:mysql://localhost:3306/test
spring.datasource.username = root
spring.datasource.password = root
Yaml 方式
spring:
datasource:
driverClassName: com.mysql.jdbc.Driver
url : jdbc:mysql://localhost:3306/spring-boot-demo?useUnicode=true&characterEncoding=utf-8
username : root
password : root
-
Spring boot-spring data Jpa
1pring data
Spring Data是一个用于简化数据库访问,并支持云服务的开源框架。其主要目标是使得数据库的访问变得方便快捷,并支持map-reduce框架和云计算数据服务
2.Jpa
“规范”: 所谓的规范意指明文规定或约定俗成的标准
3.Hibernate
JPA是一种规范,而Hibernate是它的一种实现
4)Spring data Jpa
4.Spring Data JPA
可以极大的简化JPA的写法,可以在几乎不用写实现的情况下,实现对数据的访问和操作。除了CRUD外,还包括如分页、排序等一些常用的功能。
5.Spirng data jpa常用接口或类
Spring Data 的一个核心接口为我们提供了常用的接口
Repository 接口是 Spring Data 的一个核心接口,它不提供任何方法,开发者需要在自己定义的接口中声明需要的方法 :
public interface Repository<T, ID extends Serializable> { }
1Repository是一个空接口,即是一个标记接口;
2若我们定义的接口继承了Repository,则该接口会被IOC容器识别为一个Repository Bean纳入到IOC容器中,进而可以在该接口中定义满足一定规范的方法。
3 实际上也可以通过@RepositoryDefinition,注解来替代继承Repository接口。
4 查询方法以find | read | get开头;
5 涉及查询条件时,条件的属性用条件关键字连接,要注意的是条件属性以首字母大写。
6使用@Query注解可以自定义JPQL语句实现更灵活的查询。 -
引入Maven依赖-mysql,springdatajpa
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
- 配置jdbc spring data jpa
在application.properties文件中配置mysql连接配置文件
#tomcat server port
server.port=80
########################################################
###datasource
########################################################
spring.datasource.url = jdbc:mysql://localhost:3306/test
spring.datasource.username = root
spring.datasource.password = root
spring.datasource.driverClassName = com.mysql.jdbc.Driver
spring.datasource.max-active=20
spring.datasource.max-idle=8
spring.datasource.min-idle=8
spring.datasource.initial-size=10
########################################################
### Java Persistence Api (可以不设置,用默认的)
########################################################
# Specify the DBMS
spring.jpa.database = MYSQL
# Show or not log for each sql query
spring.jpa.show-sql = true
# Hibernate ddl auto (create, create-drop, update)
spring.jpa.hibernate.ddl-auto = update
# Naming strategy
#[org.hibernate.cfg.ImprovedNamingStrategy #org.hibernate.cfg.DefaultNamingStrategy]
spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy
# stripped before adding them to the entity manager)
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
Spring boot-mybatis的集成
- 集成
(1)新建maven project;
新建一个maven project,取名为:spring-boot-mybatis
(2)在pom.xml文件中引入相关依赖;
(1)基本依赖,jdk版本号;
(2)mysql驱动,mybatis依赖包,mysql分页PageHelper:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- mysql 数据库驱动. -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- spring-boot mybatis依赖 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.0</version>
</dependency>
<!-- spring boot mybatis 分页插件 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.2</version>
</dependency>
- 创建启动
@SpringBootApplication
@MapperScan("cn.itsource.springboot.mybatis.mapper")
public class App
{
public static void main( String[] args )
{
SpringApplication.run(App.class, args);
}
}
//这里和以往不一样的地方就是MapperScan的注解,这个是会扫描该包下的接口
- 在application.properties添加配置文件
#tomcat server port
server.port=80
########################################################
###datasource
########################################################
spring.datasource.url = jdbc:mysql://localhost:3306/test
spring.datasource.username = root
spring.datasource.password = root
spring.datasource.driverClassName = com.mysql.jdbc.Driver
spring.datasource.max-active=20
spring.datasource.max-idle=8
spring.datasource.min-idle=8
spring.datasource.initial-size=10
- 编写User测试类
public class User implements Serializable {
private static final long serialVersionUID = -2107513802540409419L;
private Long id;
private String name;
getter/setter...
}
- 编写UserMapper
使用注解方式
@Mapper
public interface UserMapper {
@Select("select * from t_user t_user name = #{name}")
List<User> likeName(String name);
@Select("select * from t_user where id = #{id}")
User getById(long id);
@Select("select name from t_user where id = #{id}")
String getNameById(long id);
}
==================================================================
使用xml方式
public interface UserMapper {
List<User> likeName(String name);
User getById(long id);
String getNameById(long id);
}
然后在resources下增加mapper.xml文件
/cn/itsource/springboot/mybatis/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.itsource.springboot.mybatis.mapper.UserMapper">
<select parameterType="string" resultType="User" id="likeName">
select * from t_user where name like concat('%',#{name},'%')
</select>
<select parameterType="long" resultType="User" id="getById">
select * from t_user where id = #{id}
</select>
<select parameterType="long" resultType="string" id="getNameById">
select name from t_user where id = #{id}
</select>
<insert parameterType="User" id="save" keyColumn="id"
keyProperty="id" useGeneratedKeys="true">
insert into t_user(name) values(#{name})
</insert>
</mapper>
最后需要在application.properties中增加别名包和mapper xml扫描包的配置
## Mybatis config
mybatis.typeAliasesPackage=cn.itsource.springboot.mybatis.domain
mybatis.mapperLocations=classpath:mapper/*.xml
#Yaml 配置
# Mybatis配置
mybatis:
typeAliasesPackage: cn.itsource.domain
mapperLocations: classpath:cn/itsource/dao/mapper/*.xml
- 编写UserService
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public User get(Long id){
return userMapper.getById(id);
}
}
- 编写UserController
@RestController
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/user/{id}")
@ResponseBody
public User get(@PathVariable Long id) {
return userService.get(id);
}
}
使用PageHelper分页
在application.properties中配置分页插件
#pagehelper.
pagehelper.autoDialect=true
pagehelper.closeConn=true
在调用mapper的前面开启分页功能
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public User get(Long id){
return userMapper.getById(id);
}
public PageInfo<User> likeName(String name,Integer p) {
PageHelper.startPage(p, 1);
List<User> users = userMapper.likeName(name);
return new PageInfo<>(users);
}
}
事务控制
在需要事务控制的方法或类(全部方法有效)上增加 @Transactional注解
使用Junit测试
添加spring-boot-starter-test
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
添加测试类,类似于spring的测试,增加spring-boot的测试环境注解
//Spring测试环境
@RunWith(SpringJUnit4ClassRunner.class)
//SpringBoot测试,并指定启动类
@SpringBootTest(classes = App.class)
public class UserServiceTest {
@Autowired
private UserService userService;
@Test
public void testGet() throws Exception {
User user = userService.get(1L);
System.out.println(user.getName());
}
}
注意:在spring-boot-jpa的测试中,如果测试方法中使用的是 Repository.getOne方法,那么会报no Session异常,解决方法是在测试方法上增加@Transactional注解,如果使用的是findOne方法,那么不会有问题。 所以,一般建议都在test方法上增加 @Transactional注解。 注意:如果在测试方法执行完后要恢复测试前的数据,请在测试方法上增加@Rollback注解