1. 程式人生 > >spring-data詳解之spring-data-jpa:簡單三步快速上手spring-data-jpa開發

spring-data詳解之spring-data-jpa:簡單三步快速上手spring-data-jpa開發

事務管理 out don 前言 map lns xid public lease

前言:

基於spring framework 4.x或spring boot 1.x開發環境

務必註意以下版本問題:
Spring framework4.x(Spring boot1.x)對應spring-data1.x

Spring framework5.x(Spring boot2.x)對應spring-data2.x

一、依賴

需要jpa 1.x,hibernate 5.x,spring-data-commons,spring-data-jpa

maven方式:

  1. <dependency>
  2. <groupId>org.hibernate.javax.persistence</groupId>
  3. <artifactId>hibernate-jpa-2.1-api</artifactId>
  4. <version>1.0.2.Final</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.hibernate</groupId>
  8. <artifactId>hibernate-core</artifactId>
  9. <version>5.2.16.Final</version>
  10. </dependency>
  11. <dependency>
  12. <groupId>org.hibernate</groupId>
  13. <artifactId>hibernate-entitymanager</artifactId>
  14. <version>5.2.16.Final</version>
  15. </dependency>
  16. <dependency>
  17. <groupId>org.springframework.data</groupId>
  18. <artifactId>spring-data-jpa</artifactId>
  19. <version>1.11.11.RELEASE</version>
  20. </dependency>

二、環境配置

註意兩個掃描器(一個是po實體類掃描,還有一個是dao層接口掃描)

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:tx="http://www.springframework.org/schema/tx"
  6. xmlns:jpa="http://www.springframework.org/schema/data/jpa"
  7. xsi:schemaLocation="http://www.springframework.org/schema/beans
  8. http://www.springframework.org/schema/beans/spring-beans.xsd
  9. http://www.springframework.org/schema/context
  10. http://www.springframework.org/schema/context/spring-context.xsd
  11. http://www.springframework.org/schema/tx
  12. http://www.springframework.org/schema/tx/spring-tx.xsd
  13. http://www.springframework.org/schema/data/jpa
  14. http://www.springframework.org/schema/data/jpa/spring-jpa.xsd">
  15. <!-- eguid博客所有原創文章均采用知識共享署名-相同方式共享 3.0 中國大陸許可協議進行許可。如有轉載請註明博客地址:https://blog.csdn.net/eguid_1/article/details/80018676-->
  16. <!-- druid連接池 -->
  17. <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
  18. <property name="driverClassName" value="${jdbc.driverClassName}" />
  19. <property name="url" value="${jdbc.url}" />
  20. <property name="username" value="${jdbc.username}" />
  21. <property name="password" value="${jdbc.password}" />
  22. <property name="maxActive" value="${jdbc.maxActive}" />
  23. <property name="initialSize" value="${jdbc.initialSize}" />
  24. <property name="maxWait" value="${jdbc.maxWait}" />
  25. <property name="maxIdle" value="${jdbc.maxIdle}" />
  26. <property name="minIdle" value="${jdbc.minIdle}" />
  27. <property name="removeAbandoned" value="${jdbc.removeAbandoned}" />
  28. <property name="removeAbandonedTimeout" value="${jdbc.removeAbandonedTimeout}" />
  29. <property name="testWhileIdle" value="${jdbc.testWhileIdle}" />
  30. <property name="validationQuery" value="${jdbc.validationQuery}"/>
  31. <property name="validationQueryTimeout" value="${jdbc.validationQueryTimeout}" />
  32. <property name="timeBetweenEvictionRunsMillis" value="${jdbc.timeBetweenEvictionRunsMillis}" />
  33. <property name="numTestsPerEvictionRun" value="${jdbc.numTestsPerEvictionRun}" />
  34. <!-- 打開PSCache,並且指定每個連接上PSCache的大小 -->
  35. <property name="poolPreparedStatements" value="false" />
  36. <property name="maxPoolPreparedStatementPerConnectionSize" value="20" />
  37. <!-- 配置監控統計攔截的filters -->
  38. <property name="filters" value="stat,wall"/>
  39. <property name="connectionProperties" value="druid.stat.slowSqlMillis=5000" />
  40. </bean>
  41. <!-- JPA工廠對象 -->
  42. <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
  43. <property name="dataSource" ref="dataSource" />
  44. <!-- 掃描此包下的所有Entity,進行ORM映射(這裏的實體類包路徑需要修改) -->
  45. <property name="packagesToScan" value="cc.eguid.xxx.pojo.po" />
  46. <property name="persistenceProvider">
  47. <bean class="org.hibernate.jpa.HibernatePersistenceProvider" />
  48. </property>
  49. <property name="jpaVendorAdapter">
  50. <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
  51. <property name="generateDdl" value="false" />
  52. <property name="database" value="MYSQL" />
  53. <property name="databasePlatform" value="org.hibernate.dialect.MySQLDialect" />
  54. <property name="showSql" value="true" />
  55. </bean>
  56. </property>
  57. <property name="jpaDialect">
  58. <bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" />
  59. </property>
  60. <property name="jpaPropertyMap">
  61. <map>
  62. <entry key="hibernate.query.substitutions" value="true 1, false 0" />
  63. <entry key="hibernate.default_batch_fetch_size" value="16" />
  64. <entry key="hibernate.max_fetch_depth" value="2" />
  65. <entry key="hibernate.generate_statistics" value="true" />
  66. <entry key="hibernate.bytecode.use_reflection_optimizer" value="true" />
  67. <entry key="hibernate.cache.use_second_level_cache" value="false" />
  68. <entry key="hibernate.cache.use_query_cache" value="false" />
  69. </map>
  70. </property>
  71. </bean>
  72. <!-- 使用聲明式事務管理 -->
  73. <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />
  74. <!-- JPA事務管理器 -->
  75. <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
  76. <property name="entityManagerFactory" ref="entityManagerFactory"/>
  77. </bean>
  78. <!--掃描 JPA持久化接口,spring-data-jpa會自動生成實現類(這裏的repostory接口包路徑需要修改)-->
  79. <jpa:repositories base-package="cc.eguid.xxx.dao" entity-manager-factory-ref="entityManagerFactory" transaction-manager-ref="transactionManager"/>
  80. </beans>

