javascript
【笔记】springboot使用Spring-data-jpa
Spring-data-jpa
Spring-data-jpa依賴于Hibernate。通過整合Hibernate之后,我們以操作Java實體的?式最終將數據改變映射到數據庫表中。
添加依賴:
在 application.xml 中配置:數據庫連接信息(如使?嵌?式數據庫則不需要)、?動創建表結構的
設置,例如使?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的配置屬性,其主要作?是:?動創建、更新、驗證數據庫表結構。該參數的?種配置如下:
create :每次加載hibernate時都會刪除上?次的?成的表,然后根據你的model類再重新來?成新表,哪怕兩次沒有任何改變也要這樣執?,這就是導致數據庫表數據丟失的?個重要原因。
create-drop :每次加載hibernate時根據model類?成表,但是sessionFactory?關閉,表就?動刪除。
update :最常?的屬性,第?次加載hibernate時根據model類會?動建?起表的結構(前提是先建?好數據庫),以后加載hibernate時根據model類?動更新表結構,即使表結構改變了但表中的?仍然存在不會刪除以前的?。要注意的是當部署到服務器后,表結構是不會被?上建?起來的,是要等應?第?次運?起來后才會。
validate :每次加載hibernate時,驗證創建數據庫表結構,只會和數據庫中的表進??較,不會創建新表,但是會插?新值。
創建實體
創建?個User實體,包含id(主鍵)、name(姓名)、age(年齡)屬性,通過ORM框架其會被映射到數據庫表中,由于配置了 hibernate.hbm2ddl.auto ,在應?啟動的時候框架會?動去數據庫中創建對應的表。
創建數據訪問接?
下?針對User實體創建對應的 Repository 接?實現對該實體的數據訪問,如下代碼:
在Spring-data-jpa中,只需要編寫類似上?這樣的接?就可實現數據訪問。不再像我們以往編寫了接?時候還需要??編寫接?實現類,直接減少了我們的?件清單。
在上例中,我們可以看到下?兩個函數:
User findByName(String name)
User findByNameAndAge(String name, Integer age)
它們分別實現了按name查詢User實體和按name和age查詢User實體,可以看到我們這?沒有任何類 SQL語句就完成了兩個條件查詢?法。這就是Spring-data-jpa的??特性:通過解析?法名創建查詢。
單元測試
在完成了上?的數據訪問接?之后,按照慣例就是編寫對應的單元測試來驗證編寫的內容是否正確。
@RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration(Application.class) public class ApplicationTests { @Autowired private UserRepository userRepository; @Test public void test() throws Exception { // 創建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)); // 測試findAll, 查詢所有記錄 Assert.assertEquals(10, userRepository.findAll().size()); // 測試findByName, 查詢姓名為FFF的User Assert.assertEquals(60, userRepository.findByName("FFF").getAge().longValue()); // 測試findUser, 查詢姓名為FFF的User Assert.assertEquals(60, userRepository.findUser("FFF").getAge().longValue()); // 測試findByNameAndAge, 查詢姓名為FFF并且年齡為60的User Assert.assertEquals("FFF", userRepository.findByNameAndAge("FFF", 60).getName()); // 測試刪除姓名為AAA的User userRepository.delete(userRepository.findByName("AAA")); // 測試findAll, 查詢所有記錄, 驗證上?的刪除是否成功 Assert.assertEquals(9, userRepository.findAll().size()); }多數據源配置:
創建?個Spring配置類,定義兩個DataSource?來讀取 application.properties 中的不同配置。如下例?中,主數據源配置為 spring.datasource.primary 開頭的配置,第?數據源配置為 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(); } }對應的 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?持
對JdbcTemplate的?持?較簡單,只需要為其注?對應的datasource即可,如下例?,在創建JdbcTemplate的時候分別注?名為 primaryDataSource 和 secondaryDataSource 的數據源來區分不同的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); } //接下來通過測試?例來演示如何使?這兩個針對不同數據源的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 { // 往第?個數據源中插?兩條數據 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 ); 查?下第?個數據源中是否有兩條數據,驗證插?是否成功 Assert.assertEquals("2", jdbcTemplate1.queryForObject("select count(1) from user", String.class)); // 查?下第?個數據源中是否有兩條數據,驗證插?是否成功 Assert.assertEquals("1", jdbcTemplate2.queryForObject("select count(1) from user", String.class)); } }總結
以上是生活随笔為你收集整理的【笔记】springboot使用Spring-data-jpa的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【问题记录】python的py文件生成e
- 下一篇: 【pytorch】pytorch自定义训