3.Spring boot入門
3.1.環境要求
開發環境JDK 1.8
項目管理工具( Maven )
開發工具(Eclipse)
3.2.入門
3.2.1.創建Maven項目
3.2.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>
<!-- 可執行jar包 -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
3.2.3.編碼測試
新建一個Controller類
新建啓動類(App – Main方法)
測試代碼
運行:App
瀏覽器:http://localhost:8080/hello
3.2.4.熱部署
即使修改了輸出內容也要重啓APP,非常麻煩!可以使用spring-boot-devtools來實現!
1)介紹
spring-boot-devtools 是一個爲開發者服務的一個模塊,其中最重要的功能就是自動應用代碼更改到最新的App上面去。原理是在發現代碼有更改之後,重新啓動應用,但是速度比手動停止後再啓動還要更快,更快指的不是節省出來的手工操作的時間。
其深層原理是使用了兩個ClassLoader,一個Classloader加載那些不會改變的類(第三方Jar包),另一個ClassLoader加載會更改的類,稱爲 restart ClassLoader
,這樣在有代碼更改的時候,原來的restart ClassLoader 被丟棄,重新創建一個restart ClassLoader,由於需要加載的類相比較少,所以實現了較快的重啓時間(5秒以內)
2)使用
添加依賴包:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
3.3.小結
本節主要是SpringBoot的基本引入及熱部署的集成
4.Spring boot web
4.1.引入
前面我們使用Spring Boot能往瀏覽器中輸出一個字符串!實際上我們需要的是跳轉到一個頁面或者獲取一個Json數據。那怎麼實現呢?
4.2.跳轉Jsp
步驟:
創建Maven web project
引入依賴
配置application.properties對jsp支持
編寫測試Controller
編寫JSP
編寫啓動App
4.2.1.創建Maven Web Project
使用Eclipse新建一個Maven Web Project ,項目取名爲:spring-boot-jsp
4.2.2.導入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>
4.2.3.配置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
4.2.4.編寫測試Controller
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";
}
}
4.2.5. 編寫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>
4.2.6.編寫啓動App
4.2.7.啓動App並測試
4.3.獲取Json數據
要把Java對象轉換爲Json框架,使用的是JackSon,maven依賴的jar也有
@RequestMapping("/json")
@ResponseBody
public Person json(){
return new Person(1L,"kd");
}
4.4.小結
SpringBoot搭建web項目非常簡單,和原SpringMVC的使用方式類似,但啓動方式和配置方式有區別。
5.Spring boot 持久化
5.1.引入
Spring Boot就數據庫持久化支持,支持原生Jdbc,也支持Mybatis和JPA。
5.2.Spring boot JdbcTemplate
引入spring-boot-starter-jdbc
那麼只需要在需要使用的類中加入:
@Resource
private JdbcTemplate jdbcTemplate;
5.2.1.引入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>
5.2.2.數據庫信息配置
在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
5.2.3.代碼示例
- Dao
聲明爲:@Repository,引入JdbcTemplate
public Demo getById(long id){
String sql = "select *from Demo where id=?";
RowMapper<Demo> rowMapper = new BeanPropertyRowMapper<Demo>(Demo.class);
return jdbcTemplate.queryForObject(sql, rowMapper,id);
}
2)Service
聲明爲:@Service 引入dao
@Resource
private DemoDao demoDao;
public void getById(Long id){
demoDao.getById(id);
}
3)Controller
@Resource
private DemoService demoService;
@RequestMapping("/getById")
public Demo getById(long id){
return demoService.getById(id);
}
Springboot 測試
5.3.Spring boot-spring data Jpa
5.3.1.Spring data jpa簡介
1)Spring data
Spring Data是一個用於簡化數據庫訪問,並支持雲服務的開源框架。其主要目標是使得數據庫的訪問變得方便快捷,並支持map-reduce框架和雲計算數據服務。此外,它還支持基於關係型數據庫的數據服務,如Oracle RAC等。對於擁有海量數據的項目,可以用Spring Data來簡化項目的開發,就如Spring Framework對JDBC、ORM的支持一樣,Spring Data會讓數據的訪問變得更加方便。
2)Jpa
“規範”: 所謂的規範意指明文規定或約定俗成的標準。如:道德規範、技術規範,公司管理規範。那麼“持久化規範”就是Sun針對持久化這一層操作指定的規範,如果沒有指定JPA規範,那麼新起的框架就隨意按照自己的標準來了,那我們開發人員就沒法把我們的經歷全部集中在我們的業務層上,而是在想如何進行兼容,這種情況有點像Android開發,Android本身有官方的SDK,但是由於SDK過於開源了,結果導致很多廠商基於SDK二次開發,但是兼容性就不是很好,最好的例子就是Android的頭像上傳,就是一件很煩人的事情。好了,JPA就介紹到這裏。
3)Hibernate
JPA是一種規範,而Hibernate是它的一種實現。除了Hibernate,還有EclipseLink(曾經的 toplink),OpenJPA等可供選擇,所以使用Jpa的一個好處是,可以更換實現而不必改動太多代碼。
4)Spring data Jpa
Spring Data JPA能幹什麼
可以極大的簡化JPA的寫法,可以在幾乎不用寫實現的情況下,實現對數據的訪問和操作。除了CRUD外,還包括如分頁、排序等一些常用的功能。
首先我們需要清楚的是Spring Data是一個開源框架,在這個框架中Spring Data JPA只是這個框架中的一個模塊,所以名稱才叫Spring Data JPA。如果單獨使用JPA開發,你會發現這個代碼量和使用JDBC開發一樣有點煩人,所以Spring Data JPA的出現就是爲了簡化JPA的寫法,讓你只需要編寫一個接口繼承一個類就能實現CRUD操作了
5)Spirng data jpa常用接口或類
Spring Data 的一個核心接口爲我們提供了常用的接口
Repository 接口是 Spring Data 的一個核心接口,它不提供任何方法,開發者需要在自己定義的接口中聲明需要的方法 :
public interface Repository<T, ID extends Serializable> { }
- Repository是一個空接口,即是一個標記接口;
- 若我們定義的接口繼承了Repository,則該接口會被IOC容器識別爲一個Repository Bean納入到IOC容器中,進而可以在該接口中定義滿足一定規範的方法。
- 實際上也可以通過@RepositoryDefinition,註解來替代繼承Repository接口。
- 查詢方法以find | read | get開頭;
- 涉及查詢條件時,條件的屬性用條件關鍵字連接,要注意的是條件屬性以首字母大寫。
6.使用@Query註解可以自定義JPQL語句實現更靈活的查詢。
List getByNameOrAge(String name,Integer age);
select * from t_user where name=? or age=?
CrudRepository 接口提供了最基本的對實體類的添刪改查操作
–T save(T entity);//保存單個實體
–Iterable save(Iterable<? extends T> entities);//保存集合
–T findOne(ID id);//根據id查找實體
–boolean exists(ID id);//根據id判斷實體是否存在
–Iterable findAll();//查詢所有實體,不用或慎用!
–long count();//查詢實體數量
–void delete(ID id);//根據Id刪除實體
–void delete(T entity);//刪除一個實體
–void delete(Iterable<? extends T> entities);//刪除一個實體的集合
–void deleteAll();//刪除所有實體,不用或慎用!
PagingAndSortingRepository接口
該接口提供了分頁與排序功能
–Iterable findAll(Sort sort); //排序
–Page findAll(Pageable pageable); //分頁查詢(含排序功能)
JpaRepository:查找所有實體,排序、查找所有實體,執行緩存與數據庫同步
JpaSpecificationExecutor:不屬於Repository體系,實現一組 JPA Criteria 查詢相關的方法,封裝 JPA Criteria 查詢條件。通常使用匿名內部類的方式來創建該接口的對象。
自定義 Repository:可以自己定義一個MyRepository接口 extends JpaRepository。
5.3.2.引入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>
5.3.3.配置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
5.3.4.代碼示例
(1)創建實體類User。
package cn.itsource.springboot.datajpa.domain;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
@Entity
@Table(name="t_user")
//加上json轉換時忽略的屬性,否則出錯
@JsonIgnoreProperties(value={"hibernateLazyInitializer","handler"})
public class User implements Serializable{
@Id
@GeneratedValue
private Long id;
@Column
private String name;
//Getter/setter
}
(2) 創建repository操作持久化接口(繼承自JpaRepository)。
import org.springframework.data.jpa.repository.JpaRepository;
import cn.itsource.springboot.datajpa.domain.User;
public interface UserRepository extends JpaRepository<User, Long>{
public User getByName(String name);
}
(3)創建service類。
package cn.itsource.springboot.datajpa.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import cn.itsource.springboot.datajpa.dao.UserRepository;
import cn.itsource.springboot.datajpa.domain.User;
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public User get(Long id){
return userRepository.getOne(id);
}
public User getByName(String name){
return userRepository.getByName(name);
}
public User save(User user){
return userRepository.save(user);
}
public User update(User user) {
return userRepository.save(user);
}
public void delete(Long id){
userRepository.delete(id);
}
}
(4)創建restful controller。
package cn.itsource.springboot.datajpa.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import cn.itsource.springboot.datajpa.domain.User;
import cn.itsource.springboot.datajpa.service.UserService;
@RestController
public class UserController {
@Autowired
private UserService userService;
@RequestMapping(value = "/user/{id}", method = RequestMethod.GET)
@ResponseBody
public User get(@PathVariable Long id) {
User user = userService.get(id);
System.out.println("user=" + user);
return user;
}
@RequestMapping(value = "/user/name/{name}", method = RequestMethod.GET)
@ResponseBody
public User get(@PathVariable String name) {
User user = userService.getByName(name);
System.out.println("user=" + user);
return user;
}
@RequestMapping(value = "/user/add", method = RequestMethod.GET)
@ResponseBody
public User add() {
User user = new User();
user.setName("itsource");
user = userService.save(user);
return user;
}
@RequestMapping(value = "/user/update", method = RequestMethod.GET)
@ResponseBody
public User update() {
User user = new User();
user.setId(2L);
user.setName("源碼時代");
user = userService.update(user);
return user;
}
@RequestMapping(value = "/user/delete", method = RequestMethod.GET)
@ResponseBody
public String delete() {
userService.delete(2L);
return "success";
}
}
(5)啓動類
package cn.itsource.springboot.datajpa;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
(6)測試;
啓動項目分別測試對應的Restful接口功能。
(7)注意事項
JSON轉換異常處理:
① 在Domain類中排除注入的特殊屬性hibernateLazyInitializer和handler
@Entity
@Table(name=“t_user”)
//加上json轉換時忽略的屬性,否則出錯
@JsonIgnoreProperties(value={“hibernateLazyInitializer”,“handler”})
public class User implements Serializable{…}
② 增加Jackson配置類
package cn.itsource.springboot.datajpa.config;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.hibernate4.Hibernate4Module;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import java.util.List;
/**
* 防止在使用jpa/hibernate,如果實體字段上加有FetchType.LAZY,並使用jackson序列化爲json串時,
* 會遇到SerializationFeature.FAIL_ON_EMPTY_BEANS異常
* @author nixianhua
*
*/
@Configuration
public class JacksonConfiguration extends WebMvcConfigurerAdapter {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(jacksonMessageConverter());
super.configureMessageConverters(converters);
}
private MappingJackson2HttpMessageConverter jacksonMessageConverter() {
MappingJackson2HttpMessageConverter messageConverter = new MappingJackson2HttpMessageConverter();
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new Hibernate4Module());
messageConverter.setObjectMapper(mapper);
return messageConverter;
}
}
5.4.Spring boot-mybatis
5.4.1.集成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>
(3)創建啓動類App.java
@SpringBootApplication
@MapperScan("cn.itsource.springboot.mybatis.mapper")
public class App
{
public static void main( String[] args )
{
SpringApplication.run(App.class, args);
}
}
//這裏和以往不一樣的地方就是MapperScan的註解,這個是會掃描該包下的接口
(4)在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
(5)編寫User測試類;
package cn.itsource.springboot.mybatis.domain;
import java.io.Serializable;
public class User implements Serializable {
private static final long serialVersionUID = -2107513802540409419L;
private Long id;
private String name;
getter/setter...
}
(6)編寫UserMapper;
註解方式 :
package cn.itsource.springboot.mybatis.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Select;
import cn.itsource.springboot.mybatis.domain.User;
@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方式:
package cn.itsource.springboot.mybatis.mapper;
import java.util.List;
import cn.itsource.springboot.mybatis.domain.User;
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
(7)編寫UserService
package cn.itsource.springboot.mybatis.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import cn.itsource.springboot.mybatis.domain.User;
import cn.itsource.springboot.mybatis.mapper.UserMapper;
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public User get(Long id){
return userMapper.getById(id);
}
}
(8)編寫UserController;
package cn.itsource.springboot.mybatis.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import cn.itsource.springboot.mybatis.domain.User;
import cn.itsource.springboot.mybatis.service.UserService;
@RestController
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/user/{id}")
@ResponseBody
public User get(@PathVariable Long id) {
return userService.get(id);
}
}
//運行訪問:http://127.0.0.1/user/1 就可以看到返回的數據了
5.4.2.使用PageHelper分頁
在application.properties中配置分頁插件
#pagehelper.
pagehelper.autoDialect=true
pagehelper.closeConn=true
在調用mapper的前面開啓分頁功能
package cn.itsource.springboot.mybatis.service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import cn.itsource.springboot.mybatis.domain.User;
import cn.itsource.springboot.mybatis.mapper.UserMapper;
@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);
}
}
5.4.3.完成CRUD
略…
5.5.事務控制
只需要在需要事務控制的方法或類(全部方法有效)上增加 @Transactional註解
5.6.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註解。