javascript
【笔记】springboot使用Spring-data-jpa
Spring-data-jpa
Spring-data-jpa依賴于Hibernate。通過整合Hibernate之后,我們以操作Java實(shí)體的?式最終將數(shù)據(jù)改變映射到數(shù)據(jù)庫(kù)表中。
添加依賴:
在 application.xml 中配置:數(shù)據(jù)庫(kù)連接信息(如使?嵌?式數(shù)據(jù)庫(kù)則不需要)、?動(dòng)創(chuàng)建表結(jié)構(gòu)的
設(shè)置,例如使?mysql的情況如下:
spring.datasource.url=jdbc:mysql://localhost:3308/data1
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.jpa.properties.hibernate.hbm2ddl.auto=create-drop
spring.jpa.properties.hibernate.hbm2ddl.auto 是hibernate的配置屬性,其主要作?是:?動(dòng)創(chuàng)建、更新、驗(yàn)證數(shù)據(jù)庫(kù)表結(jié)構(gòu)。該參數(shù)的?種配置如下:
create :每次加載hibernate時(shí)都會(huì)刪除上?次的?成的表,然后根據(jù)你的model類再重新來?成新表,哪怕兩次沒有任何改變也要這樣執(zhí)?,這就是導(dǎo)致數(shù)據(jù)庫(kù)表數(shù)據(jù)丟失的?個(gè)重要原因。
create-drop :每次加載hibernate時(shí)根據(jù)model類?成表,但是sessionFactory?關(guān)閉,表就?動(dòng)刪除。
update :最常?的屬性,第?次加載hibernate時(shí)根據(jù)model類會(huì)?動(dòng)建?起表的結(jié)構(gòu)(前提是先建?好數(shù)據(jù)庫(kù)),以后加載hibernate時(shí)根據(jù)model類?動(dòng)更新表結(jié)構(gòu),即使表結(jié)構(gòu)改變了但表中的?仍然存在不會(huì)刪除以前的?。要注意的是當(dāng)部署到服務(wù)器后,表結(jié)構(gòu)是不會(huì)被?上建?起來的,是要等應(yīng)?第?次運(yùn)?起來后才會(huì)。
validate :每次加載hibernate時(shí),驗(yàn)證創(chuàng)建數(shù)據(jù)庫(kù)表結(jié)構(gòu),只會(huì)和數(shù)據(jù)庫(kù)中的表進(jìn)??較,不會(huì)創(chuàng)建新表,但是會(huì)插?新值。
創(chuàng)建實(shí)體
創(chuàng)建?個(gè)User實(shí)體,包含id(主鍵)、name(姓名)、age(年齡)屬性,通過ORM框架其會(huì)被映射到數(shù)據(jù)庫(kù)表中,由于配置了 hibernate.hbm2ddl.auto ,在應(yīng)?啟動(dòng)的時(shí)候框架會(huì)?動(dòng)去數(shù)據(jù)庫(kù)中創(chuàng)建對(duì)應(yīng)的表。
創(chuàng)建數(shù)據(jù)訪問接?
下?針對(duì)User實(shí)體創(chuàng)建對(duì)應(yīng)的 Repository 接?實(shí)現(xiàn)對(duì)該實(shí)體的數(shù)據(jù)訪問,如下代碼:
在Spring-data-jpa中,只需要編寫類似上?這樣的接?就可實(shí)現(xiàn)數(shù)據(jù)訪問。不再像我們以往編寫了接?時(shí)候還需要??編寫接?實(shí)現(xiàn)類,直接減少了我們的?件清單。
在上例中,我們可以看到下?兩個(gè)函數(shù):
User findByName(String name)
User findByNameAndAge(String name, Integer age)
它們分別實(shí)現(xiàn)了按name查詢User實(shí)體和按name和age查詢User實(shí)體,可以看到我們這?沒有任何類 SQL語句就完成了兩個(gè)條件查詢?法。這就是Spring-data-jpa的??特性:通過解析?法名創(chuàng)建查詢。
單元測(cè)試
在完成了上?的數(shù)據(jù)訪問接?之后,按照慣例就是編寫對(duì)應(yīng)的單元測(cè)試來驗(yàn)證編寫的內(nèi)容是否正確。
@RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration(Application.class) public class ApplicationTests { @Autowired private UserRepository userRepository; @Test public void test() throws Exception { // 創(chuàng)建10條記錄 userRepository.save(new User("AAA", 10)); userRepository.save(new User("BBB", 20)); userRepository.save(new User("CCC", 30)); userRepository.save(new User("DDD", 40)); userRepository.save(new User("EEE", 50)); userRepository.save(new User("FFF", 60)); userRepository.save(new User("GGG", 70)); userRepository.save(new User("HHH", 80)); userRepository.save(new User("III", 90)); userRepository.save(new User("JJJ", 100)); // 測(cè)試findAll, 查詢所有記錄 Assert.assertEquals(10, userRepository.findAll().size()); // 測(cè)試findByName, 查詢姓名為FFF的User Assert.assertEquals(60, userRepository.findByName("FFF").getAge().longValue()); // 測(cè)試findUser, 查詢姓名為FFF的User Assert.assertEquals(60, userRepository.findUser("FFF").getAge().longValue()); // 測(cè)試findByNameAndAge, 查詢姓名為FFF并且年齡為60的User Assert.assertEquals("FFF", userRepository.findByNameAndAge("FFF", 60).getName()); // 測(cè)試刪除姓名為AAA的User userRepository.delete(userRepository.findByName("AAA")); // 測(cè)試findAll, 查詢所有記錄, 驗(yàn)證上?的刪除是否成功 Assert.assertEquals(9, userRepository.findAll().size()); }多數(shù)據(jù)源配置:
創(chuàng)建?個(gè)Spring配置類,定義兩個(gè)DataSource?來讀取 application.properties 中的不同配置。如下例?中,主數(shù)據(jù)源配置為 spring.datasource.primary 開頭的配置,第?數(shù)據(jù)源配置為 spring.datasource.secondary 開頭的配置。
@Configuration public class DataSourceConfig { @Bean(name = "primaryDataSource") @Qualifier("primaryDataSource") @ConfigurationProperties(prefix="spring.datasource.primary") public DataSource primaryDataSource() { return DataSourceBuilder.create().build(); } @Bean(name = "secondaryDataSource") @Qualifier("secondaryDataSource") @Primary @ConfigurationProperties(prefix="spring.datasource.secondary") public DataSource secondaryDataSource() { return DataSourceBuilder.create().build(); } }對(duì)應(yīng)的 application.properties 配置如下:
spring.datasource.primary.url=jdbc:mysql://localhost:3306/test1
spring.datasource.primary.username=root
spring.datasource.primary.password=root
spring.datasource.primary.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.secondary.url=jdbc:mysql://localhost:3306/test2
spring.datasource.secondary.username=root
spring.datasource.secondary.password=root
spring.datasource.secondary.driver-class-name=com.mysql.jdbc.Driver
JdbcTemplate?持
對(duì)JdbcTemplate的?持?較簡(jiǎn)單,只需要為其注?對(duì)應(yīng)的datasource即可,如下例?,在創(chuàng)建JdbcTemplate的時(shí)候分別注?名為 primaryDataSource 和 secondaryDataSource 的數(shù)據(jù)源來區(qū)分不同的JdbcTemplate。
@Bean(name = "primaryJdbcTemplate") public JdbcTemplate primaryJdbcTemplate( @Qualifier("primaryDataSource") DataSource dataSource) { return new JdbcTemplate(dataSource); } @Bean(name = "secondaryJdbcTemplate") public JdbcTemplate secondaryJdbcTemplate( @Qualifier("secondaryDataSource") DataSource dataSource) { return new JdbcTemplate(dataSource); } //接下來通過測(cè)試?例來演示如何使?這兩個(gè)針對(duì)不同數(shù)據(jù)源的JdbcTemplate。 @RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration(Application.class) public class ApplicationTests { @Autowired @Qualifier("primaryJdbcTemplate") protected JdbcTemplate jdbcTemplate1; @Autowired @Qualifier("secondaryJdbcTemplate") protected JdbcTemplate jdbcTemplate2; @Before public void setUp() { jdbcTemplate1.update("DELETE FROM USER "); jdbcTemplate2.update("DELETE FROM USER "); } @Test public void test() throws Exception { // 往第?個(gè)數(shù)據(jù)源中插?兩條數(shù)據(jù) jdbcTemplate1.update("insert into user(id,name,age) values(?, ?, ?)", 1, "aaa", 20 ); jdbcTemplate1.update("insert into user(id,name,age) values(?, ?, ?)", 2, "bbb", 30 ); jdbcTemplate2.update("insert into user(id,name,age) values(?, ?, ?)", 1, "aaa", 20 ); 查?下第?個(gè)數(shù)據(jù)源中是否有兩條數(shù)據(jù),驗(yàn)證插?是否成功 Assert.assertEquals("2", jdbcTemplate1.queryForObject("select count(1) from user", String.class)); // 查?下第?個(gè)數(shù)據(jù)源中是否有兩條數(shù)據(jù),驗(yàn)證插?是否成功 Assert.assertEquals("1", jdbcTemplate2.queryForObject("select count(1) from user", String.class)); } }總結(jié)
以上是生活随笔為你收集整理的【笔记】springboot使用Spring-data-jpa的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【问题记录】python的py文件生成e
- 下一篇: 【spring学习笔记】(二)Sprin