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