你還在為項目的集成頭疼嗎?你還在為管理大量的配置文件煩惱嗎?如果是,用SpringBoot吧!今天主要介紹如果在SpringBoot的基礎上創建一個集成了SpringDataJpa的項目,至於SpringDataJpa是什么,如果用過Hibernate的同學想必都在為不用寫sql在慶幸吧,想要了解SpringDataJpa的話,我以后會寫相關的博客分享給大家。
下面就帶大家來創建一個SpringBoot + SpringDataJpa的項目,創建的環境:
開發工具 :IDEA
SpringBoot版本:SpringBoot1.5.6
Maven版本:Maven3.5.0
JDK版本:1.8
Mysql版本:5.6
創建方式:Spring Initializr
1:打開IDEA,File –> New project –> Spring Initializr –> Next
2:輸入項目相關信息 –-> Next
這里的信息根據實際情況自動填寫,這里的是項目默認的。
3:添加項目依賴,這里添加兩個依賴 –> Next。
如果是web項目,則Web –> Web
添加JPA依賴;SQL —> JPA
添加完了之后,可以在右側看到這個項目集成了哪些依賴,目前是Web和JPA。之后選擇 Next
4:輸入項目名之后點擊完成
至此關於JPA的集成就集成好了,但是想真正的運行起來還是缺東西,下面我們就開始讓項目跑起來吧。
5:添加mysql jdbc連接依賴
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>6.0.6</version> </dependency>
6:在application.properties/application.yml中配置連接信息,使用Spring Initializr默認生成的是application.properties
########################################################
###數據庫連接信息
########################################################
#連接地址
spring.datasource.url=jdbc:mysql://localhost:3306/testJPA
#數據庫賬戶
spring.datasource.username=root
#數據庫密碼
spring.datasource.password=root
#數據庫驅動
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
########################################################
### Java Persistence Api JPA相關配置
########################################################
#指定數據庫類型
spring.jpa.database=mysql
#控制台打印sql
spring.jpa.show-sql=true
#建表策略,這里用update,即根據實體更新表結構
spring.jpa.hibernate.ddl-auto=update
#表中字段命名策略,這里要引入hibernate的核心包,不然這個命名策略會報錯
spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
spring.jpa.hibernate.naming.strategy=org.hibernate.cfg.ImprovedNamingStrategy
#方言
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
7:在這里運行可能會出現Bug:Caused by: java.lang.NoSuchMethodError: org.hibernate.engine.spi.SessionFactoryImplementor.getProperties()Ljava/util/Properties;
- 出現原因。理論上SpringBoot集成SpringDataJpa是不需要加入hibernate-core依賴的,但是就是因為字段命名策略的引用導致了需要加入hibernate5.x之間的版本。而SpringBoot-jpa-starter的版本腳底
- 解決方案,參考:http://www.cnblogs.com/homeword/p/7456372.html
8:實戰
- 創建實體類
@Data @Entity @Table(name = "t_user") public class User { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; @Column private String userName; @Column(columnDefinition = "varchar(255) comment '居住地址'") private String homeAddress; private Long homeTel; }
- 創建UserRepository.java
@Repository public interface UserRepository extends JpaRepository<User, Long> { }
- 創建UserController.java使用UserRepository
@RequestMapping("/api") @RestController public class UserController { @Autowired private UserRepository userRepository; /** * 添加用戶 * @param user 用戶信息 * @return 添加成功后的用戶id */ @PostMapping("/users") public ServerResult saveUser(@RequestBody User user){ User saveUser = userRepository.save(user); return new ServerResult("添加成功",saveUser.getId()); } /** * 更新用戶信息 * @param user 用戶信息 * @param id 用戶id * @return 更新結果 */ @PutMapping("/users/{id}") public ServerResult updateUserById(@RequestBody User user,@PathVariable Long id){ user.setId(id); userRepository.save(user); return new ServerResult("修改成功",id); } /** * 獲取用戶信息 * @param id 用戶id * @return 用戶信息 */ @GetMapping("/users/{id}") public ServerResult findUserById(@PathVariable Long id){ User user = userRepository.findOne(id); return new ServerResult("查找成功",user); } /** * 刪除用戶信息 * @param id 用戶id * @return 刪除結果 */ @DeleteMapping("/users/{id}") public ServerResult deleteUserById(@PathVariable Long id){ userRepository.delete(id); return new ServerResult("刪除成功",null); } }
9:啟動項目
- 查看項目啟動日志,發現會創建一張表,之前數據庫中是不存在user表的
Hibernate: create table t_user (id bigint not null auto_increment, home_address varchar(255) comment '居住地址', home_tel bigint, user_name varchar(255), primary key (id)) engine=MyISAM
- 查看數據庫
- 測試接口,用postman
- 添加接口:localhost:8080/api/users 請求方式:POST
sql:Hibernate: insert into t_user (home_address, home_tel, user_name) values (?, ?, ?)
- 更新接口:localhost:8080/api/users/1 請求方式:PUT
sql:
Hibernate: select user0_.id as id1_0_0_, user0_.home_address as home_add2_0_0_, user0_.home_tel as home_tel3_0_0_, user0_.user_name as user_nam4_0_0_ from t_user user0_ where user0_.id=?
Hibernate: update t_user set home_address=?, home_tel=?, user_name=? where id=?
備注:
Hibernate的更新是先查詢,再更新,為什么這么做是和對象的四種狀態有關。
- 查找接口:localhost:8080/api/users/1 請求方式:GET
sql:
Hibernate: select user0_.id as id1_0_0_, user0_.home_address as home_add2_0_0_, user0_.home_tel as home_tel3_0_0_, user0_.user_name as user_nam4_0_0_ from t_user user0_ where user0_.id=?
這個就不截圖了,查詢數據庫沒變化
- 刪除接口:localhost:8080/api/users/1 請求方式:DELETE
sql:
Hibernate: delete from t_user where id=?
備注:
你可能會發現更新,獲取,刪除的接口都是一樣的,其實更新還帶了請求體的,而在字面上這獲取和刪除的接口是一樣的,你可能會在實驗的時候出錯,那多半是因為你沒注意到請求方式的問題,也就是我在刪除中用紅框標記的部分。
我這里用的是Restful的請求方式,對於請求接口,請結合上下文進行理解,比如說刪除:localhost:8080/api/users/1,刪除的請求方式是DELETE,則說明我要刪除編號為1的用戶。
10:小結
終於寫完了,歡迎閱讀,指出文中不足,大家共同進步。