Spring data jpa 简介
1、引入及启用配置:
1.1使用maven引入跟自己spring版本相关相关jar包
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
<version>2.2.2.RELEASE</version>
</dependency>
1.2配置jpa Adapter和entityManager
<!-- 设置JPA 的entityManagerFactory -->
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="jpaVendorAdapter" ref="hibernateJpaVendorAdapter" />
<!-- 加入定制化包路径 -->
<property name="packagesToScan" value="com.qcsy" />
<property name="jpaProperties">
<props>
<prop key="hibernate.current_session_context_class">thread</prop>
<prop key="hibernate.show_sql">false</prop>
<prop key="hibernate.format_sql">false</prop>
<!-- 建表的命名规则 -->
<prop key="hibernate.ejb.naming_strategy">org.hibernate.cfg.ImprovedNamingStrategy</prop>
</props>
</property>
</bean>
<!-- 设置JPA实现厂商的特定属性 -->
<bean id="hibernateJpaVendorAdapter"
class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="databasePlatform" value="${hibernate.dialect}"/>
</bean>
1.3启用配置
要使用spring的jpa功能,首先开启spring的配置(base-package是指扩展了jpa接口Repository接口的存放位置):
- 如果基于java配置的话,应该使用注解@EnableJpaRepositories,可以在参数中配置:扫描包路径basePackges例如:
- 使用xml 配置
.......
xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xsi:schemaLocation="
.......
http://www.springframework.org/schema/data/jpa
http://www.springframework.org/schema/data/jpa/spring-jpa.xsd">
.......
<jpa:repositories base-package=“xxxx”>
2、定义查询方法
写一个接口基础jpa的JpaRepository接口,例如:
public interface UserRepository extends JpaRepository<>{
User findByUsername(String username);
}
2.1、Repository的语法
Repository方法是由一个动词、一个可选的主题(Subject)、关键词By以及一个断言所组成
- 动词:可以为get、read、find和count 其中动词get、read和find是同义的 count是用来计数的
1.get方法select不到数据则报错,find方法select不到数据则返回null。
2.get延迟加载,在真正访问返回的代理对象的属性之前,它从不访问数据库。find则立即加载,将返回到数据库中的一行映射到实际的某个对象。
- 主题:是可选的。它的主要目的是让你在命名方法的时候,有更多的灵活性
- 断言:中,会有一个或多个限制结果的条件。每个条件必须引用一个属性,并且还可以指定一种比较操作。如果省略比较操作符的话,那么这暗指是一种相等比较操作。不过,我们也可以选择其他的比较操作,包括如下的种类:
IsAfter、After、IsGreaterThan、GreaterThan
IsGreaterThanEqual、GreaterThanEqual
IsBefore、Before、IsLessThan、LessThan
IsLessThanEqual、LessThanEqual
IsBetween、Between
IsNull、Null
IsNotNull、NotNull
IsIn、In
IsNotIn、NotIn
IsStartingWith、StartingWith、StartsWith
IsEndingWith、EndingWith、EndsWith
IsContaining、Containing、Contains
IsLike、Like
IsNotLike、NotLike
IsTrue、True
IsFalse、False
Is、Equals
IsNot、Not
要处理String类型的属性时,条件中可能还会包含IgnoringCase或IgnoresCase,这样在执行对比的时候就会不再考虑字符是大写还是小写或者可以采用IgnoringCase/IgnoresCase的替代方案,我们还可以在所有条件的后面添加AllIgnoringCase或AllIgnoresCase。
例如:
我们还可以在方法名称的结尾处添加OrderBy 以用于排序
2.2、使用@Query查询
spring 除了可以使用Repository方法查询,还可以声明自定义查询,即注解@Qyuery
如果需要使用本地查询的话。标注为nativeQuery = true
例如:
@Query(value = "SELECT * FROM sonep_user sr where sr.is_void=0",nativeQuery = true) List<Map> queryUserCombo();
3、使用混合模式查询
spring jpa可以结合spring其他的数据库操作方式混合使用:spring data jpa 接口生成实现的时候它还会查找名字与接口相同并且添加了Impl后缀的一个类,如果这个类存在的话,它会将它的方法与spring jpa生成的方法集合在一起。
例如
传统接口:
接口的Impl实现类:
与spring data jpa混合使用:
如果不想使用Impl作为实现类的后缀的话,可以在配置文件中进行修改:
@EnableJpaRepositories(basePackages = "cn.qcsy", repositoryImplementationPostfix = "Impl")
4、其他
Repository的实现类是在应用启动的时候生成的,也是就是说是在spring的应用上下文创建的时候生成的,并不是在构建时通过该代码技术生成,也不是在调用接口的时候生成的。