Spring Data JPA 简单介绍
2016-03-28 00:00
531 查看
原文地址:http://www.blogjava.net/stone2083/archive/2011/08/25/357262.html
背景
考虑到公司应用中数据库访问的多样性和复杂性,目前正在开发UDSL(统一数据访问层),开发到一半的时候,偶遇SpringData工程。发现两者的思路惊人的一致。
于是就花了点时间了解SpringData,可能UDSL II期会基于SpringData做扩展
SpringData相关资料
介绍:针对关系型数据库,KV数据库,Document数据库,Graph数据库,Map-Reduce等一些主流数据库,采用统一技术进行访问,并且尽可能简化访问手段。
目前已支持的数据库有(主要):MongoDB,Neo4j,Redis,Hadoop,JPA等
SpringData官方资料(强烈推荐,文档非常详细)
SpringData主页:http://www.springsource.org/spring-data
SpringDataJPA 指南文档:http://static.springsource.org/spring-data/data-jpa/docs/current/reference/html/ (非常详细)
SpringDataJPA Examples: https://github.com/SpringSource/spring-data-jpa-examples (非常详细的例子)
Spring-Data-Jpa简介
Spring Data Jpa 极大简化了数据库访问层代码,只要3步,就能搞定一切
1. 编写Entity类,依照JPA规范,定义实体
2. 编写Repository接口,依靠SpringData规范,定义数据访问接口(注意,只要接口,不需要任何实现)
3. 写一小陀配置文件 (Spring Scheme配置方式极大地简化了配置方式)
下面,我依赖Example中的例子,简单地介绍下以上几个步骤
User.java
[java] view plain
Repository.java
[java] view plain
需要关注它继承的接口,我简单介绍几个核心接口
Repository: 仅仅是一个标识,表明任何继承它的均为仓库接口类,方便Spring自动扫描识别
CrudRepository: 继承Repository,实现了一组CRUD相关的方法
PagingAndSortingRepository: 继承CrudRepository,实现了一组分页排序相关的方法
JpaRepository: 继承PagingAndSortingRepository,实现一组JPA规范相关的方法
JpaSpecificationExecutor: 比较特殊,不属于Repository体系,实现一组JPA Criteria查询相关的方法
不需要写任何实现类,Spring Data Jpa框架帮你搞定这一切。
Spring Configuration
[java] view plain
核心代码只要配置一行:<jpa:repositories base-package="org.springframework.data.jpa.example.repository.simple" />即可。上面的仅仅是数据源,事务的配置而已。
至此,大功告成,即可运行
[java] view plain
其中,写操作相对比较简单,我不做详细介绍,针对读操作,我稍微描述下:
Method Query: 方法级别的查询,针对
Named Query: 针对一些复杂的SQL,支持原生SQL方式,进行查询,保证性能
Criteria Query: 支持JPA标准中的Criteria Query
背景
考虑到公司应用中数据库访问的多样性和复杂性,目前正在开发UDSL(统一数据访问层),开发到一半的时候,偶遇SpringData工程。发现两者的思路惊人的一致。
于是就花了点时间了解SpringData,可能UDSL II期会基于SpringData做扩展
SpringData相关资料
介绍:针对关系型数据库,KV数据库,Document数据库,Graph数据库,Map-Reduce等一些主流数据库,采用统一技术进行访问,并且尽可能简化访问手段。
目前已支持的数据库有(主要):MongoDB,Neo4j,Redis,Hadoop,JPA等
SpringData官方资料(强烈推荐,文档非常详细)
SpringData主页:http://www.springsource.org/spring-data
SpringDataJPA 指南文档:http://static.springsource.org/spring-data/data-jpa/docs/current/reference/html/ (非常详细)
SpringDataJPA Examples: https://github.com/SpringSource/spring-data-jpa-examples (非常详细的例子)
Spring-Data-Jpa简介
Spring Data Jpa 极大简化了数据库访问层代码,只要3步,就能搞定一切
1. 编写Entity类,依照JPA规范,定义实体
2. 编写Repository接口,依靠SpringData规范,定义数据访问接口(注意,只要接口,不需要任何实现)
3. 写一小陀配置文件 (Spring Scheme配置方式极大地简化了配置方式)
下面,我依赖Example中的例子,简单地介绍下以上几个步骤
User.java
[java] view plain
/** 2 * User Entity Sample 3 * 4 * @author <a href="mailto:li.jinl@alibaba-inc.com">Stone.J</a> Aug 25, 2011 5 */ 6 @Entity 7 public class User extends AbstractPersistable<Long> { 8 9 private static final long serialVersionUID = -2952735933715107252L; 10 11 @Column(unique = true) 12 private String username; 13 private String firstname; 14 private String lastname; 15 16 public String getUsername() { 17 return username; 18 } 19 20 public void setUsername(String username) { 21 this.username = username; 22 } 23 24 public String getFirstname() { 25 return firstname; 26 } 27 28 public void setFirstname(String firstname) { 29 this.firstname = firstname; 30 } 31 32 public String getLastname() { 33 return lastname; 34 } 35 36 public void setLastname(String lastname) { 37 this.lastname = lastname; 38 } 39
Repository.java
[java] view plain
1 /** 2 * User Repository Interface. 3 * 4 * @author <a href="mailto:li.jinl@alibaba-inc.com">Stone.J</a> Aug 25, 2011 5 */ 6 public interface SimpleUserRepository extends CrudRepository<User, Long>, JpaSpecificationExecutor<User> { 7 8 public User findByTheUsersName(String username); 9 10 public List<User> findByLastname(String lastname); 11 12 @Query("select u from User u where u.firstname = ?") 13 public List<User> findByFirstname(String firstname); 14 15 @Query("select u from User u where u.firstname = :name or u.lastname = :name") 16 public List<User> findByFirstnameOrLastname(@Param("name") String name); 17
需要关注它继承的接口,我简单介绍几个核心接口
Repository: 仅仅是一个标识,表明任何继承它的均为仓库接口类,方便Spring自动扫描识别
CrudRepository: 继承Repository,实现了一组CRUD相关的方法
PagingAndSortingRepository: 继承CrudRepository,实现了一组分页排序相关的方法
JpaRepository: 继承PagingAndSortingRepository,实现一组JPA规范相关的方法
JpaSpecificationExecutor: 比较特殊,不属于Repository体系,实现一组JPA Criteria查询相关的方法
不需要写任何实现类,Spring Data Jpa框架帮你搞定这一切。
Spring Configuration
[java] view plain
<beans> 2 <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 3 <property name="dataSource" ref="dataSource" /> 4 <property name="jpaVendorAdapter"> 5 <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 6 <property name="generateDdl" value="true" /> 7 <property name="database" value="HSQL" /> 8 </bean> 9 </property> 10 <property name="persistenceUnitName" value="jpa.sample" /> 11 </bean> 12 13 <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 14 <property name="entityManagerFactory" ref="entityManagerFactory" /> 15 </bean> 16 17 <jdbc:embedded-database id="dataSource" type="HSQL" /> 18 19 20 <jpa:repositories base-package="org.springframework.data.jpa.example.repository.simple" /> 21 </beans>
核心代码只要配置一行:<jpa:repositories base-package="org.springframework.data.jpa.example.repository.simple" />即可。上面的仅仅是数据源,事务的配置而已。
至此,大功告成,即可运行
[java] view plain
1 /** 2 * Intergration test showing the basic usage of {@link SimpleUserRepository}. 3 * 4 * @author <a href="mailto:li.jinl@alibaba-inc.com">Stone.J</a> Aug 25, 2011 5 */ 6 @RunWith(SpringJUnit4ClassRunner.class) 7 @ContextConfiguration(locations = "classpath:simple-repository-context.xml") 8 @Transactional 9 public class SimpleUserRepositorySample { 10 11 @Autowired 12 SimpleUserRepository repository; 13 User user; 14 15 @Before 16 public void setUp() { 17 user = new User(); 18 user.setUsername("foobar"); 19 user.setFirstname("firstname"); 20 user.setLastname("lastname"); 21 } 22 23 // crud方法测试 24 @Test 25 public void testCrud() { 26 user = repository.save(user); 27 assertEquals(user, repository.findOne(user.getId())); 28 } 29 30 // method query测试 31 @Test 32 public void testMethodQuery() throws Exception { 33 user = repository.save(user); 34 List<User> users = repository.findByLastname("lastname"); 35 assertNotNull(users); 36 assertTrue(users.contains(user)); 37 } 38 39 // named query测试 40 @Test 41 public void testNamedQuery() throws Exception { 42 user = repository.save(user); 43 List<User> users = repository.findByFirstnameOrLastname("lastname"); 44 assertTrue(users.contains(user)); 45 } 46 47 // criteria query测试 48 @Test 49 public void testCriteriaQuery() throws Exception { 50 user = repository.save(user); 51 List<User> users = repository.findAll(new Specification<User>() { 52 53 @Override 54 public Predicate toPredicate(Root<User> root, CriteriaQuery<?> query, CriteriaBuilder cb) { 55 return cb.equal(root.get("lastname"), "lastname"); 56 } 57 }); 58 assertTrue(users.contains(user)); 59 } 60
其中,写操作相对比较简单,我不做详细介绍,针对读操作,我稍微描述下:
Method Query: 方法级别的查询,针对
findBy,
find,
readBy,
read,
getBy等前缀的方法,解析方法字符串,生成查询语句,其中支持的关键词有:
Named Query: 针对一些复杂的SQL,支持原生SQL方式,进行查询,保证性能
Criteria Query: 支持JPA标准中的Criteria Query
相关文章推荐
- java html特殊字符转换
- 排序算法--快速排序法
- Web Services(2)-Spring+CXF 发布WS
- java内存模型与线程(二)
- 解决Eclipse 更新慢问题
- Java实现n!(递归)
- SpringMVC4.x配置JSON视图
- java的concurrent包简介
- java的concurrent包工具类
- java的concurrent包的存储类
- Java构造和解析Json数据的两种方法详解一
- Java构造和解析Json数据的两种方法详解二
- java.lang.IllegalStateException: No output folder
- Exception in thread "Timer-0" java.lang.OutOfMemor
- Spring最新教程(译自Spring官网)——构建一个RESTful Web Service
- 20145203盖泽双 《Java程序设计》第四周学习总结
- 学Java图形界面的一次小的的总结
- java验证手机号码格式
- 20145337《Java程序设计》第四周学习总结
- 20145129 《Java程序设计》第4周学习总结