SpringDataJPA的简单使用

前言

SpringDataJPA是基于Hibernate和jpa的基础数据库永久性操作,所以在学SpringDataJPA之前必须有Hibernate的基础,最起码要了解Hibernate的HQL语句,而JPA是一种与JDBC同等地位的操作数据库的规范,有学过HibernateJPA的同学会更容易理解SpringDataJPA,没有学过也可以直接开始学SpringDataJPA。关于什么是SpringDataJPA,JPA与JDBC之间的区别,有兴趣的同学自行百度。

通过继承repository实现单表查询

要实现SpringDataJPA,需要以下三个步骤:
一、配置spring主配置文件
二、数据表映射的实体类
三、数据操作方法的接口
接口需要继承Repository接口(标识接口,属于空接口),或者其子接口CrudRepository(提供CRUD的功能)、孙子接口PagingAndSortingRepository(父接口基础上添加分页和排序的功能)、曾孙接口JpaRepository(父接口基础上增加了一些实用的功能,比如:批量操作等);
可以看出继承Repository接口只是符合SpringDataJPA操作而已,具体的数据操作方法需要自己写,真正便捷的是继承JpaRepository,继承父类接口的便捷方法。

单表查询代码

applicationContext.xml配置

	<!-- 扫描包-->
	<context:component-scan base-package="com.qf"></context:component-scan>	
	<!-- 配置DataSource-->
	<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
		<property name="driverClass" value="com.mysql.jdbc.Driver"></property>
		<property name="jdbcUrl" value="jdbc:mysql:///library"></property>
		<property name="user" value="root"></property>
		<property name="password" value="123"></property>
	</bean>
	
		<!--  配置 JPA 的 EntityManagerFactory -->
	<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
		<!-- 数据源 -->
		<property name="dataSource" ref="dataSource"></property>
		<!-- 扫描实体类 -->
		<property name="packagesToScan" value="com.qf.entity"></property>
		<!--JPA供应商适配 -->
		<property name="jpaVendorAdapter">
			<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"></bean>
		</property>
		<!-- 配置hibernate的其他属性 -->
		<property name="jpaProperties">
			<props>
				<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
				<prop key="hibernate.show_sql">true</prop>
				<prop key="hibernate.format_sql">true</prop>
				<prop key="hibernate.hbm2ddl.auto">update</prop>
			</props>
		</property>
	</bean>

	<!-- 事务管理器-->
	<bean id="txManager" class="org.springframework.orm.jpa.JpaTransactionManager">
		<property name="entityManagerFactory" ref="entityManagerFactory" />
	</bean>

	<!-- Spring Data jpa的配置-->
	<jpa:repositories base-package="com.qf.dao" entity-manager-factory-ref="entityManagerFactory"
		transaction-manager-ref="txManager" />
	
	<tx:advice id="advice" transaction-manager="txManager">
		<tx:attributes>
			<tx:method name="get*" read-only="true"/>
			<tx:method name="get*" read-only="true"/>
			<tx:method name="*"/>
		</tx:attributes>
	</tx:advice>
	
	<aop:config>
		<aop:advisor advice-ref="advice" pointcut="execution(* com.qf.dao..*.*(..))"/>
	</aop:config>

需要自行修改的地方有DataSource的url地址中数据库名,EntityManagerFactory的实体类的包路径,Spring Data jpa的配置接口的包路径,事务的接口包路径

entity实体类

@Entity
@Table(name="books")
public class Book{
	@Id
	@GeneratedValue(strategy=GenerationType.AUTO)
	private int id;
	@Column(name="book_name",unique=true,nullable=false,length=20)
	private String name;
	@Column(name="book_author",nullable=false)
	private String author;
	@Column(name="book_storage")
	private int storage;
}	

dao层

public interface IBooksDao extends Repository<Book, Integer>{
	Book findByName(String bookName);
}

Test

	public static void main(String[] args) {
		ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
		IBooksDao dao = context.getBean(IBooksDao.class);
		Book book = dao.findByName("English");
		System.out.println(book);
	}

做完上面的步骤就能实现一个SpringDataJPA的简单使用,接下来给大家划重点:
1,实体类实现了对象与关系表的映射关系,也就是ORM的实现,
2,配置文件实现了C3P0连接池、Hibernate框架的配置(包含实体类映射配置)以及jpa的配置,这样就搭建好了SpringDataJPA运行的环境。
3,接口内方法的书写,编程具体需要实现的方法。
接口的方法书写规范有如下:

以下内容来源于网上,详情请点击这里https://www.cnblogs.com/jaejaking/p/7994233.html

假如我们创建如下的查询:findByUserDepUuid(),框架在解析该方法时,首先剔除findBy,然后对剩下的属性进行解析,假设查询实体为Doc。

  1. 先判断userDepUuid (根据POJO(Plain Ordinary Java Object简单java对象,实际就是普通java bean)规范,首字母变为小写。)是否是查询实体的一个属性,如果根据该属性进行查询;如果没有该属性,继续第二步。
  2. 从右往左截取第一个大写字母开头的字符串(此处为Uuid),然后检查剩下的字符串是否为查询实体的一个属性,如果是,则表示根据该属性进行查询;如果没有该属性,则重复第二步,继续从右往左截取;最后假设 user为查询实体的一个属性。
  3. 接着处理剩下部分(DepUuid),先判断user所对应的类型是否有depUuid属性,如果有,则表示该方法最终是根据 “Doc.user.depUuid” 的取值进行查询;否则继续按照步骤 2的规则从右往左截取,最终表示根据“Doc.user.dep.uuid” 的值进行查询。
  4. 可能会存在一种特殊情况,比如 Doc包含一个user的属性,也有一个 userDep 属性,此时会存在混淆。可以明确在属性之间加上 “_“以显式表达意图,比如"findByUser_DepUuid()” 或者"findByUserDep_uuid()”。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值