日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring Data 系列(二) Spring+JPA入门(集成Hibernate)

發布時間:2023/12/10 javascript 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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測試

    測試類

    import?com.journaldev.spring.jpa.dao.EmployeeDAO; import?com.journaldev.spring.jpa.model.Employee; import?org.junit.Test; import?org.junit.runner.RunWith; import?org.springframework.test.context.ContextConfiguration; import?org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests; import?org.springframework.test.context.junit4.SpringJUnit4Cla***unner; import?javax.annotation.Resource;import?java.util.Random;/***?Created?by?zhaoguoyu?on?2016/6/22.*/ @RunWith(SpringJUnit4Cla***unner.class) @ContextConfiguration(locations?=?"classpath:spring.xml") public?class?SpringJPATest?extends?AbstractTransactionalJUnit4SpringContextTests?{@Resourceprivate?EmployeeDAO?employeeDAO;@Testpublic?void?testSave(){Employee?emp?=?new?Employee();int?rand?=?new?Random().nextInt(1000);emp.setId(rand);emp.setName("Pankaj");emp.setRole("Java?Developer");employeeDAO.save(emp);}@Testpublic?void?testUpdate(){Employee?emp?=?new?Employee();int?rand?=?new?Random().nextInt(1000);emp.setId(rand);emp.setName("Pankaj");emp.setRole("Java?Developer");employeeDAO.save(emp);emp.setName(emp.getName()+"_update");employeeDAO.update(emp);} }

    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)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。