spring data jpa入门学习
本文主要介绍下spring data jpa,主要聊聊为何要使用它进行开发以及它的基本使用。本文主要是入门介绍,并在最后会留下完整的demo供读者进行下载,从而了解并且开始使用spring data jpa。
(1)spring data jpa是什么?
小菜认为,spring data jpa,一、首先他不是ORM框架,跟hibernate不是同一个东西,hibernate是JPA标准的一个实现;二、它是对JPA进行了封装,并且提供一些基础的操作方法供开发者使用从而简化数据访问层的开发,我们使用spring data jpa 的目的就是为了简化开发。
(2)spring data jpa 对持久层的简化
spring data jpa主要是对持久层进行简化,主要体现在于:只要声明持久层的接口,无需编写具体的逻辑实现。这个原理是:根据方法名字进行解析,从而获取这个方法要执行的操作。例如,findByUserName(String name),我们可以看到他要做的就是根据用户名进行查询。spring data jpa提供了丰富的根据关键字组合进行查询,比如 like 、 not null、by等,如图:
所以我们的持久层就会显得非常精简,先看看一个简单的持久层:
1 package com.lcy.web.systemuser.model;
2
3 import java.util.List;
4
5 import org.springframework.data.domain.Pageable;
6 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
7 import org.springframework.data.jpa.repository.Modifying;
8 import org.springframework.data.jpa.repository.Query;
9 import org.springframework.data.repository.CrudRepository;
10 import org.springframework.data.repository.PagingAndSortingRepository;
11 import org.springframework.stereotype.Repository;
12 import org.springframework.transaction.annotation.Transactional;
13
14 import com.lcy.web.systemuser.pojo.User;
15 @Repository
16 public interface UserRepository extends CrudRepository < User, Long > ,PagingAndSortingRepository<User,Long>, JpaSpecificationExecutor <User>{
17
18
19 @Query(value="select user from User user where competence=0",nativeQuery=false)
20 public List<User> getSystemUsers(Pageable pageable);
21
22 @Query(value="select user from User user where competence=?1")
23 public List<User> getNormalUsers(Integer status);
24 /**
25 * nativeQuery=true 表示采用原生SQL语句进行操作
26 */
27 @Query(value="select * from cms_user where competence=?1",nativeQuery=true)
28 public List<User> getNormalUsersInNativeQuery(Integer status);
29
30 @Modifying //表示修改操作,记得加事务
31 @Query(value="update User user set user.userName=?1 where user.userName=?2 ")
32 public void updateNameByName(String newName,String oldName);
33 public User findByUserNameLike(String userName);
34 }
内容不说,只要看看几点因素,我们看到持久层只是一个接口,具体的方法的实现逻辑都省略到掉了,@Repository注解声明是持久层,主要看看它继承的三个类:
CrudRepository :提供基础的增删改查操作;
PagingAndSortingRepository:分页和排序的操作、
JpaSpecificationExecutor :组合查询条件,提供原生SQL查询
(3)spring data JPA的几个常用的功能:增删改查、自定义SQL语句操作、分页查询
3.1 增删改查
持久层继承CrudRepository,CrudRepository提供了基础的增删改查操作,所以无需在持久层再次编写方法,直接调用即可完成基础的操作,比如:
1
2
|
1 userRepository.findAll(); 2 userRepository.findOne(id); |
3.2自定义SQL语句操作
实际开发中有很多时候还是根据具体的需要进行一些自定义的查询方法或者其他操作,这时候需要开发人员去编写相关的SQL语句,spring data jpa提供了原生SQL语句操作还有面向对象的SQL操作
1
|
比如: |
1 @Query(value="select user from User user where competence=?1")
2 public List<User> getNormalUsers(Integer status);
3 /**
4 * nativeQuery=true 表示采用原生SQL语句进行操作
5 */
6 @Query(value="select * from cms_user where competence=?1",nativeQuery=true)
7 public List<User> getNormalUsersInNativeQuery(Integer status);
3.3 分页查询
关键类:Sort、Pageable和Specification,说明:Sort是排序条件组合,Pageable是分页的信息组合(当前页数、每页记录数等),Specification是查询条件的组合。
例如:
1 //1. 排序
2 Sort sort=new Sort(Sort.Direction.ASC, "id");
3 //2.分页条件
4 Pageable pageable=new PageRequest(0, 2, sort);
5 //3.查询条件组合
6 Specification<User> s=new Specification<User>() {
7 @Override
8 public Predicate toPredicate(Root<User> root, CriteriaQuery<?> query,
9 CriteriaBuilder builder) {
10 Path<String> name=root.get("userName");
11 Path<User> competence=root.get("competence");
12 query.where(builder.like(name, "%K%"),builder.equal(competence, "1"));
13 return null;
14 }
15 };
16 //执行
17 Page<User> users=userRepository.findAll(s,pageable);
分页写的一些基础使用的代码,在实际开发中是不会这样写的,不够通用导致代码重复,当然目前已经有了相关的开源项目已经做得很好了,比如江南白衣的springside里面就有对分页做了很好的封装,使用起来非常方便。
简单的spring data jpa就介绍到这里,纯属入门介绍,要深入学习还是看官方文档比较好:
下面是参考资料:
spring data jpa的官方文档:http://docs.spring.io/spring-data/data-jpa/docs/current/reference/html/
spring data jpa入门学习的更多相关文章
- Spring Data Jpa 入门学习
本文主要讲解 springData Jpa 入门相关知识, 了解JPA规范与Jpa的实现,搭建springboot+dpringdata jpa环境实现基础增删改操作,适合新手学习,老鸟绕道~ 1. ...
- Spring Data JPA入门及深入
一:Spring Data JPA简介 Spring Data JPA 是 Spring 基于 ORM 框架.JPA 规范的基础上封装的一套JPA应用框架,可使开发者用极简的代码即可实现对数据库的访问 ...
- Spring Data JPA 入门Demo
什么是JPA呢? 其实JPA可以说是一种规范,是java5.0之后提出来的用于持久化的一套规范:它不是任何一种ORM框架,在我看来,是现有ORM框架在这个规范下去实现持久层. 它的出现是为了简化现有的 ...
- Spring Data JPA入门
1. Spring Data JPA是什么 它是Spring基于ORM框架.JPA规范封装的一套JPA应用框架,可使开发者用极简的代码即可实现对数据的访问和操作.它提供了包括增删改查等在内的常用功能, ...
- Spring Data JPA 入门篇
Spring Data JPA是什么 它是Spring基于ORM框架(如hibernate,Mybatis等).JPA规范(Java Persistence API)封装的一套 JPA应用框架,可使开 ...
- Spring Data Jpa --- 入门
一.概述 Spring Data是Spring下的一个子项目,用于简化数据库访问,并支持云服务的开源框架.Spring Data支持NoSQL和 关系数据存储,其主要目标是使得数据库的访问变得方便快捷 ...
- 【ORM框架】Spring Data JPA(一)-- 入门
本文参考:spring Data JPA入门 [原创]纯干货,Spring-data-jpa详解,全方位介绍 Spring Data JPA系列教程--入门 一.Spring Data JPA介 ...
- Spring Data JPA 教程(翻译)
写那些数据挖掘之类的博文 写的比较累了,现在翻译一下关于spring data jpa的文章,觉得轻松多了. 翻译正文: 你有木有注意到,使用Java持久化的API的数据访问代码包含了很多不必要的模式 ...
- 深入浅出学Spring Data JPA
第一章:Spring Data JPA入门 Spring Data是什么 Spring Data是一个用于简化数据库访问,并支持云服务的开源框架.其主要目标是使得对数据的访问变得方便快捷,并支持map ...
随机推荐
- C# 学习之旅(1)
第一, 输入输出流都来自控制台. using System; using System.Collections.Generic; using System.Linq; using System.Tex ...
- 2016022601 - redis入门了解
今天开始学习redis,先从网页上学习,主要学习地址是:易百中的redis和redis中国网站. 此片章学习来自于自:http://www.yiibai.com/redis/redis_quick_g ...
- Jar包下载
到maven上面下载 http://mvnrepository.com/artifact/redis.clients/jedis/2.9.0 到jarfire去下载 http://cn.jarfire ...
- Spring AOP进行日志记录
在java开发中日志的管理有很多种.我一般会使用过滤器,或者是Spring的拦截器进行日志的处理.如果是用过滤器比较简单,只要对所有的.do提交进行拦截,然后获取action的提交路径就可以获取对每个 ...
- Transaction Log Truncation
--method 1-- ALTER DATABASE KIS_Sample3 SET RECOVERY SIMPLE ) ALTER DATABASE KIS_Sample3 SET RECOVER ...
- 正则表达式通过Unicode属性匹配
原文链接:http://zochen.iteye.com/blog/690716 Unicode 编码并不只是为某个字符简单定义了一个编码,而且还将其进行了归类. \pP 其中的小写 p 是 prop ...
- 关于mapreduce过程中出现的错误:Too many fetch-failures
Reduce task启动后第一个阶段是shuffle,即向map端fetch数据.每次fetch都可能因为connect超时,read超时,checksum错误等原因而失败.Reduce task为 ...
- Code for the Homework2 改进
1. 实现了到指定点各个关节的转角计算(多解性),并且所求解满足各个关节的最大角和最小角的限制条件. 2. 对方向向量进行了单位化,保证任意大小的向量都行 #include<iostream&g ...
- 1029: [JSOI2007]建筑抢修 - BZOJ
Description 小刚在玩JSOI提供的一个称之为“建筑抢修”的电脑游戏:经过了一场激烈的战斗,T部落消灭了所有z部落的入侵者.但是T部落的基地里已经有N个建筑设施受到了严重的损伤,如果不尽快修 ...
- struts2 action中传递两个参数到url
<action name="outInDetail" class="formManage_outInDetailAction"> <resul ...