摘要:的配置后在其他低版本的中也有使用這種配置的,具體根據(jù)版本而定。等注解是的相關(guān)知識,后面的文章將詳細(xì)講述。
??在我們的實際開發(fā)的過程中,無論多復(fù)雜的業(yè)務(wù)邏輯到達(dá)持久層都回歸到了“增刪改查”的基本操作,可能會存在關(guān)聯(lián)多張表的復(fù)雜sql,但是對于單表的“增刪改查”也是不可避免的,大多數(shù)開發(fā)人員對于這個簡單而繁瑣的操作都比較煩惱。
??為了解決這種大量枯燥的簡單數(shù)據(jù)庫操作,大致的解決該問題的有三種方式
1、使用類似Hibernate的ORM框架,通過Hibernate完成java實體類和數(shù)據(jù)庫之間的映射,完成簡單的單表的“增刪改查”
2、使用代碼生成工具生成單表的“增刪改查”代碼,省去我們手動編寫的過程(我將在后面的文章中給出可定制化生成代碼方法,敬請關(guān)注!)
3、使用Spring-data-jpa這樣的技術(shù),它實現(xiàn)了模板Dao層,只需要在Dao,通過繼承一個接口,就可輕松完成“增刪改查”,具體使用方法如下:
一、在pom.xml文件中添加如下依賴
org.springframework.boot spring-boot-starter-data-jpa
二、在application.yml文件中配置數(shù)據(jù)庫信息和jpa信息(注意:不同的SpringBoot版本jpa配置的方法可能會有不同)
spring: datasource: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8 username: root password: 123456 jpa: hibernate: ddl-auto: update
??個人推薦使用yml格式的配置文件,看起來更加清晰簡單(注意:每個配置屬性的縮進(jìn)是兩個空格,這點一定要注意,不然會出現(xiàn)配置錯誤的情況,也可以在開發(fā)工具中安裝相關(guān)的yml的插件方便查看)。
jpa的配置后 jpa.hibernate.ddl-auto= update,在其他低版本的SpringBoot中也有使用spring.jpa.properties.hibernate.hbm2ddl.auto=create-drop 這種配置的,具體根據(jù)版本而定。該配置的主要作用是:自動創(chuàng)建、更新、驗證數(shù)據(jù)庫結(jié)構(gòu)
1、create:每次加載hibernate時都會刪除上一次的生成的表,然后根據(jù)你的model類再重新來生成新表,哪怕兩次沒有任何改變也要這樣執(zhí)行,這就是導(dǎo)致數(shù)據(jù)庫表數(shù)據(jù)丟失的一個重要原因(一般只會在第一次創(chuàng)建時使用)
2、create-drop:每次加載hibernate時根據(jù)model類生成表,但是sessionFactory一關(guān)閉,表就自動刪除
3、update:最常用的屬性,第一次加載hibernate時根據(jù)model類會自動建立起表的結(jié)構(gòu)(前提是先建立好數(shù)據(jù)庫),以后加載hibernate時根據(jù)model類自動更新表結(jié)構(gòu),即使表結(jié)構(gòu)改變了但表中的行仍然存在不會刪除以前的行。要注意的是當(dāng)部署到服務(wù)器后,表結(jié)構(gòu)是不會被馬上建立起來的,是要等應(yīng)用第一次運行起來后才會
4、validate:每次加載hibernate時,驗證創(chuàng)建數(shù)據(jù)庫表結(jié)構(gòu),只會和數(shù)據(jù)庫中的表進(jìn)行比較,不會創(chuàng)建新表,但是會插入新值
三、創(chuàng)建實體
創(chuàng)建一個User類,配置好上面的信息后,啟動項目,對應(yīng)的數(shù)據(jù)庫就會自動生成對應(yīng)的表結(jié)構(gòu)。@Table、@Entity、@Id等注解是jpa的相關(guān)知識,后面的文章將詳細(xì)講述。
@Table(name = "t_user") @Entity public class User { @Id @GeneratedValue private Long id; @Column private String name;//姓名 @Column private Integer age;//年齡 // ..... }
四、創(chuàng)建數(shù)據(jù)庫訪問Dao層
@Repository public interface UserRepository extends JpaRepository{ /** * 根據(jù)年紀(jì)查詢用戶 * @param age * @return */ User findByAge(Integer age); /** * 根據(jù)年紀(jì)和姓名查詢 * @param name * @param age * @return */ User findByNameAndAge(String name, Integer age); /** * 對于復(fù)雜查詢可以使用@Query 編寫sql * @param name * @return */ @Query("from User u where u.name=:name") User findUser(@Param("name") String name); }
??該Dao成繼承了JpaRepository接口,指定了需要操作的實體對象和實體對象的主鍵類型,通過查看JpaRepository接口源碼可以看到,里面已經(jīng)封裝了創(chuàng)建(save)、更新(save)、刪除(delete)、查詢(findAll、findOne)等基本操作的函數(shù),使用起來非常方便了,但是還是會存在一些復(fù)雜的sql,spring-data-jpa還提供了一個非常方便的方式,通過實體屬性來命名方法,它會根據(jù)命名來創(chuàng)建sql查詢相關(guān)數(shù)據(jù),對應(yīng)更加復(fù)雜的語句,還可以用直接寫sql來完成,具體例子如上所示。
五、單元測試
使用junit進(jìn)行單元測試,代碼如下
/** * * @author 明天的地平線 * * SpringBoot 之前的版本配置單元測試類時使用 @SpringApplicationConfiguration(Application.class) * SpringBoot 1.5.9 改用@SpringBootTest(classes = Application.class) * */ @RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest(classes = Application.class) public class JpaTest { @Autowired private UserRepository userRepository; /** * 新增用戶 * @throws Exception */ @Test public void testAddUser() throws Exception { User user = new User(); user.setName("zhangsan"); user.setAge(12); userRepository.save(user); User user2 = new User(); user2.setName("lishi"); user2.setAge(22); userRepository.save(user2); } /** * 刪除用戶(根據(jù)對象刪除時,必須要有ID屬性) * @throws Exception */ @Test public void testDelUser() throws Exception { User user = new User(); user.setId(1L); user.setName("zhangsan"); user.setAge(12); userRepository.delete(user); } /** * 修改用戶信息 * @throws Exception */ @Test public void testUpdUser() throws Exception { User user = new User(); user.setId(2L); user.setName("zhangsan11"); user.setAge(122); userRepository.save(user); } /** * 查詢用戶 * @throws Exception */ @Test public void testQueryUser() throws Exception { User user = userRepository.findByAge(22); System.out.println(user.getName()); User user2 = userRepository.findByNameAndAge("lishi", 22); System.out.println(user2.getName()); User user3 = userRepository.findUser("zhangsan11"); System.out.println(user3.getName()); } /** * 查詢所有用戶 * @throws Exception */ @Test public void testQueryUserList() throws Exception { Listlist = userRepository.findAll(); for (User user : list) { System.out.println(user.getName()); } } }
數(shù)據(jù)庫數(shù)據(jù)如下:
??本文主要以SpringBoot整合jpa為主,Spring-data-jpa的內(nèi)容遠(yuǎn)比以上內(nèi)容豐富和強大,例如分頁排序、對原生sql的支持等,后續(xù)將對此內(nèi)容進(jìn)行專門講解,感興趣的小伙伴可以關(guān)注我的博客和微信公眾號。
Git代碼地址:https://gitee.com/Somta/Sprin...
原文地址:http://somta.com.cn/#/blog/vi...
本文由明天的地平線創(chuàng)作,如想了解更多更詳細(xì)的內(nèi)容,請關(guān)注一下公眾號,公眾號內(nèi)將進(jìn)行最新最實時的更新!
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/69754.html
摘要:當(dāng)禁用時,所有關(guān)聯(lián)對象都會即時加載。不同的驅(qū)動在這方便表現(xiàn)不同。參考驅(qū)動文檔或充分測試兩種方法來決定所使用的驅(qū)動。需要適合的驅(qū)動。系統(tǒng)默認(rèn)值是設(shè)置字段和類是否支持駝峰命名的屬性。 ??上篇文章我們介紹了SpringBoot和MyBatis的整合,可以說非常簡單快捷的就搭建了一個web項目,但是在一個真正的企業(yè)級項目中,可能我們還需要更多的更加完善的框架才能開始真正的開發(fā),比如連接池、分...
摘要:基于最新的,是你學(xué)習(xí)的最佳指南。驅(qū)動程序通過自動注冊,手動加載類通常是不必要。由于加上了注解,如果轉(zhuǎn)賬中途出了意外和的錢都不會改變。三的方式項目結(jié)構(gòu)相比于注解的方式主要有以下幾點改變,非常容易實現(xiàn)。公眾號多篇文章被各大技術(shù)社區(qū)轉(zhuǎn)載。 Github 地址:https://github.com/Snailclimb/springboot-integration-examples(Sprin...
摘要:要是緊急排查個問題,媽蛋雖然有很多好處,比如和底層的無關(guān)。你的公司如果有,是不允許你亂用的。 知乎看到問題《SpringBoot開發(fā)使用Mybatis還是Spring Data JPA??》,順手一答,討論激烈。我實在搞不懂spring data jpa為啥選了hibernate作為它的實現(xiàn),是Gavin King的裙帶關(guān)系么?DAO層搞來搞去,從jdbc到hibernate,從top...
摘要:以下內(nèi)容基于如果你使用的也是相同的技術(shù)棧可以繼續(xù)往下閱讀,如果不是可以當(dāng)作參考。編寫的四種方式裸寫最簡單最粗暴也是使用最多的一種方式,在寫的多了之后可以用生成工具生成。 導(dǎo)讀 在目前接觸過的項目中大多數(shù)的項目都會涉及到: crud相關(guān)的操作, 哪如何優(yōu)雅的編寫crud操作呢?帶著這個問題,我們發(fā)現(xiàn)項目中大量的操作多是 創(chuàng)建實體 、刪除實例、 修改實體、 查詢單個實體、 分頁查詢多個實體...
閱讀 1980·2021-09-26 10:19
閱讀 3249·2021-09-24 10:25
閱讀 1623·2019-12-27 11:39
閱讀 1919·2019-08-30 15:43
閱讀 663·2019-08-29 16:08
閱讀 3504·2019-08-29 16:07
閱讀 902·2019-08-26 11:30
閱讀 1270·2019-08-26 10:41