當前位置:
首頁 > 最新 > 炙手可熱的微服務框架SpringBoot-入門及資料庫操作

炙手可熱的微服務框架SpringBoot-入門及資料庫操作

閱讀本文大概需要8分鐘,代碼顯示不全向右拖動即可...

SpringBoot入門

1

為什麼要使用SpringBoot

Spring Boot可以說是至少近5年來Spring乃至整個Java社區最有影響力的項目之一,也被人看作是:Java EE開發的顛覆者

2

SpringBoot的優點

去除了之前Spring項目的大量的xml配置文件

簡化了複雜的依賴管理

配合各種starter使用,基本上可以做到自動化配置

快速啟動容器

嵌入式Tomcat,Jetty容器,配合Maven或Gradle等構件工具打成Jar包後,Java -jar 進行部署運行還是蠻簡單的

3

入門HelloWorld

要使用 SpringBoot 框架,先要安裝 git 和 maven,這兩個工具的安裝過程就不贅述了,網上很多;另外本文所使用的 ide 是 IntelliJ IDEA;使用的jdk版本為1.8。

要創建一個基礎的 SpringBoot 項目是一件很簡單的事情,基本常用的創建方法有Maven 和 Spring Initializr兩種,這裡先介紹前者,後者會在後續的文章中介紹。至於如何使用 idea 創建一個 Maven 項目也就不多介紹了。

首先新建一個 Maven 項目引入如下依賴:

org.springframework.boot

spring-boot-starter-parent

1.5.9.RELEASE

org.springframework.boot

spring-boot-starter-web

這裡只引入了一個依賴配置spring-boot-starter-web和一個 parent 配置spring-boot-starter-parent,但是只引入這兩個依賴配置 SpringBoot 就會導入整個 springframework 依賴,以及 logging、slf4j、jackson、tomcat 插件等,所有這些都是一個Web 項目可能需要用到的東西,可以說是特別方便了。

之後在主目錄下創建一個類,用作 SpringBoot 的程序入口,代碼如下:

/**

* SpringBootApplication註解表示其是一個Spring Boot應用

* RestController註解標註這個程序是一個控制器

*/

@SpringBootApplication

@RestController

publicclassApplication{

@RequestMapping("/")

Stringhome(){

return"hello";

}

publicstaticvoidmain(String[] args){

SpringApplication.run(Application.class,args);

}

}

雖然僅僅使用了幾行代碼,但其實這已經是一個完整的 Web 項目了。

之後在工程的 resource 文件夾中創建一個 application.yml 文件,這個文件會被發布在 classpath 中並被 SpringBoot 自動讀取。代碼如下:

server:

port: 8080

tomcat:

uri-encoding: UTF-8

之後運行之前寫好的主程序,然後在瀏覽器的地址欄中輸入http://localhost:8080/。這樣就可以看到我們期望的輸出字元:hello。至此一個最基本的 SpringBoot 應用就開發完成了。

該實例的代碼發布在我的github中,鏈接:https://github.com/MadridSeven/learning-spring-boot/tree/master/spring-boot-hello

4

SpringBoot使用MySql

為了使用JPAMySql,首先在工程中引入它們的 Maven 依賴,代碼如下:

org.springframework.boot

spring-boot-starter-data-jpa

mysql

mysql-connector-java

runtime

其餘的配置與上一個基礎應用一樣。

4.1

實體建模

這個實例,我們考慮建三張數據表,部門、用戶、角色表,其中部門和用戶是一對多關係,用戶和角色是多對多關係。

部門實體類代碼如下所示,這裡省略了Geeter/Setter方法:

@Entity

@Table(name ="department")

publicclassDepartment{

//指定其為主鍵並且自增

@Id

@GeneratedValue(strategy = GenerationType.IDENTITY)

privateLong id;

privateString name;

publicDepartment(){

}

......

}

用戶實體類代碼如下,省略了Geeter/Setter方法和toString方法:

@Entity

@Table(name ="user")

publicclassUserimplementsSerializable{

@Id

@GeneratedValue(strategy = GenerationType.IDENTITY)

privateLong id;

privateString name;

@DateTimeFormat(pattern ="yyyy-MM-dd HH:mm")

privateDate createDate;

publicUser(){

}

//部門和用戶為一對多關係,在部門("一")的實體類中設置ManyToOne關聯

@ManyToOne

//在生成的數據表中使用did表示部門的id

@JoinColumn(name="did")

//防止關係對象遞歸訪問

@JsonBackReference

privateDepartment department;

//用戶和角色為多對多關係

@ManyToMany(cascade = {},fetch = FetchType.EAGER)

//多對多需要使用中間表

@JoinTable(name ="user_role",joinColumns = {@JoinColumn(name ="user_id")},inverseJoinColumns = {@JoinColumn(name ="roles_id")})

privateList roles;

......

}

