SpringBoot 05_集成SpringDataJpa


你還在為項目的集成頭疼嗎?你還在為管理大量的配置文件煩惱嗎?如果是,用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

image

2:輸入項目相關信息 –-> Next

這里的信息根據實際情況自動填寫,這里的是項目默認的。

image

3:添加項目依賴,這里添加兩個依賴 –> Next。

如果是web項目,則Web –> Web

image

添加JPA依賴;SQL —> JPA

image

添加完了之后,可以在右側看到這個項目集成了哪些依賴,目前是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

  • 查看數據庫

image

  • 測試接口,用postman
    • 添加接口:localhost:8080/api/users                請求方式:POST

            image

sql:Hibernate: insert into t_user (home_address, home_tel, user_name) values (?, ?, ?)

image

    • 更新接口:localhost:8080/api/users/1              請求方式:PUT

               image

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=?

image

備注:

Hibernate的更新是先查詢,再更新,為什么這么做是和對象的四種狀態有關。

    • 查找接口:localhost:8080/api/users/1                 請求方式:GET

                image

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

               image

sql:

Hibernate: delete from t_user where id=?

image

備注:

你可能會發現更新,獲取,刪除的接口都是一樣的,其實更新還帶了請求體的,而在字面上這獲取和刪除的接口是一樣的,你可能會在實驗的時候出錯,那多半是因為你沒注意到請求方式的問題,也就是我在刪除中用紅框標記的部分。

我這里用的是Restful的請求方式,對於請求接口,請結合上下文進行理解,比如說刪除:localhost:8080/api/users/1,刪除的請求方式是DELETE,則說明我要刪除編號為1的用戶。

10:小結

終於寫完了,歡迎閱讀,指出文中不足,大家共同進步。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM