關於Spring Boot的學習心得。安裝,集成Spring Boot 與 mybatis

        前兩天剛上班,然後就被我們的直屬老大叫去分組搞定一些技術,出品成文檔在所有人之間傳閱學習。於是我和其餘倆個小夥同心協力之下搞出了一份成品。其他兩個小夥伴很給力。沒有他們,無法有這份文檔。雖然有些粗略,但還是希望能給大家有所幫助。


Spring Boot學習文檔

 

文檔說明:標有淺灰色背景內容爲擴展內容,忽略閱讀不影響學習Spring Boot的使用。

一.  爲什麼選擇Spring Boot

隨着動態語言的流行(Ruby、Groovy、Scala、Node.js),java的開發顯得格外的笨重,

繁多的配置、低下的開發效率、複雜的部署流程以及第三方技術集成難度大。

在上述環境下,Spring Boot應運而生。它使用“習慣優於配置”(項目中存在大量的配

置,此外還內置一個習慣性的配置,讓你無需手動進行配置)的理念讓你的項目快速運行起來。使用Spring Boot很容易創建一個獨立運行(運行jar,內嵌Servlet容器)、準生產級別的基於Spring框架的項目,使用Spring Boot你可以不用或者只需要很少的Spring配置。

1.spring boot的優缺點

(1)優點

1、快速構建項目。

2、對主流開發框架的無配置集成。

3、項目可獨立運行,無須外部依賴Servlet容器。

4、提供運行時的應用監控。

5、極大的提高了開發、部署效率。

6、與雲計算的天然集成。

(2)缺點:

1、如果你不認同spring框架,也許這就是缺點。

二.idea快速搭建spring boot項目+原理解析

1. 創建簡單web項目(沒有連接數據庫)

         第一步:點擊File—>New—>Project…  彈出以下頁面

        

 

第二步:點擊上圖所示的“1”即Spring Initializr即可創建spring boot應用,“2”和“3”保持默認即可,點擊Next進入下一步。

注意:IntelliJ IDEA的商業版本是自帶這個選項功能的,但是社區版本是沒有這個選項的,需要另外安裝插件“Spring Assistant”。關於商業版IntelliJ IDEA的破解方法在文檔末尾會有說明。

 

第三步:Next之後進入頁面,這些便是傳統創建maven工程的選項了,相信大家不會陌生。

註釋:首先,SpringBoot應用是可以打包成JAR或者WAR形式的。但是官方文檔推薦的是打包成JAR,作爲一個web應用,爲什麼會推薦打包成JAR,這是因爲SpringBoot內集成了Tomcat服務器,當你啓動SpringBoot應用的時候,內置的Tomcat服務器就會啓動,加載web應用。這個可以從啓動SpringBoot項目的時候從控制檯的日誌中可以看出,如下:

 

第四步:上圖填完點擊Next,變到了比較重要的一個頁面

首先,我們創建一個簡單的可以通過瀏覽器輸入http://localhost:8080/訪問的簡單web應用,所以我們依次點擊最左邊的“Web”,再勾選中間的“Web”,接着點擊Next。這個頁面在接下來需要創建連接數據庫的web應用時還會講到。

 

第五步:默認項目名稱,還有根據需要選擇項目存放路徑,點擊“Finish”便可以創建一個Spring boot應用了。

 

成功創建後目錄結構如下:

 

第七步:運行,點擊src下的main目錄裏的SpringBootDemoApplication文件或者test下的SpringBootDemoApplicationTests文件都可以運行測試。

運行後顯示以下類似圖案並且無報錯信息便算搭建成功。

註釋:在我們創建過程中碰到一個問題也分享一下,就是當我們右鍵點擊這個main方法的類時,並沒有找到執行這個應用的選項,即沒有Run方法,這時候點擊下示按鈕便可設置出來。

點擊後彈出下列頁面,點擊左邊的Module,設置右邊的內容,詳細原理請看:http://blog.csdn.net/bug_moving/article/details/62217017

 

 

2. 創建不簡單的web項目(Spring Boot集成Mybatis)

俗話說,一切不連數據庫的web應用都是耍流氓。Spring Boot集成Mybatis的web應用創建過程與前面大致相同,但是,唯一不同的是,在第四步上。

這一頁要勾選三個,分別是“Web”、“MySQL”和“MyBatis”。

第一步:創建數據表

表名: user

id

BigInt

