spring data jpa
day1:orm思想和hibernate以及jpa的概述和jpa的基本操作

day2:springdatajpa的运行原理

day2:springdatajpa的基本操作

day3:多表操作,复杂查询

day2:springdatajpa的运行原理以及基本操作 (上)


第一 springDataJpa的概述

Spring Data JPA 让我们解脱了DAO层的操作,基本上所有CRUD都可以依赖于它来实现,在实际的工作工程中,推荐使用Spring Data JPA + ORM(如:hibernate)完成操作,这样在切换不同的ORM框架时提供了极大的方便,同时也使数据库层操作

更加简单,方便解耦。

SpringData Jpa 极大简化了数据库访问层代码。 如何简化的呢? 使用了SpringDataJpa,我们的dao层中只需要写接口,就自动具有了增删改查、分页查询等方法。

1.3  Spring Data JPA 与 JPA和hibernate之间的关系

Spring Data JPA是Spring提供的一套对JPA操作更加高级的封装,是在JPA规范下的专门用来进行数据持久化的解决方案。

JPA是一套规范,内部是有接口和抽象类组成的。hibernate是一套成熟的ORM框架,而且Hibernate实现了JPA规范,所以也可以称hibernate为JPA的一种实现方式。


07.入门案例

  1. 第二 springDataJpa的入门操作
  2. 案例:客户的基本CRUD
  3. i.搭建环境
  4. 创建工程导入坐标
  5. 配置spring的配置文件(配置spring Data jpa的整合)
  6. 编写实体类(Customer),使用jpa注解配置映射关系
  7. ii.编写一个符合springDataJpadao层接口
  8. * 只需要编写dao层接口,不需要编写dao层接口的实现类
  9. * dao层接口规范
  10. .需要继承两个接口(JpaRepositoryJpaSpecificationExecutor
  11. .需要提供响应的泛型

入门案例用到的method

  1. *
  2. findOneid :根据id查询
  3. save(customer):保存或者更新(依据:传递的实体类对象中,是否包含id属性)
  4. deleteid :根据id删除
  5. findAll() : 查询全部

2.2   搭建Spring Data JPA的开发环境

2.2.1     引入Spring Data JPA的依赖坐标

  1. <properties>
  2. <spring.version>4.3.6.RELEASE</spring.version>
  3. <hibernate.version>5.3.5.Final</hibernate.version>
  4. <slf4j.version>1.7.12</slf4j.version>
  5. <log4j.version>1.2.17</log4j.version>
  6. <c3p0.version>0.9.1.2</c3p0.version>
  7. <mysql.version>8.0.17</mysql.version>
  8. </properties>
  9.  
  10. <dependencies>
  11. <!-- junit单元测试 -->
  12. <dependency>
  13. <groupId>junit</groupId>
  14. <artifactId>junit</artifactId>
  15. <version>4.12</version>
  16. <scope>test</scope>
  17. </dependency>
  18.  
  19. <!-- spring beg -->
  20. <dependency>
  21. <groupId>org.aspectj</groupId>
  22. <artifactId>aspectjweaver</artifactId>
  23. <version>1.9.2</version>
  24. </dependency>
  25.  
  26. <dependency>
  27. <groupId>org.springframework</groupId>
  28. <artifactId>spring-aop</artifactId>
  29. <version>${spring.version}</version>
  30. </dependency>
  31.  
  32. <dependency>
  33. <groupId>org.springframework</groupId>
  34. <artifactId>spring-context</artifactId>
  35. <version>${spring.version}</version>
  36. </dependency>
  37.  
  38. <dependency>
  39. <groupId>org.springframework</groupId>
  40. <artifactId>spring-context-support</artifactId>
  41. <version>${spring.version}</version>
  42. </dependency>
  43.  
  44. <dependency>
  45. <groupId>org.springframework</groupId>
  46. <artifactId>spring-orm</artifactId>
  47. <version>${spring.version}</version>
  48. </dependency>
  49.  
  50. <dependency>
  51. <groupId>org.springframework</groupId>
  52. <artifactId>spring-beans</artifactId>
  53. <version>${spring.version}</version>
  54. </dependency>
  55.  
  56. <dependency>
  57. <groupId>org.springframework</groupId>
  58. <artifactId>spring-core</artifactId>
  59. <version>${spring.version}</version>
  60. </dependency>
  61. <!-- spring end -->
  62.  
  63. <!-- hibernate beg -->
  64. <dependency>
  65. <groupId>org.hibernate</groupId>
  66. <artifactId>hibernate-core</artifactId>
  67. <version>${hibernate.version}</version>
  68. </dependency>
  69. <dependency>
  70. <groupId>org.hibernate</groupId>
  71. <artifactId>hibernate-entitymanager</artifactId>
  72. <version>${hibernate.version}</version>
  73. </dependency>
  74. <dependency>
  75. <groupId>org.hibernate</groupId>
  76. <artifactId>hibernate-validator</artifactId>
  77. <version>${hibernate.version}</version>
  78. </dependency>
  79. <!-- hibernate end -->
  80.  
  81. <!-- c3p0 beg -->
  82. <dependency>
  83. <groupId>c3p0</groupId>
  84. <artifactId>c3p0</artifactId>
  85. <version>${c3p0.version}</version>
  86. </dependency>
  87. <!-- c3p0 end -->
  88.  
  89. <!-- log end -->
  90. <dependency>
  91. <groupId>log4j</groupId>
  92. <artifactId>log4j</artifactId>
  93. <version>${log4j.version}</version>
  94. </dependency>
  95.  
  96. <dependency>
  97. <groupId>org.slf4j</groupId>
  98. <artifactId>slf4j-api</artifactId>
  99. <version>${slf4j.version}</version>
  100. </dependency>
  101.  
  102. <dependency>
  103. <groupId>org.slf4j</groupId>
  104. <artifactId>slf4j-log4j12</artifactId>
  105. <version>${slf4j.version}</version>
  106. </dependency>
  107. <!-- log end -->
  108.  
  109. <dependency>
  110. <groupId>mysql</groupId>
  111. <artifactId>mysql-connector-java</artifactId>
  112. <version>${mysql.version}</version>
  113. </dependency>
  114.  
  115. <dependency>
  116. <groupId>org.springframework.data</groupId>
  117. <artifactId>spring-data-jpa</artifactId>
  118. <version>1.9.0.RELEASE</version>
  119. </dependency>
  120.  
  121. <dependency>
  122. <groupId>org.springframework</groupId>
  123. <artifactId>spring-test</artifactId>
  124. <version>${spring.version}</version>
  125. </dependency>
  126.  
  127. <!-- el beg 使用spring data jpa 必须引入 -->
  128. <dependency>
  129. <groupId>javax.el</groupId>
  130. <artifactId>javax.el-api</artifactId>
  131. <version>2.2.5</version>
  132. </dependency>
  133.  
  134. <dependency>
  135. <groupId>org.glassfish.web</groupId>
  136. <artifactId>javax.el</artifactId>
  137. <version>2.2.4</version>
  138. </dependency>
  139. <!-- el end -->
  140. </dependencies>


spring框架的配置文件

applicationcontext.xml

  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" xmlns:aop="http://www.springframework.org/schema/aop"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:tx="http://www.springframework.org/schema/tx"
  6. xmlns:jpa="http://www.springframework.org/schema/data/jpa" xmlns:task="http://www.springframework.org/schema/task"
  7. xsi:schemaLocation="
  8. http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
  9. http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
  10. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
  11. http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd
  12. http://www.springframework.org/schema/tx 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.  
  16. <!--spring 和 spring data jpa的配置-->
  17.  
  18. <!-- 1.创建entityManagerFactory对象交给spring容器管理-->
  19. <bean id="entityManagerFactoty" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
  20. <property name="dataSource" ref="dataSource" />
  21. <!--配置的扫描的包(实体类所在的包) -->
  22. <property name="packagesToScan" value="cn.bjut.domain" />
  23. <!-- jpa的实现厂家 -->
  24. <property name="persistenceProvider">
  25. <bean class="org.hibernate.jpa.HibernatePersistenceProvider"/>
  26. </property>
  27.  
  28. <!--jpa的供应商适配器 -->
  29. <property name="jpaVendorAdapter">
  30. <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
  31. <!--配置是否自动创建数据库表 -->
  32. <property name="generateDdl" value="false" />
  33. <!--指定数据库类型 -->
  34. <property name="database" value="MYSQL" />
  35. <!--数据库方言:支持的特有语法 -->
  36. <property name="databasePlatform" value="org.hibernate.dialect.MySQLDialect" />
  37. <!--是否显示sql -->
  38. <property name="showSql" value="true" />
  39. </bean>
  40. </property>
  41.  
  42. <!--jpa的方言 :高级的特性 -->
  43. <property name="jpaDialect" >
  44. <bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" />
  45. </property>
  46. </bean>
  47.  
  48. <!--2.创建数据库连接池 -->
  49. <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
  50. <property name="user" value="root"></property>
  51. <property name="password" value="root"></property>
  52. <property name="jdbcUrl" value="jdbc:mysql:///itheima?serverTimezone=Asia/Shanghai"></property>
  53. <property name="driverClass" value="com.mysql.cj.jdbc.Driver"></property>
  54. </bean>
  55.  
  56. <!--3.整合spring dataJpa-->
  57. <jpa:repositories base-package="cn.bjut.dao" transaction-manager-ref="transactionManager"
  58. entity-manager-factory-ref="entityManagerFactoty" ></jpa:repositories>
  59.  
  60. <!--4.配置事务管理器 -->
  61. <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
  62. <property name="entityManagerFactory" ref="entityManagerFactoty"></property>
  63. </bean>
  64.  
  65. <!-- 4.txAdvice-->
  66. <tx:advice id="txAdvice" transaction-manager="transactionManager">
  67. <tx:attributes>
  68. <tx:method name="save*" propagation="REQUIRED"/>
  69. <tx:method name="insert*" propagation="REQUIRED"/>
  70. <tx:method name="update*" propagation="REQUIRED"/>
  71. <tx:method name="delete*" propagation="REQUIRED"/>
  72. <tx:method name="get*" read-only="true"/>
  73. <tx:method name="find*" read-only="true"/>
  74. <tx:method name="*" propagation="REQUIRED"/>
  75. </tx:attributes>
  76. </tx:advice>
  77.  
  78. <!-- 5.aop-->
  79. <aop:config>
  80. <aop:pointcut id="pointcut" expression="execution(* cn.bjut.service.*.*(..))" />
  81. <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut" />
  82. </aop:config>
  83.  
  84. <!--5.声明式事务 -->
  85.  
  86. <!-- 6. 配置包扫描-->
  87. <context:component-scan base-package="cn.bjut" ></context:component-scan>
  88.  
  89. </beans>

09-入门案例:创建客户实体类并配置映射关系

  1. package cn.bjut.domain;
  2.  
  3. import javax.persistence.*;
  4.  
  5. /**
  6. * 1.实体类和表的映射关系
  7. * @Eitity
  8. * @Table
  9. * 2.类中属性和表中字段的映射关系
  10. * @Id
  11. * @GeneratedValue
  12. * @Column
  13. */
  14. @Entity
  15. @Table(name = "cst_customer")
  16. public class Customer {
  17.  
  18. @Id
  19. @GeneratedValue(strategy = GenerationType.IDENTITY)
  20. @Column(name="cust_id")
  21. private Long custId;
  22. @Column(name="cust_address")
  23. private String custAddress;
  24. @Column(name="cust_industry")
  25. private String custIndustry;
  26. @Column(name="cust_level")
  27. private String custLevel;
  28. @Column(name="cust_name")
  29. private String custName;
  30. @Column(name="cust_phone")
  31. private String custPhone;
  32. @Column(name="cust_source")
  33. private String custSource;
  34.  
  35. //=====下面是toString()方法和get/set方法=====//

10-入门案例:编写符合spring Data JPA规范的dao层接口

创建一个接口

cn.bjut.dao.CustomerDao

  1. package cn.bjut.dao;
  2.  
  3. import cn.bjut.domain.Customer;
  4. import org.springframework.data.jpa.repository.JpaRepository;
  5. import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
  6.  
  7. /**
  8. * 符合SpringDataJpa的dao层接口规范
  9. * JpaRepository<操作的实体类类型,实体类中主键属性的类型>
  10. * * 封装了基本CRUD操作
  11. * JpaSpecificationExecutor<操作的实体类类型>
  12. * * 封装了复杂查询(分页)
  13. */
  14. public interface CustomerDao extends JpaRepository<Customer,Long>, JpaSpecificationExecutor<Customer> {
  15.  
  16. }

然后创建一个测试类

cn.bjut.test.CustomerDaoTest

  1. @RunWith(SpringJUnit4ClassRunner.class) //声明spring提供的单元测试环境
  2. @ContextConfiguration(locations = "classpath:applicationContext.xml")//指定spring容器的配置信息
  3. public class CustomerDaoTest {
  4. @Autowired
  5. private CustomerDao customerDao;
  6.  
  7. /**
  8. * 根据id查询
  9. */
  10. @Test
  11. public void testFindOne() {
  12. Customer customer = customerDao.findOne(1l);
  13. System.out.println(customer);
  14. }
  15.  
  16. }

直接在接口中定义查询方法,如果是符合规范的,可以不用写实现,目前支持的关键字写法如下:

Spring Data JPA框架在进行方法名解析时,会先把方法名多余的前缀截取掉,比如 find、findBy、read、readBy、get、getBy,然后对剩下部分进行解析。

假如创建如下的查询:findByUserDepUuid(),框架在解析该方法时,首先剔除 findBy,然后对剩下的属性进行解析,假设查询实体为Doc
1:先判断 userDepUuid (根据 POJO 规范,首字母变为小写)是否为查询实体的一个属性,如果是,则表示根据该属性进行查询;如果没有该属性,继续第二步;
2:从右往左截取第一个大写字母开头的字符串此处为Uuid),然后检查剩下的字符串是否为查询实体的一个属性,如果是,则表示根据该属性进行查询;如果没有该属性,则重复第二步,继续从右往左截取;最后假设user为查询实体的一个属性;
3:接着处理剩下部分(DepUuid),先判断 user 所对应的类型是否有depUuid属性,如果有,则表示该方法最终是根据 “ Doc.user.depUuid” 的取值进行查询;否则继续按照步骤 2 的规则从右往左截取,最终表示根据 “Doc.user.dep.uuid” 的值进行查询。
4:可能会存在一种特殊情况,比如 Doc包含一个 user 的属性,也有一个 userDep 属性,此时会存在混淆。可以明确在属性之间加上 "_" 以显式表达意图,比如 "findByUser_DepUuid()" 或者 "findByUserDep_uuid()"
特殊的参数: 还可以直接在方法的参数上加入分页或排序的参数,比如:
Page<UserModel> findByName(String name, Pageable pageable);
List<UserModel> findByName(String name, Sort sort);
 
也可以使用JPA的NamedQueries,方法如下:
1:在实体类上使用@NamedQuery,示例如下:
@NamedQuery(name = "UserModel.findByAge",query = "select o from UserModel o where o.age >= ?1")
2:在自己实现的DAO的Repository接口里面定义一个同名的方法,示例如下:
public List<UserModel> findByAge(int age);
3:然后就可以使用了,Spring会先找是否有同名的NamedQuery,如果有,那么就不会按照接口定义的方法来解析。
 
 

12-入门案例:完成客户的添加和修改

  1. /**
  2. * save : 保存或者更新
  3. * 根据传递的对象是否存在主键id,
  4. * 如果没有id主键属性:保存
  5. * 存在id主键属性,根据id查询数据,更新数据
  6. */
  7. @Test
  8. public void testSave() {
  9. Customer customer = new Customer();
  10. customer.setCustName("程序员");
  11. customer.setCustLevel("vip");
  12. customer.setCustIndustry("it教育");
  13. customerDao.save(customer);
  14. }
  15.  
  16. @Test
  17. public void testUpdate() {
  18. Customer customer = new Customer();
  19. customer.setCustId(3l);
  20. customer.setCustName("程序员很厉害");
  21. customerDao.save(customer);
  22. }

13-入门案例:完成客户的删除

  1. @Test
  2. public void testDelete () {
  3. customerDao.delete(3l);
  4. }

14-入门案例:查询所有客户

  1. /**
  2. * 查询所有
  3. */
  4. @Test
  5. public void testFindAll() {
  6. List<Customer> list = customerDao.findAll();
  7. for(Customer customer : list) {
  8. System.out.println(customer);
  9. }
  10. }

18-执行过程:执行过程已经内部处理流程的总结

====================

未完待续。。

12 Spring Data JPA:springDataJpa的运行原理以及基本操作(上)的更多相关文章

  1. 12 Spring Data JPA:springDataJpa的运行原理以及基本操作(下)

    spring data jpaday1:orm思想和hibernate以及jpa的概述和jpa的基本操作 day2:springdatajpa的运行原理 day2:springdatajpa的基本操作 ...

  2. 12 Spring Data JPA:orm思想和hibernate以及jpa的概述和jpa的基本操作

    spring data jpa day1:orm思想和hibernate以及jpa的概述和jpa的基本操作 day2:springdatajpa的运行原理以及基本操作 day3:多表操作,复杂查询 d ...

  3. Spring Data JPA 大纲归纳

    第一天: springdatajpa day1:orm思想和hibernate以及jpa的概述和jpa的基本操作 day2:springdatajpa的运行原理以及基本操作 day3:多表操作,复杂查 ...

  4. 转:使用 Spring Data JPA 简化 JPA 开发

    从一个简单的 JPA 示例开始 本文主要讲述 Spring Data JPA,但是为了不至于给 JPA 和 Spring 的初学者造成较大的学习曲线,我们首先从 JPA 开始,简单介绍一个 JPA 示 ...

  5. spring spring data jpa save操作事务

    整合spring spring data jpa的时候,在save方法上加了@Transactional注解.此时调用springdatajpa save方法并不会真的把数据提交给数据库,而是缓存起来 ...

  6. 使用 Spring Data JPA 简化 JPA 开发

    从一个简单的 JPA 示例开始 本文主要讲述 Spring Data JPA,但是为了不至于给 JPA 和 Spring 的初学者造成较大的学习曲线,我们首先从 JPA 开始,简单介绍一个 JPA 示 ...

  7. Spring Data JPA 事务锁

    1.概述 在本快速教程中,我们将讨论在Spring Data JPA中为自定义查询方法和预定义存储库的CRUD方法启用事务锁, 我们还将查看不同的锁类型并设置事务锁超时. 2.锁类型 JPA定义了两种 ...

  8. spring data jpa封装specification实现简单风格的动态查询

    github:https://github.com/peterowang/spring-data-jpa-demo 单一实体的动态查询: @Servicepublic class AdvancedUs ...

  9. JDBC、ORM、JPA、Spring Data JPA,傻傻分不清楚?一文带你厘清个中曲直,给你个选择SpringDataJPA的理由!

    序言 Spring Data JPA作为Spring Data中对于关系型数据库支持的一种框架技术,属于ORM的一种,通过得当的使用,可以大大简化开发过程中对于数据操作的复杂度. 本文档隶属于< ...

随机推荐

  1. 029-PHP取随机数

    <?php //打印从1到100中间的10个随机的数 ; $index < ; $index++) { print(rand(,) . "<BR>\n"); ...

  2. C#路径2

    String apppath = System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase; //获取整个文件路径名ap ...

  3. 【剑指Offer】面试题11. 旋转数组的最小数字

    题目 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个 ...

  4. 2016蓝桥杯省赛C/C++A组第八题 四平方和

    题意: 四平方和定理,又称为拉格朗日定理: 每个正整数都可以表示为至多4个正整数的平方和. 如果把0包括进去,就正好可以表示为4个数的平方和. 比如: 5 = 0^2 + 0^2 + 1^2 + 2^ ...

  5. C++编程学习(四)声明/枚举

    一.typedef 声明 typedef 为一个已有的类型取一个新的名字 typedef int num;//feet是int的另一个名字num a;//a是int类型 二.枚举类型 enum col ...

  6. C++基础--虚函数和纯虚函数

    虚函数的一种重要的应用是在子类重写父类方法上,一般都是在父类中声明的时候用关键字virtual修饰. 在C++中,一个父类的对象指针是可以指向子类的实例化对象,这个时候可以用该对象指针来访问父类的成员 ...

  7. poj_2406 KMP寻找重复子串问题

    B - Power Strings Time Limit:3000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u S ...

  8. Elasticsearch分布式搜索

    ElasticSearch之介绍 一 Elasticsearch产生背景 1.1 大规模数据如何检索 如:当系统数据量上了10亿.100亿条的时候,我们在做系统架构的时候通常会从以下角度去考虑问题:1 ...

  9. ArchLinux安装Gnome桌面

    给Arch安装Gnome桌面美化及常用软件配置 一.创建普通用户 1.安装zsh 个人比较喜欢的一个shell,你们可以和我不同 # pacman -S zsh 2.创建用户 kain是我创建用户的名 ...

  10. c++ 模板练习2

    #include "stdafx.h" #include <iostream> using namespace std; template<class T> ...