浅谈SpringDataJpa

介绍

它是JPA规范的再次封装抽象,底层还是使用了Hibernate的JPA技术实现,引用JPQL的查询语句 ,是属于Spring的生成体系中的一部分。
SpringDataJpa使用起来比较方便,加快了开发的效果,不需要关心和配置更多的东西。
SpringDataJpa上手简单,开发效率高,对对象的支持非常好,还十分的灵活。

Spring Data项目是从2010年开发发展起来的,是一个用于简化数据库访问,并支持云服务的开源框架。其主要目标是使得对数据的访问变得方便快捷,并支持map-reduce框架和云计算数据服务。 Spring Data 包含多个子项目:
Commons - 提供共享的基础框架,适合各个子项目使用,支持跨数据库持久化

01、ORM框架

MyBatis:Apache的一个开源项目,上手简单,开发灵活,现在市场占有率高; 但是开发时工作量比较大,需要做很多配置,并且自己要写SQL语句。
Hibernate:一个开放源代码的对象关系映射框架,是完全面向对象的。可以使用面向对象的思路来完成数据库操作。 Hibernate是完备的ORM框架(咱们之前学习JPA,底层就是使用Hibernate完成的)。

02、SpringData的结构

Spring Data JPA的七个Repository接口:
	Repository(org.springframework.data.repository.Repository)
				Repository是 Spring Data JPA 中为我们提供的所有接口中的顶层接口
	CrudRepository(org.springframework.data.repository.CrudRepository)
				CrudRepository   主要用于对实体的增删改查操作
	PagingAndSortingRepository(org.springframework.data.repository.PagingAndSortingRepository)
			PagingAndSortingRepository提供分页和排序功能
	JpaRepository (org.springframework.data.jpa.repository.JpaRepository)
			JpaRepository提供JPA相关的方法,如刷新持久化数据、批量删除。
	QueryByExampleExecutor(org.springframework.data.repository.query.QueryByExampleExecutor)
	JpaSpecificationExecutor (org.springframework.data.jpa.repository.JpaSpecificationExecutor)
	QueryDslPredicateExecutor (org.springframework.data.querydsl.QueryDslPredicateExecutor)

两大Repository实现类:
SimpleJpaRepository(org.springframework.data.jpa.repository.support.SimpleJpaRepository)
QueryDslJpaRepository(org.springframework.data.jpa.repository.support.QueryDslJpaRepository)

结构图(通过Intellij Idea,打开SimpleJpaRepository.java,单击鼠标右键show diagrams,就可以用图表的式打开与查询类的关系层次图,每次看图很麻烦,也可以点击类名按F4去查看子类):
在这里插入图片描述

CrudRepository:完成所有基本的增删改查的方法

其中T是要操作的实体类,ID是实体类主键的类型。该接口提供了11个常用操作方法
在这里插入图片描述

PagingAndSortingRepository:完成分页与排序功能

在这里插入图片描述

JpaRepository:

在这里插入图片描述

注意与说明:
1.几个查询、及批量保存方法,和 CrudRepository 接口相比,返回的是 List,使用起来更方便。
2.增加了 InBatch 删除, 实际执行时,后台生成一条sql语句,效率更高些。相比较而言,CrudRepository 接口的删除方法,都是一条一条删除的,即便是 deleteAll 也是一条一条删除的。
3.增加了 getOne() 方法,切记,该方法返回的是对象引用,当查询的对象不存在时,它的值不是Null。

创建项目

一般来说,都是去创建一个webapp的maven项目,好处都知道嘛,自动导包,舒服的很

在这里插入图片描述

配置文件

jdbc.properties:

	driverClassName=com.mysql.jdbc.Driver
	url=jdbc:mysql:///数据库名称
	username=用户名
	password=密码

spring.xml(一般用的名字是ApplicationContext.xml,个人习惯spring.xml):

<?xml version="1.0" encoding="UTF-8"?>

