SpringBoot精髓

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.代碼示例

  1. 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> { }

  1. Repository是一個空接口,即是一個標記接口;
  2. 若我們定義的接口繼承了Repository,則該接口會被IOC容器識別爲一個Repository Bean納入到IOC容器中,進而可以在該接口中定義滿足一定規範的方法。
  3. 實際上也可以通過@RepositoryDefinition,註解來替代繼承Repository接口。
  4. 查詢方法以find | read | get開頭;
  5. 涉及查詢條件時,條件的屬性用條件關鍵字連接,要注意的是條件屬性以首字母大寫。
    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註解。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章