Primary key

用戶編號

name

Varchar(32)

Not null

用戶名

age

Int(3)

Not null

年齡

第二步:創建對應實體類:

 

第三步:創建mapper接口文件

package com.facebank.springbootmybatis.mapper;

import
com.facebank.springbootmybatis.domain.User;
import
org.apache.ibatis.annotations.*;
import
org.springframework.stereotype.Repository;

import
java.util.List;

/**
 
* User映射接口
 
*/
@Mapper

@Repository
  public interface UserMapper {
  
    /**
     * 查詢所有用戶
     * @return
     */
    @Select("SELECT * FROM user")
    List<User> findAll();
  
    /**
     * 查詢總記錄數
     * @return
     */
    @Select("SELECT COUNT(*) FROM user")
    Long findCount();
  
    /**
     * 通過姓名模糊查詢對應用戶
     * @param name
     * @return
     */
    @Select("SELECT * FROM user WHERE name LIKE \"%\"#{name}\"%\"")
    List<User> findByName(String name);
  
    /**
     * 插入/新增新用戶
     * @param user
     * @return
     */
    @Insert("INSERT INTO user(name, age) VALUES(#{name}, #{age})")
    int saveUser(User user);
  
    /**
     * 更新用戶信息
     * @param user
     * @return
     */
    @Update("UPDATE user SET name = #{name},age = #{age} WHERE id = #{id}")
    int updateUser(User user);
  
    /**
     * 根據用戶id刪除用戶信息
     * @param id
     * @return
     */
    @Delete("DELETE FROM user WHERE id = #{id}")
    int deleteById(Integer id);
  
  }

 

值得注意的是可以通過註解實現dao層的構建,摒棄了傳統使用一個Mapper類對應一個Xml文件的繁雜方式,有時候還會因爲找不到對應業務的方法在哪而平白浪費開發時間,降低開發效率。與此對比的是,這種註解的方式可以一一對應查看修改,清晰。

在這個接口上方使用了兩個註解,分別是@Mapper@Repository

         (1)@Mapper:這個註解是爲了Spring Boot的自動配置機制使用的,通過它可以讓整個環境找到這個mapper接口,從而實現數據庫的連接和數據獲取。

(2)@Repository:這個註解則是爲了讓Service層在調用mapper時,需要使用@Autowired註解自動注入這個mapper,若沒有,則直接編譯錯誤,報Could not found錯誤。

增刪改查對應着四個註解

(3)@Insert

(4)@Delete

(5)@Update

(6)@Select

可以發現,在註解的括號中書寫SQL,若是基本類型或者是基本類型的包裝類型,則直接對應參數名稱在sql中用#{xxx}的方式注入。若是自定義類型(例如User),則也可直接使用自定義類型中的屬性變量名稱在sql中以#{xxx}注入,而不是#{user.xxx}。

 

第四步:創建service接口

package com.facebank.springbootmybatis.service;

import
com.facebank.springbootmybatis.domain.User;

import
java.util.List;

/**
 
* 用戶表接口
 
*/
public interface UserService {

   
/**
    
* 插入新用戶
    
* @param user
    
* @return
    
*/
   
int saveUser(User user);

   
/**
    
* 根據姓名查詢用戶
    
* @param name
    
* @return
    
*/
   
List<User> findByName(String name);

   
/**
    
* 查詢所有用戶
    
* @return
    
*/
   
List<User> findAll();

   
/**
    
* 查詢總記錄數
    
* @return
    
*/
   
Long findCount();

   
/**
    
* 更新用戶信息
    
* @param user
    
* @return
    
*/
   
int updateUser(User user);

   
/**
    
* 根據用戶id刪除用戶
    
* @param id
    
* @return
    
*/
   
int deleteById(Integer id);
}

 

 

第五步:創建service接口對應實現類

package com.facebank.springbootmybatis.service.impl;

import
com.facebank.springbootmybatis.domain.User;
import
com.facebank.springbootmybatis.mapper.UserMapper;
import
com.facebank.springbootmybatis.service.UserService;
import
org.springframework.beans.factory.annotation.Autowired;
import
org.springframework.stereotype.Service;

import
java.util.List;