角色實體建模:

@Entity

@Table(name ="role")

publicclassRoleimplementsSerializable{

@Id

@GeneratedValue(strategy = GenerationType.IDENTITY)

privateLong id;

privateString name;

publicRole(){

}

......

}

4.2

實體持久化

通過建立上面的三個實體類,我們已經實現了使用 Java 的普通對象(POJO)與資料庫表建立映射關係(ORM),接下來使用JPA實現持久化。

用戶實體持久化的代碼如下所示,它是一個介面,繼承了JPA資源庫JpaRepository介面。

//Repository註解說明該介面是一個資源庫

@Repository

publicinterfaceUserRepositoryextendsJpaRepository{

}

使用同樣的方法,可以定義部門實體和角色實體的資源庫介面,只要注意使用的參數是各自的實體對象即可。

這樣就實現了存取資料庫的功能了,我們現在就可以對資料庫進行增刪改查、分頁查詢等操作了。但是有個問題,我們定義的實體資源庫介面並沒有聲明一個方法,也沒有一個實現類,為什麼就可以進行資料庫操作呢?其實我們看看 JpaRepository 的繼承關係就可以了解個大概了。

其中 JpaRepository 繼承於 PagingAndSortingRepository,它提供了分頁和排序功能,PagingAndSortingRepository 繼承於 CrudRepository,它提供了簡單的增刪改查功能。

JPA 還提供了一些自定義生命方法的規則,例如,在介面中使用關鍵字 findBy、readBy、getBy作為方法名的前綴,拼接實體類中的屬性欄位,並可選擇憑藉一些SQL查詢關鍵字來組成一個查詢方法。

4.3

MySql測試

增加一個JPA的配置類,代碼如下所示。

@Configuration

@EnableJpaRepositories(basePackages ="byh.**.repository")

@Order(Ordered.HIGHEST_PRECEDENCE)

//啟用Jpa事務管理

@EnableTransactionManagement(proxyTargetClass =true)

//啟用Jpa資源庫,指定介面資源庫位置

@EntityScan(basePackages ="byh.**.entity")

publicclassJpaConfiguration{

@Bean

PersistenceExceptionTranslationPostProcessorpersistenceExceptionTranslationPostProcessor(){

returnnewPersistenceExceptionTranslationPostProcessor();

}

}

其次在Mysql資料庫伺服器中創建一個資料庫test,不用創建資料庫的表結構,程序運行時將會按照實體的定義自動創建。

然後,在配置文件 application.yml 中使用如下配置:

spring:

profiles:

active: prod

datasource:

url: jdbc:mysql://localhost:3306/test?characterEncoding=utf8

username: root

password: 123456

driver-class-name: com.mysql.jdbc.Driver

jpa:

database: mysql

show-sql: true

hibernate:

ddl-auto: update

naming:

strategy: org.hibernate.cfg.ImprovedNamingStrategy

properties:

hibernate:

dialect: org.hibernate.dialect.MySQL5Dialect

server:

port: 8080

tomcat:

uri-encoding: UTF-8

寫一個主程序來測試,代碼如下:

publicclassMysqlTest{

@Autowired

UserRepository userRepository;

@Autowired

DepartmentRepository departmentRepository;

@Autowired

RoleRepository roleRepository;

@RequestMapping("/find")

publicStringfindPage(){

this.initData();

Pageable pageable =newPageRequest(,10,newSort(Sort.Direction.ASC,"id"));

Page page = userRepository.findAll(pageable);

String result ="";

for(User user: page.getContent()){

result += user.toString();

}

returnresult;

}

publicvoidinitData(){

userRepository.deleteAll();

roleRepository.deleteAll();

departmentRepository.deleteAll();

Department department =newDepartment();

department.setName("開發部");

departmentRepository.save(department);

Role role =newRole();

role.setName("admin");

roleRepository.save(role);

User user =newUser();

user.setName("user");

user.setCreateDate(newDate());

user.setDepartment(department);

List roles = roleRepository.findAll();

user.setRoles(roles);

userRepository.save(user);

}

publicstaticvoidmain(String[] args){

SpringApplication.run(MysqlTest.class,args);

}

}

運行該程序,在瀏覽器中輸入 http://localhost:8080/find,之後會看到從資料庫中查詢到的值。

該實例的代碼發布在我的github中,鏈接:https://github.com/MadridSeven/learning-spring-boot/tree/master/spring-boot-dataBase

筆者水平有限,若有錯漏,歡迎指正,如果轉載以及CV操作,請務必註明出處,謝謝!

版權聲明:本文為原創文章,未經允許不得轉載。

「深入實踐SpringBoot」一書


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 大碼路 的精彩文章:

TAG:大碼路 |