javascript
Spring Data 系列(二) Spring+JPA入门(集成Hibernate)
通過【Spring Data 系列(一) 入門】的介紹,通過對比的方式認識到Spring提供的JdbcTemplate的強大功能。通過使用JdbcTemplate,操作數據庫,不需要手動處理Connection,Statement等底層SQL對象。可是,Spring對數據庫的操作還遠遠沒有結束。本章主要介紹Spring 對JPA的支持。
主要內容
簡單介紹JPA
Spring Hibernate JPA整合
1.JPA簡介
?Java Persistence API (JPA),為開發人員提供了一種對象/關系映射(O-R Mapping)工具,用來管理 Java 應用中的關系數據。JPA是EJB3.0的一部分,現在公認為ORM行業標準。JPA本身只是一個規范,而不是產品; 它本身不能進行持續性或其他任何東西。JPA只是一組接口,需要一個實現。JPA允許通過標準的XML格式和注解格式聲明,用于定義Java類如何映射到關系數據庫表的映射規則。。JPA也定義了在對數據庫中的對象處理查詢和事務運行時的EntityManager的API。JPA定義一個對象級查詢語言,JPQL,以允許從所述數據庫中的對象的查詢。JPA常用的解決方案:
??? EclipseLink (Eclipse)
??? Hibernate (RedHat)
??? Open JPA (Apache)
??? DataNucleus
??? Ebean (SourceForge)
??? TopLink Essentials (Glassfish)
??? TopLink (Oracle)
??? Kodo (Oracle)
JPA 規范也不是一成不變的。從2006年的JPA1.0,到2009年JPA2.0,最后到2013年JPA2.1。版本之間的特性具體參照
https://en.wikibooks.org/wiki/Java_Persistence/What_is_JPA%3F
https://en.wikipedia.org/wiki/Java_Persistence_API
2.Spring Hibernate JPA整合
準備
表 CREATE?TABLE?`Employee`?(`id`?int(11)?unsigned?NOT?NULL,`name`?varchar(20)?DEFAULT?NULL,`role`?varchar(20)?DEFAULT?NULL,PRIMARY?KEY?(`id`))?ENGINE=InnoDB?DEFAULT?CHARSET=utf8;2.1項目結構
2.2 pom.xml
<?xml?version="1.0"?encoding="UTF-8"?> <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>org.springframework</groupId><artifactId>gs-relational-data-access</artifactId><version>0.1.0</version><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><groupId>com.h2database</groupId><artifactId>h2</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency></dependencies><repositories><repository><id>spring-releases</id><name>Spring?Releases</name><url>https://repo.spring.io/libs-release</url></repository><repository><id>org.jboss.repository.releases</id><name>JBoss?Maven?Release?Repository</name><url>https://repository.jboss.org/nexus/content/repositories/releases</url></repository></repositories><pluginRepositories><pluginRepository><id>spring-releases</id><name>Spring?Releases</name><url>https://repo.spring.io/libs-release</url></pluginRepository></pluginRepositories><dependencyManagement><dependencies><dependency><groupId>io.spring.platform</groupId><artifactId>platform-bom</artifactId><version>1.1.2.RELEASE</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement> </project>使用了platform-bom,方便了包的依賴管理。
依賴樹結構
2.3 persistence.xml
<persistence?version="2.1"xmlns="http://xmlns.jcp.org/xml/ns/persistence"?xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence?http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"><persistence-unit?name="JPAExamples"><provider>org.hibernate.jpa.HibernatePersistenceProvider</provider></persistence-unit> </persistence>2.4 spring.xml
<?xml?version="1.0"?encoding="UTF-8"?> <beans?xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beans?http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aop?http://www.springframework.org/schema/aop/spring-aop-3.1.xsdhttp://www.springframework.org/schema/tx?http://www.springframework.org/schema/tx/spring-tx-3.1.xsdhttp://www.springframework.org/schema/context?http://www.springframework.org/schema/context/spring-context-3.1.xsd"> <!--數據源--><bean?id="dataSource"?class="org.springframework.jdbc.datasource.DriverManagerDataSource"><property?name="url"?value="jdbc:mysql://localhost:3306/exampledb"/><property?name="username"?value="root"/><property?name="password"?value="root"/><property?name="driverClassName"?value="com.mysql.jdbc.Driver"/></bean><bean?id="entityManagerFactory"?class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"><property?name="dataSource"?ref="dataSource"/><property?name="persistenceXmlLocation"?value="META-INF/persistence.xml"/><property?name="persistenceUnitName"?value="JPAExamples"/><property?name="jpaVendorAdapter"?ref="jpaVendorAdapter"/><property?name="jpaDialect"?ref="jpaDialect"/><property?name="jpaProperties"><props><prop?key="hibernate.show_sql">true</prop></props></property></bean><bean?id="jpaVendorAdapter"?class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"><property?name="generateDdl"?value="false"?/><property?name="database"?value="MYSQL"/></bean><bean?id="jpaDialect"?class="org.springframework.orm.jpa.vendor.HibernateJpaDialect"/><bean?id="entityManager"?factory-bean="entityManagerFactory"??factory-method="createEntityManager"></bean><!--?Jpa?事務管理器??--><bean?id="transactionManager"?class="org.springframework.orm.jpa.JpaTransactionManager"p:entityManagerFactory-ref="entityManagerFactory"?/><!--?開啟注解事務?--><tx:annotation-driven?transaction-manager="transactionManager"?proxy-target-class="true"?/><!--?啟動對@AspectJ(面向切面)注解的支持?--><aop:aspectj-autoproxy?/><context:component-scan?base-package="com.journaldev.spring.jpa"></context:component-scan> </beans>有的對象,不是必須的。為了保持完整性,做了保留。
可以配置entityManagerFactory的packagesToScan屬性,沒有配置也是可以的。
2.5 entity
package?com.journaldev.spring.jpa.model; import?javax.persistence.Entity; import?javax.persistence.Id; @Entity public?class?Employee?{@Idprivate?int?id;private?String?name;private?String?role;public?int?getId()?{return?id;}public?void?setId(int?id)?{this.id?=?id;}public?String?getName()?{return?name;}public?void?setName(String?name)?{this.name?=?name;}public?String?getRole()?{return?role;}public?void?setRole(String?role)?{this.role?=?role;}@Overridepublic?String?toString()?{return?"{ID="?+?id?+?",Name="?+?name?+?",Role="?+?role?+?"}";} }2.6 接口
public?interface?EmployeeDAO?{//Createpublic?void?save(Employee?employee);//Readpublic?Employee?getById(int?id);//Updatepublic?void?update(Employee?employee);//Deletepublic?void?deleteById(int?id);//Get?Allpublic?List<Employee>?getAll(); }實現類
package?com.journaldev.spring.jpa.dao;import?com.journaldev.spring.jpa.model.Employee; import?org.springframework.beans.factory.annotation.Autowired; import?org.springframework.stereotype.Repository;import?javax.persistence.EntityManager; import?javax.persistence.PersistenceContext; import?javax.persistence.criteria.CriteriaBuilder; import?javax.persistence.criteria.CriteriaQuery; import?javax.transaction.Transactional;import?java.util.List;/***?Created?by?zhaoguoyu?on?2016/6/22.*/ @Transactional @Repository public?class?EmployeeDAOImpl?implements?EmployeeDAO?{@PersistenceContextEntityManager?em;@Overridepublic?void?save(Employee?employee)?{em.persist(employee);}@Overridepublic?Employee?getById(int?id)?{return?em.find(Employee.class,?id);}public?void?update(Employee?employee)?{??em.merge(employee);}@Overridepublic?void?deleteById(int?id)?{em.remove(this.getById(id));}@Overridepublic?List<Employee>?getAll()?{CriteriaBuilder?builder?=em.getCriteriaBuilder();final?CriteriaQuery<Employee>?query?=?builder.createQuery(Employee.class);return?this.em.createQuery(query).getResultList();} }2.7測試
測試類
OR
import?com.journaldev.spring.jpa.dao.EmployeeDAO; import?com.journaldev.spring.jpa.model.Employee; import?org.springframework.context.support.ClassPathXmlApplicationContext; import?java.util.Random;/***?Created?by?zhaoguoyu?on?2016/6/22.*/ public?class?Main?{public?static?void?main(String[]?args)?{ClassPathXmlApplicationContext?ctx?=?new?ClassPathXmlApplicationContext("spring.xml");final?EmployeeDAO?employeeDAO?=?ctx.getBean(EmployeeDAO.class);Employee?emp?=?new?Employee();int?rand?=?new?Random().nextInt(1000);emp.setId(rand);emp.setName("Pankaj");emp.setRole("Java?Developer");employeeDAO.save(emp);Employee?employee?=?employeeDAO.getById(rand);employee.setName(employee.getName()?+"_update");employeeDAO.update(employee);} }有一點需要說明。默認使用的日志是logback.號稱比log4j更優秀的一款。
默認的日志配置logback.xml
<?xml?version="1.0"?encoding="UTF-8"?> <configuration><appender?name="STDOUT"?class="ch.qos.logback.core.ConsoleAppender"><layout?class="ch.qos.logback.classic.PatternLayout"><Pattern>%d{yyyy-MM-dd?HH:mm:ss}?[%thread]?%-5level?%logger{36}?-?%msg%n</Pattern></layout></appender><logger?name="org.hibernate"?level="debug"?additivity="false"><appender-ref?ref="STDOUT"?/></logger><root?level="error"><appender-ref?ref="STDOUT"?/></root></configuration>總結
本文主要講解了Spring對JPA的支持,和演示了整合過程。其中JPA的內容還有很多,不可能在本文全部講完。本系列主要是為大家提供以遞進的方式,通過前后的演示對比,感覺Spring DATA API的強大。
通過JPA的整合,實現了訪問數據庫,完全不需要寫SQL。這樣的好處之一:實現了SQL的透明,可以無縫實現不同數據庫廠商和數據庫版本間的切換。Spring 對JPA的支持還沒有結束
轉載于:https://blog.51cto.com/dba10g/1791946
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的Spring Data 系列(二) Spring+JPA入门(集成Hibernate)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 模糊综合评价法及Python实现
- 下一篇: javascript类型系统——正则表达