/**
 
* 用戶表service實現
 
*/
@Service
public class UserServiceImpl implements UserService {

   
@Autowired
   
UserMapper userMapper;

   
@Override
   
public int saveUser(User user) {
       
return userMapper.saveUser(user);
   
}

   
@Override
   
public List<User> findByName(String name) {
       
List<User> users = userMapper.findByName(name);
       
return users;
   
}

   
@Override
   
public List<User> findAll() {
       
return userMapper.findAll();
   
}

   
@Override
   
public Long findCount() {
       
return userMapper.findCount();
   
}

   
@Override
   
public int updateUser(User user) {
       
return userMapper.updateUser(user);
   
}

   
@Override
   
public int deleteById(Integer id) {
       
return userMapper.deleteById(id);
   
}
}

 

第六步:創建Controller

package com.facebank.springbootmybatis.controller;


import
com.facebank.springbootmybatis.domain.User;
import
com.facebank.springbootmybatis.service.UserService;
import
org.springframework.beans.factory.annotation.Autowired;
import
org.springframework.stereotype.Controller;
import
org.springframework.web.bind.annotation.*;

import
java.util.List;

@Controller
@RequestMapping
("/user")
public class UserController {

   
@Autowired
   
private UserService userService;

   
@GetMapping("/findAll")
   
@ResponseBody
   
public List<User> findAll() {
       
return userService.findAll();
   
}

   
@GetMapping("/findByName/{name}")
   
@ResponseBody
   
public List<User> findByName(@PathVariable("name") String name) {
       
return userService.findByName(name);
   
}

   
@GetMapping("/findCount")
   
@ResponseBody
   
public String findCount() {
       
Long count = userService.findCount();
       
return "總記錄數爲:" + count;
   
}

   
@PostMapping("/saveUser")
   
@ResponseBody
   
public String saveUser(User user) {
       
int row = userService.saveUser(user);
       
if (row > 0) {
           
return "添加成功";
       
}
       
return "添加失敗";
   
}

   
@PutMapping("/updateUser")
   
@ResponseBody
   
public String updateUser(User user) {
       
int row = userService.updateUser(user);
       
if (row > 0) {
           
return "更新成功";
       
}
       
return "更新失敗";
   
}

   
@DeleteMapping("/deleteById/{id}")
   
@ResponseBody
   
public String deleteById(@PathVariable("id") Integer id) {
       
int row = userService.deleteById(id);
       
if (row > 0) {
           
return "刪除成功";
       
}
       
return "刪除失敗";
   
}

}

 

註釋:這裏可以看到,相對於SpringMVC傳統使用@Controller(value=’’,method= RequestMethod.POST) 這種在括號中設置Post或者Get或者其他請求方式的書寫方式。Spring Boot提供了更爲清晰的註解來分別區分開來。

       (1)@GetMapping  對應Get請求,例如查詢數據等業務

       (2)@PostMapping 對應Post請求,例如添加/保存數據等業務

(3)@PutMapping  對應更新數據等業務

(4)@DeleteMapping 對應刪除數據等業務

 

第七步:測試

首先,點開SpringbootMybatisApplication類,右鍵或者菜單上點擊運行。

然後,點擊Tools à Test RESTful webservice 即可打開idea自帶的測試web應用的框架。

 

增—訪問地址:http://localhost:8080/user/saveUser

測試結果:

數據庫也毫無問題,Good Job!

 

同理:

刪:http://localhost:8080/user/deleteById/5

改:http://localhost:8080/user/updateUser

查:http://localhost:8080/user/findAll

 

以上測試均無問題。期待你自己run一次。

 

 

本程序可上Github拷貝參考,最好就自己做一遍啦。

https://github.com/KrishnnaOUT/spring-mybatis.git

 

 

Spring Boot 靜態資源訪問

關於Spring Boot項目,它與傳統項目不同的是,傳統項目的頁面和css、js等靜態資源都是放在WEB-INF下的。當然,css和js也有放在跟WEB-INF同級目錄下的。當然,這不是我們討論的重點。

       Spring Boot應用則是別具一格。他的css、js等靜態資源都放置在src/main/resouces下的static目錄下。注意:這個static目錄就是訪問的根目錄。舉個例子,在static目錄中放一張圖片A.jpg,那麼啓動程序後,在瀏覽器輸入http://localhost:8080/A.jpg即可訪問到該圖片。

       除此之外。SpringBoot是不支持Jsp的,這是因爲JSP在內嵌的Servlet的容器上運行有一些問題(內嵌Tomcat、Jetty不支持以jar形式運行JSP,Undertow不支持JSP)。

