javascript
boot spring test 文档_SpringBoot入门建站全系列(五)使用Spring-data-jpa操作数据库
SpringBoot入門建站全系列(五)使用Spring-data-jpa操作數據庫
SpringBoot操作數據庫有多種方式,如
JDBC直接操作:太古老了,沒人愿意這樣玩
Mybatis插件:比較時髦,比較適合sql復雜,或者對性能要求高的應用,因為sql都是自己寫的。
Spring-data-jpa: 使用hibernate作為實現,基本上不需要寫sql,因為sql都是統計的,總是會產生多余的查詢,性能上相對而言會低,但不絕對,影響性能的因素是多種的,這里說的性能是 從最終的查詢的sql來對比的,畢竟生成的sql沒有經過深思熟慮寫出來的性能好。
JdbcTemplate:spring在jdbc上面做了深層次的封裝,使用spring的注入功能,可以把DataSource注冊到JdbcTemplate之中。Spring-data-jpa引入的時候,JdbcTemplate必然會被引入的。
當然還有其他中間件,主流使用的就是Mybatis和Spring-data-jpa。
品茗IT-SpringBoot專題-同步發布
品茗IT 提供在線支持:
一鍵快速構建Spring項目工具
一鍵快速構建SpringBoot項目工具
一鍵快速構建SpringCloud項目工具
一站式Springboot項目生成
如果大家正在尋找一個java的學習環境,或者在開發中遇到困難,可以加入我們的java學習圈,點擊即可加入,共同學習,節約學習時間,減少很多在學習中遇到的難題。
一、引入依賴
需要同時引入數據庫的connector和數據源datasource。和使用mybatis一樣,只需要替換Mybatis引入的jar依賴即可。
依賴如下:
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId> </dependency> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency> <dependency><groupId>org.apache.commons</groupId><artifactId>commons-dbcp2</artifactId> </dependency>完整的依賴如下所示:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>cn.pomit</groupId><artifactId>testjpa</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.4.RELEASE</version></parent><name>testjpa</name><url>http://maven.apache.org</url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-dbcp2</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build> </project>二、配置數據庫連接信息
server.port=8080spring.application.name=pomitspring.datasource.driverClassName = com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://127.0.0.1:3306/boot?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC spring.datasource.username=cff spring.datasource.password=123456spring.datasource.type=org.apache.commons.dbcp2.BasicDataSource spring.datasource.dbcp2.max-wait-millis=60000 spring.datasource.dbcp2.min-idle=20 spring.datasource.dbcp2.initial-size=2 spring.datasource.dbcp2.validation-query=SELECT 1 spring.datasource.dbcp2.connection-properties=characterEncoding=utf8 spring.datasource.dbcp2.validation-query=SELECT 1 spring.datasource.dbcp2.test-while-idle=true spring.datasource.dbcp2.test-on-borrow=true spring.datasource.dbcp2.test-on-return=false#JPA Configuration: spring.jpa.database=MySQL spring.jpa.show-sql=true spring.jpa.hibernate.ddl-auto=none spring.jpa.hibernate.naming.implicit-strategy=org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy spring.jpa.hibernate.naming.physical-strategy=org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy這里面,包含了數據庫連接信息、數據源的連接池配置信息、jpa配置信息。
spring.jpa.hibernate.ddl-auto屬性,是對表的操作: - create 啟動時刪數據庫中的表,然后創建,退出時不刪除數據表 - create-drop 啟動時刪數據庫中的表,然后創建,退出時刪除數據表 如果表不存在報錯 - update 如果啟動時表格式不一致則更新表,原有數據保留 - validate 項目啟動表結構進行校驗 如果不一致則報錯 - none 啥都不做
spring.jpa.hibernate.naming.implicit-strategy和spring.jpa.hibernate.naming.physical-strategy是對表和實體字段映射的默認處理方式。
實體名稱映射到數據庫中時,分成兩個步驟:
- 第一個階段是從對象模型中提取一個合適的邏輯名稱,這個邏輯名稱可以由用戶指定,通過@Column和@Table等注解完成,也可以通過被Hibernate的ImplicitNamingStrategy指定;
- 第二個階段是將上述的邏輯名稱解析成物理名稱,物理名稱是由Hibernate中的PhysicalNamingStrategy決定;
PhysicalNamingStrategy和ImplicitNamingStrategy的區別:
- 從處理的效果上來看,其實沒有什么區別,但是從程序設計分層的角度來看,類似于MVC的分層,ImplicitNamingStrategy只管模型對象層次的處理,PhysicalNamingStrategy只管映射成真實的數據名稱的處理,但是為了達到相同的效果,比如將userName映射城數據列時,在PhysicalNamingStrategy決定映射成user_name,但是在ImplicitNamingStrategy也可以做到;
- 從處理的場景來看, 無論對象模型中是否顯式地指定列名或者已經被隱式決定,PhysicalNamingStrategy都會應用; 但是對于ImplicitNamingStrategy,僅僅只有當沒有顯式地提供名稱時才會使用,也就是說當對象模型中已經指定了@Table或者@Entity等name時,設置的ImplicitNamingStrategy并不會起作用。
所以,這里的配置,映射到表字段時,所有點都被下劃線替換,駱駝情況也被下劃線替換。默認情況下,所有表名都以小寫生成
三、使用Spring-data-Jpa
3.1 表與Java實體
假設我們有一張這個表user_role :
實體:
package cn.pomit.testboot.domain;import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table;@Entity @Table(name = "user_role") public class UserRole {@Idprivate int id;@Column(name = "user_name")private String userName;private String role;private String phone;public void setId(int id) {this.id = id;}public int getId() {return id;}public void setUserName(String userName) {this.userName = userName;}public String getUserName() {return userName;}public void setRole(String role) {this.role = role;}public String getRole() {return role;}public void setPhone(String phone) {this.phone = phone;}public String getPhone() {return phone;}}3.2 建立Dao層進行數據庫訪問
UserRoleDao:
import java.util.List;import org.springframework.data.repository.CrudRepository;import cn.pomit.testboot.domain.UserRole;public interface UserRoleDao extends CrudRepository<UserRole, Integer> {List<UserRole> findByRole(String role); }可以看到,使用Spring-data-jpa就是就這么簡單,只需要繼承CrudRepository即可。
同時,Spring-data-jpa還支持findBy + 字段(And 字段)進行查詢。deleteBy + 字段(And 字段)進行刪除。
分頁等其他操作后續再講。
四、service邏輯調用Dao。
UserRoleService:
import java.util.List;import javax.transaction.Transactional;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service;import cn.pomit.testboot.domain.UserRole; import cn.pomit.testboot.mapper.UserRoleDao;@Service public class UserRoleService {@AutowiredUserRoleDao userRoleDao;public List<UserRole> selectAll() {return (List<UserRole>) userRoleDao.findAll();}public void saveTest(UserRole userRole) {userRoleDao.save(userRole);}@Transactionalpublic void update(Integer id, String phone) {UserRole userRole = userRoleDao.findById(id).orElse(null);if (userRole != null) {userRole.setPhone(phone);userRoleDao.save(userRole);}}@Transactionalpublic void delete(Integer id) {userRoleDao.deleteById(id);}public List<UserRole> findByRole(String role) {return userRoleDao.findByRole(role);} }五、開放接口調用service
MybatisRest:
import java.util.List;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;import cn.pomit.testboot.domain.UserRole; import cn.pomit.testboot.service.UserRoleService;@RestController @RequestMapping("/db") public class TestJpaRest {@AutowiredUserRoleService userRoleService;@RequestMapping(value = "/query")public List<UserRole> query() {return userRoleService.selectAll();}@RequestMapping(value = "/testFind")public List<UserRole> testFind() {return userRoleService.findByRole("ADMIN");}@RequestMapping(value = "/save")public String save() {UserRole userRole = new UserRole();userRole.setRole("TEST");userRole.setUserName("TEST");userRole.setPhone("3424234");userRoleService.saveTest(userRole);return "0000";}@RequestMapping(value = "/update")public String update() {userRoleService.update(4, "454");return "0000";}@RequestMapping(value = "/delete")public String delete() {userRoleService.delete(4);return "0000";}}六、啟動
package cn.pomit.testboot;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication public class JpaApplication {public static void main(String[] args) {SpringApplication.run(JpaApplication.class, args);} }喜歡這篇文章么,喜歡就加入我們一起討論SpringBoot技術吧!
總結
以上是生活随笔為你收集整理的boot spring test 文档_SpringBoot入门建站全系列(五)使用Spring-data-jpa操作数据库的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 京瓷6525_京瓷6525扫描怎么设置?
- 下一篇: 2d的公式_用深度学习实现 2D 到 3