<!-- 扫描service部分的包 -->
<context:component-scan base-package="cn.dw" />
<context:property-placeholder system-properties-mode="FALLBACK" location="classpath:jdbc.properties" />

<!-- 配置连接池 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <!--连接数据4个属性 -->
    <property name="driverClassName" value="${driverClassName}" />
    <property name="url" value="${url}" />
    <property name="username" value="${username}" />
    <property name="password" value="${password}" />
    <!--maxActive: 最大连接数量 -->
    <property name="maxActive" value="150" />
    <!--minIdle: 最小空闲连接 -->
    <property name="minIdle" value="5" />
    <!--maxIdle: 最大空闲连接 -->
    <property name="maxIdle" value="20" />
    <!--initialSize: 初始化连接 -->
    <property name="initialSize" value="30" />
    <!-- 用来配置数据库断开后自动连接的 -->
    <!-- 连接被泄露时是否打印 -->
    <property name="logAbandoned" value="true" />
    <!--removeAbandoned: 是否自动回收超时连接 -->
    <property name="removeAbandoned" value="true" />
    <!--removeAbandonedTimeout: 超时时间(以秒数为单位) -->
    <property name="removeAbandonedTimeout" value="10" />
    <!--maxWait: 超时等待时间以毫秒为单位 1000等于60秒 -->
    <property name="maxWait" value="1000" />
    <!-- 在空闲连接回收器线程运行期间休眠的时间值,以毫秒为单位. -->
    <property name="timeBetweenEvictionRunsMillis" value="10000" />
    <!-- 在每次空闲连接回收器线程(如果有)运行时检查的连接数量 -->
    <property name="numTestsPerEvictionRun" value="10" />
    <!-- 1000 * 60 * 30 连接在池中保持空闲而不被空闲连接回收器线程 -->
    <property name="minEvictableIdleTimeMillis" value="10000" />
    <property name="validationQuery" value="SELECT NOW() FROM DUAL" />
</bean>

<!-- 集成hibernate的jpa功能 -->
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <!--待扫描的实体类包,不再需要persistence.xml了 -->
    <property name="packagesToScan" value="cn.dw.domain" />
    <!-- 3.配置JPA的实现 -->
    <!-- private JpaVendorAdapter jpaVendorAdapter; -->
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <!-- org.springframework.orm.jpa.vendor.AbstractJpaVendorAdapter -->
            <!-- private boolean showSql = false;是否显示sql语句 -->
            <property name="showSql" value="true" />
            <!-- private boolean generateDdl = false;是否建表 -->
            <property name="generateDdl" value="false" />
            <!-- private String databasePlatform;原来方言 -->
            <property name="databasePlatform" value="org.hibernate.dialect.MySQLDialect" />
        </bean>
    </property>
</bean>

<!-- Jpa 事务配置 -->
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<!-- 注解声明式事务管理 -->
<tx:annotation-driven transaction-manager="transactionManager" />

<!-- Spring Data Jpa配置 ********************************************-->
<!-- base-package:扫描的包 -->
<jpa:repositories base-package="cn.dw.repository" transaction-manager-ref="transactionManager"
                  entity-manager-factory-ref="entityManagerFactory" />

03、JpaRepository的基本功能

3.1.普通的CRUD(也就是测试类 测试代码)

测试类注意在类上方加注解,@Autowired为自动注入
简单的一些增删改查的话写代码的过程中回去继承实现其他类,类中有包装,不需要自己去写
在这里插入图片描述

其他查询

其中nativeQuery=true表示使用原生的sql语句在这里插入图片描述

04、jpa-spec插件

推荐适用网站:https://github.com/wenhao/jpa-spec

在Maven中引入相应的包

在这里插入图片描述

多个查询

在这里插入图片描述

抽取工具类

在进行多个条件查询的时候,会发现查询的越多代码量就越杂,很容易出错,,这个时候完全可以去抽取一个工具类,后面用的时候舒服的很
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值