什么么是JPA?
全稱Java Persistence API,可以通過注解或者XML描述【對象-關系表】之間的映射關系,並將實體對象持久化到數據庫中。
為我們提供了:
1)ORM映射元數據:JPA支持XML和注解兩種元數據的形式,元數據描述對象和表之間的映射關系,框架據此將實體對象持久化到數據庫表中;
如:@Entity、@Table、@Column、@Transient等注解。
2)JPA 的API:用來操作實體對象,執行CRUD操作,框架在后台替我們完成所有的事情,開發者從繁瑣的JDBC和SQL代碼中解脫出來。
如:entityManager.merge(T t);
3)JPQL查詢語言:通過面向對象而非面向數據庫的查詢語言查詢數據,避免程序的SQL語句緊密耦合。
如:from Student s where s.name = ?
但是:
JPA僅僅是一種規范,也就是說JPA僅僅定義了一些接口,而接口是需要實現才能工作的。所以底層需要某種實現,而Hibernate就是實現了JPA接口的ORM框架。
也就是說:
JPA是一套ORM規范,Hibernate實現了JPA規范!如圖:
什么是spring data jpa?
spirng data jpa是spring提供的一套簡化JPA開發的框架,按照約定好的【方法命名規則】寫dao層接口,就可以在不寫接口實現的情況下,實現對數據庫的訪問和操作。同時提供了很多除了CRUD之外的功能,如分頁、排序、復雜查詢等等。
Spring Data JPA 可以理解為 JPA 規范的再次封裝抽象,底層還是使用了 Hibernate 的 JPA 技術實現。如圖:
接口約定命名規則:
實例:
創建數據庫:
在test數據庫中創建user表
-- ---------------------------- -- Table structure for `user` -- ---------------------------- DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(50) DEFAULT NULL, `password` varchar(50) DEFAULT NULL, `name` varchar(50) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of user -- ---------------------------- INSERT INTO `user` VALUES ('1', 'zhangsan', '123', '張三'); INSERT INTO `user` VALUES ('2', 'lisi', '123', '李四');
添加Spring Data JPA的起步依賴
<!-- springBoot JPA的起步依賴 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency>
添加數據庫驅動依賴
<!-- MySQL連接驅動 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency>
在application.properties中配置數據庫和jpa的相關屬性
#DB Configuration: spring.datasource.driverClassName=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8 spring.datasource.username=root spring.datasource.password=root #JPA Configuration: spring.jpa.database=MySQL spring.jpa.show-sql=true spring.jpa.generate-ddl=true spring.jpa.hibernate.ddl-auto=update spring.jpa.hibernate.naming_strategy=org.hibernate.cfg.ImprovedNamingStrategy
創建實體配置實體
@Entity public class User { // 主鍵 @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; // 用戶名 private String username; // 密碼 private String password; // 姓名 private String name; //此處省略setter和getter方法... ... }
編寫UserRepository
public interface UserRepository extends JpaRepository<User,Long>{ public List<User> findAll(); }
編寫測試類
@RunWith(SpringRunner.class) @SpringBootTest(classes=MySpringBootApplication.class) public class JpaTest { @Autowired private UserRepository userRepository; @Test public void test(){ List<User> users = userRepository.findAll(); System.out.println(users); } }
控制台打印信息
注意:如果是jdk9,執行報錯如下:
原因:jdk缺少相應的jar
解決方案:手動導入對應的maven坐標,如下:
<!--jdk9需要導入如下坐標--> <dependency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>2.3.0</version> </dependency>
第二種整合:
springboot集成spring data jpa只需兩步:
第一步:導入maven坐標
第二步:yml配置文件中配置jpa信息