三、實體類和Repository接口

(1)編寫dao層接口(不需實現類,spring-data-jpa會自動生成實現類)

  1. import org.springframework.data.repository.CrudRepository;
  2. /**
  3. * spring-data-jpa自動生成實現類,簡化dao層開發
  4. * @author eguid
  5. *
  6. */
  7. public interface UserRepository extends CrudRepository<GameUserinfo, Integer>{
  8. GameUserinfo findByUsername(String username);
  9. }

(2)自動生成的ORM映射Entity(用JPA生成工具生成的)

  1. /**
  2. * The persistent class for the game_userinfo database table.
  3. *
  4. */
  5. @Entity
  6. @Table(name="userinfo")
  7. @NamedQuery(name="Userinfo.findAll", query="SELECT g FROM Userinfo g")
  8. public class Userinfo extends BaseEntity {
  9. private static final long serialVersionUID = 1L;
  10. @Id
  11. @GeneratedValue(strategy=GenerationType.AUTO)
  12. @Column(unique=true, nullable=false)
  13. private Integer userid;
  14. private Timestamp createtime;
  15. @Column(length=50)
  16. private String nickname;
  17. @Column(length=100)
  18. private String password;
  19. private int type;
  20. @Column(length=50)
  21. private String username;
  22. //bi-directional many-to-many association to Roleinfo
  23. @ManyToMany
  24. @JoinTable(
  25. name="userrole"
  26. , joinColumns={
  27. @JoinColumn(name="userid", nullable=false)
  28. }
  29. , inverseJoinColumns={
  30. @JoinColumn(name="roleid", nullable=false)
  31. }
  32. )
  33. private List<roleinfo> roleinfos;
  34. public Userinfo() {
  35. }
  36. public Integer getUserid() {
  37. return this.userid;
  38. }
  39. public void setUserid(Integer userid) {
  40. this.userid = userid;
  41. }
  42. public Timestamp getCreatetime() {
  43. return this.createtime;
  44. }
  45. public void setCreatetime(Timestamp createtime) {
  46. this.createtime = createtime;
  47. }
  48. public String getNickname() {
  49. return this.nickname;
  50. }
  51. public void setNickname(String nickname) {
  52. this.nickname = nickname;
  53. }
  54. public String getPassword() {
  55. return this.password;
  56. }
  57. public void setPassword(String password) {
  58. this.password = password;
  59. }
  60. public int getType() {
  61. return this.type;
  62. }
  63. public void setType(int type) {
  64. this.type = type;
  65. }
  66. public String getUsername() {
  67. return this.username;
  68. }
  69. public void setUsername(String username) {
  70. this.username = username;
  71. }
  72. public List<Roleinfo> getRoleinfos() {
  73. return this.roleinfos;
  74. }
  75. public void setRoleinfos(List<Roleinfo> roleinfos) {
  76. this.roleinfos = roleinfos;
  77. }
  78. }

四、總結

1、添加依賴(添加spring-data及spring-data-jpa依賴包)

2、配置jpa環境(配置dao掃描路徑和實體類掃描路徑)

3、編寫實體類和dao層接口(如果是簡單的單表增刪改查操作,直接繼承CrudRepository接口即可,基本不需要寫代碼)

jpa單表操作基本無可挑剔,涉及多表操作需要手寫hql語句或jpa

實體類是用工具生成的,所以實際上只需要寫一個dao接口即可

spring-data詳解之spring-data-jpa:簡單三步快速上手spring-data-jpa開發