最近在用Java重寫之前實習生用.netcore寫的微信后台應用。
規定用Spring Boot框架,PostgreSQL數據庫。之前一直習慣於基於XML的Spring app,也沒用過PostgreSQL,再加上數據庫設計的不好,還沒有任何代碼文檔,一臉的懵逼。。。
這里記錄下在重寫過程中遇到的一些問題,便於后期查閱:
1. PostgreSQL 9.6.6:
(1) 使用pgAdmin4, 首先遇到的問題就是啟動過慢,所占內存大,在連接本地數據庫后執行簡單的select耗時不少。個人認為啟動過慢,所占內存大是pgAdmin4的問題,但執行SQL語句慢,估計是配置的問題,目前還沒有在postgresql.conf中找到對應的配置項
(2) 對表名,列名不區分大小寫,但是卻都轉成小寫再運行sql。這就導致如下的sql,
select * from Question
變成
select * from question
再運行,然后PostgreSQL去找question表,發現沒有(因為建的是Question表...),報錯:
ERROR: relation "question" does not exist LINE 1: select * from Question
解決辦法:表名,列名均加上"", 如
select * from "Question"
(3) 因為沒有訪問server上目錄的權限,導致通過pgAdmin沒辦法備份/還原
解決辦法:
1. 創建各個表
2. 導出表數據到本地
3. 導入數據到數據庫表
COPY "Question"("QuestionID","QuestionName","QuestionType","QuestionItem") FROM 'C:\Users\~\Question.csv' DELIMITER ',' CSV HEADER;
注意外鍵和數據導入順序。
2. Spring Data JPA:
在使用Spring Data JPA之前,用過Hibernate+JPA注解和Mybatis這樣的ORM框架。個人理解Spring Data JPA就是在Hibernate和JPA的基礎上又封裝了一層,定義了像@Query, @Modifying這樣的注解以及CrudRepository這樣的接口,極大方便Dao層的開發。
我把我在開發過程中查找的一些blog放在這里,方便以后查閱。
spring-boot-crudrepository-example
要是想快速上手,可以考慮直接參照第一篇blog寫。
(1) 在使用Spring Data JPA編寫Dao層時,可以直接定義業務接口,並且只需要繼承CrudRepository或者JpaRepository(后者繼承自前者)就能實現基本的crud操作
(2) JpaRepository相比較於CrudRepository,多了分頁的功能
(3) Spring Data JPA根據方法名及規則,生成SQL語句
(4) JPQL類似Hibernate的HQL
這里我還是得記錄下開發過程中遇到的一對多,多對一的問題和如何使用。
在項目里,可以不使用類似一對多,多對一的注解,但是就得需要在代碼中通過一次變多次SQL查詢 / 寫join SQL語句的方式達到相同的效果,相比之下注解更加簡單。在Spring Data JPA中,@OneToMany, @ManyToOne這樣的關系型注解,說到底還是Hibernate的實現。
在同一個數據庫字段被多個類屬性映射時,需要設置insertable = false, updateable = false.
在用Intellij IDEA寫JPQL時,注意不要讓編輯器自帶的JPQL檢查給糊弄了,並不准確,建議關掉JPQL檢查。
3. Spring Boot
沒的說,一堆資料,HERE
Done!