那該怎麼辦呢。很遺憾的是,唯有學習才能繼續開發了。SpringBoot提供了大量模板引擎,包含括FreeMarker、Groovy、Thymeleaf、Velocity和Mustache,Spring Boot中推薦使用Themeleaf作爲模板引擎,因爲Thymeleaf提供了完美的Spring MVC的支持。

而這些Thymeleaf文件(實際上是後綴爲.html的文件)放置在templates目錄下的。

3.  相關原理分析

(一)註解分析

(1)    @EnableConfigurationProperties:自動映射一個pojo到springboot的配置文件(默認是application.properties文件)的屬性集。

(2)    @RestController:它繼承自@Controller註解,放在表現層,我們都知道,返回json需要@ResponseBody和@Controller配合來標識當前類是一個控制器servlet,@RestController可以代替以上兩個註解來使用。而開發rest服務的時候就要使用@RestController。

(3)  @SpringBootApplication:是springboot最重要的一個註解,用於快捷配置啓動類。源碼說明它只是一個配置文件類,它會被@ComponentScan掃描到。源碼如下:

分析:可以知道,在@SpringBootApplication註解裏比較重要的是這個三個註解:@Configuration@EnableAutoConfiguration

@ComponentScan。即若不使用@SpringBootApplication

使用以上三個註解一樣可以達到同樣的目的。

使用方法:當用idea創建Spring Boot項目時,便自動在主包下創建好了這個配置類。直接便可以運行。它會自動掃描所在類的同級包以及下級包裏的Bean(若爲JPA項目還可以掃描標註@Entity的實體類)。建議入口類放置的位置在groupId+arctifactID組合的包名下。

                

排除配置類:若有時候多個配置類存在,而我們想要關閉特定的自動配置應該使用@SpringBootApplication註解的exclude參數,例如:@SpringBootApplication(exclude={myConfiguration.class})

(4)        @EnableAutoConfigurationSpring Boot 根據類路徑中的jar包依賴爲當前項目進行自動配置。簡單來說,以前我們都是通過手動集成各種xml配置文件,然後在WEB-INF下的web.xml手動填寫一下配置的位置來註冊。而Spring Boot通過這個簡單的註解讓這一切都給你自動配置好了,是不是很貼心。

例如:添加了spring-boot-starter-web依賴,會自動添加TomcatSpring MVC的依賴,那麼Spring Boot會對TomcatSpring MVC進行自動配置。

(二)Spring Boot的配置文件

         Spring Boot使用一個全局的配置文件Application.yml 或者Application.properties,放置在src/main/resources目錄或者類路徑的/config下。

       Spring Boot不僅支持常規的properties配置文件,還支持yaml語言的配置文件,yaml是以數據爲中心的語言,在配置數據的時候具有面向對象的特徵。

       Spring Boot的全局配置文件的作用是對一些默認配置的配置值進行修改。如修改Tomcat默認的端口號,並將默認的訪問路徑“/”修改爲“/helloboot”,可以在Application.properties中添加以下代碼即可:

 

                   該文件還是設置數據源、數據庫連接池的地方。如下。

 

(三)pom.xml

(1)spring-boot-starter-parent

 

         註釋:Maven的用戶可以通過繼承spring-boot-starter-parent項目來獲得一些合理的默認配置。這個parent提供了以下特性:

  • 默認使用Java 8
  • 使用UTF-8編碼
  • 一個引用管理的功能,在dependencies裏的部分配置可以不用填寫version信息,這些version信息會從spring-boot-dependencies裏得到繼承。
  • 識別過來資源過濾(Sensible resource filtering.
  • 識別插件的配置(Sensible plugin configuration (exec plugin, surefire, Git commit ID, shade).
  • 能夠識別application.propertiesapplication.yml類型的文件,同時也能支持profile-specific類型的文件(如: application-foo.properties and application-foo.yml,這個功能可以更好的配置不同生產環境下的配置文件)
  • maven把默認的佔位符${}改爲了@..@(這點大家還是看下原文自己理解下吧,我個人用的也比較少 
    since the default config files accept Spring style placeholders (${
    }) the Maven filtering is changed to use @..@ placeholders (you can override that with a Maven property resource.delimiter).

 

(2)starter pom

         本項目中使用到以下starter pom:

        

<dependency>
  
<groupId>org.springframework.boot</groupId>
  
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
  
<groupId>org.mybatis.spring.boot</groupId>
  
<artifactId>mybatis-spring-boot-starter</artifactId>
 
 <version>1.3.1</version>
</dependency>

<dependency>
  
<groupId>org.springframework.boot</groupId>
  
<artifactId>spring-boot-starter-test</artifactId>
  
<scope>test</scope>
</dependency>

 

Spring Boot爲我們提供了簡化企業級開發絕大多數場景的starterpom, 只要使用了應用場景所需要的starterpom, 相關的技術配置將會刪除,就可以得到SpringBoot爲我們提供的自動配置的Bean。簡單來說,他幫我們封裝好了,就等着我們在pom文件中添加依賴就可以用了。

 

1. 官方starter pom

名稱

描述

spring-boot-starter

核心Spring Boot starter,包括自動配置支持,日誌和YAML

spring-boot-starter-actuator

生產準備的特性,用於幫你監控和管理應用

spring-boot-starter-amqp

對”高級消息隊列協議”的支持,通過spring-rabbit實現

spring-boot-starter-aop

對面向切面編程的支持,包括spring-aop和AspectJ

spring-boot-starter-batch

對Spring Batch的支持,包括HSQLDB數據庫

spring-boot-starter-cloud-connectors

對Spring Cloud Connectors的支持,簡化在雲平臺下(例如,Cloud Foundry 和Heroku)服務的連接

spring-boot-starter-data-elasticsearch

對Elasticsearch搜索和分析引擎的支持,包括spring-data-elasticsearch

spring-boot-starter-data-gemfire

對GemFire分佈式數據存儲的支持,包括spring-data-gemfire

spring-boot-starter-data-jpa

對”Java持久化API”的支持,包括spring-data-jpaspring-orm和Hibernate

spring-boot-starter-data-mongodb

對MongoDB NOSQL數據庫的支持,包括spring-data-mongodb

spring-boot-starter-data-rest

對通過REST暴露Spring Data倉庫的支持,通過spring-data-rest-webmvc實現

spring-boot-starter-data-solr

對Apache Solr搜索平臺的支持,包括spring-data-solr

spring-boot-starter-freemarker

對FreeMarker模板引擎的支持

spring-boot-starter-groovy-templates

對Groovy模板引擎的支持

spring-boot-starter-hateoas

對基於HATEOAS的RESTful服務的支持,通過spring-hateoas實現

spring-boot-starter-hornetq

對”Java消息服務API”的支持,通過HornetQ實現

spring-boot-starter-integration

對普通spring-integration模塊的支持

spring-boot-starter-jdbc

對JDBC數據庫的支持

spring-boot-starter-jersey

對Jersey RESTful Web服務框架的支持

spring-boot-starter-jta-atomikos

對JTA分佈式事務的支持,通過Atomikos實現

spring-boot-starter-jta-bitronix

對JTA分佈式事務的支持,通過Bitronix實現

spring-boot-starter-mail

javax.mail的支持

spring-boot-starter-mobile

spring-mobile的支持

spring-boot-starter-mustache

對Mustache模板引擎的支持

spring-boot-starter-redis

對REDIS鍵值數據存儲的支持,包括spring-redis

spring-boot-starter-security

spring-security的支持

spring-boot-starter-social-facebook

spring-social-facebook的支持

spring-boot-starter-social-linkedin

spring-social-linkedin的支持

spring-boot-starter-social-twitter

spring-social-twitter的支持

spring-boot-starter-test

對常用測試依賴的支持,包括JUnit, Hamcrest和Mockito,還有spring-test模塊

spring-boot-starter-thymeleaf

對Thymeleaf模板引擎的支持,包括和Spring的集成

spring-boot-starter-velocity

對Velocity模板引擎的支持

spring-boot-starter-web

對全棧web開發的支持,包括Tomcat和spring-webmvc

spring-boot-starter-websocket

對WebSocket開發的支持

spring-boot-starter-ws

對Spring Web服務的支持

 

相關starter pom具體資料可以查看官網:

http://docs.spring.io/spring-boot/docs/1.4.1.RELEASE/reference/htmlsingle/#using-boot-starter

 

2. 第三方 starter pom(不常用,不做記錄。)

 

三.spring Boot其他相關知識點(擴展)

https://www.jianshu.com/p/9a08417e4e84

 

推薦學習文獻:JavaEE開發的顛覆者 Spring Boot實戰



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