初探 spring data(一)--- spring data 概述
由于自己一个项目要用多到Sql与NoSql两种截然不同的数据结构,但在编程上我希望统一接口API,让不同类型的数据库能在相同的编程接口模式下运作。于是找了一个spring的官网,发现一个spring data的项目。Spring Data 统一所有访问数据库的接口,为开发者提供一个更加简便的开发方式 Spring Data 官网
下面是几个核心的项目介绍
- Spring Data Commons - 每个Spring Data 项目的核心基础 (因此每一个Spring Data项目都使用统一的接口)
- Spring Data Gemfire - 以Spring 的方式 提供GemFire 的简单配置和访问
- Spring Data JPA - 简化所有JPA标准数据库访问和操作(例如Hibernate MyBatis等等)
- Spring Data KeyValue - 简化所有以Map结构数据库及SPIs服务的构建Spring Data 模块
- Spring Data LDAP - 提供 Spring LDAP.的基础支持
- Spring Data MongoDB - 为文档数据库 构建以Spring 基础的支持和数据访问组件
- Spring Data REST - 可以把Spring 数据仓库 输出为超媒体的形式的RESTFUL 资源
- Spring Data Redis - 提供简便的方式访问Redis
- Spring Data for Apache Cassandra - Apache Cassandra 的 Spring Data 模块
- Spring Data for Apache Solr - Apache Solr 的 Spring Data 模块
在Spring Data 以前我们要实现在对一个数据库的通常是这样的
我们首先来写一个接口来说明我们要对数据库操作什么,然后使用泛型(T)来传入要保存实体类型,以hibernate为例
public interface CommonDao{
//保存实体
public <T> Serializable save(T entity);
//保存或更新实体
public <T> void saveOrUpdate(T entity);
//获取一个实体对象
public <T> get(Class<T> entityName, Serializable id);
}
但我们还要写一个具体实现类,因为你只是告诉了用户可以干什么,但没有告诉后端该怎进行 增删改查
public CommonDaoImpl implments CommonDao{
//Hibernate Session
@Autowired
@Qualifier("sessionFactory")
private SessionFactory sessionFactory;
public Session getSession() {
// 事务必须是开启的(Required),否则获取不到
return sessionFactory.getCurrentSession();
}
public Serializable save(T entity){
try{
Serializable id = getSession().save(entity);
getSession().flush();
return id
}catch(Exception e){
........
}
}
public <T> saveOrUpdate(T entity){
//保存或更新事务代码
}
public <T> get(T entity,Serializable id){
//获取单个实体代码
}
}
编写一个数据服务接口,便于隐藏具体实现
public interface CommonService{
// 保存实体
public <T> Serializable save(T entity);
// 保存或更新
public <T> void saveOrUpdate(T entity) ;
// 其他数据新增改查方法
}
编写一个公共数据服务实现类
@Service
public class CommonServiceImpl{ //数据访问接口
@Autowired
public CommonDao commonDao; //保存实体实现
public <T> Serializable save(T entity){
//使用数据
commonDao.save(entity);
} //保存或更新
public <T> void saveOrUpdate(T entity){
//保存或更新实体
commonDao.saveOrUpdate(entity);
} //其他服务方法
}
编写一个指定模型接口
public interface UserService extends CommonService
{
//继承父类所有增删改查接口
//新增接口
public User getMyUser(String id);
public List<User> getUserByUsername(String username);
//.....其他用户方法
}
对方法进行@Service //用注释进行组件注入 实现Sprign对接口的管理
public class UserServiceImpl extends CommonServiceImpl implments CommonService{
/**
* 重写父类保存实体方法
**/
public <T> Serializable save(T entity) {
//对User进行前置业务处理
........
this.save(User(entity));//保存user
//返回保存信息
}
/**
* 获取单个User对象
**/
public User getUser(String id){
this.get(User.class,id);
}
/**
*自定义用户搜索
**/
public User getUserByUsername(String username){
//定制实现
//hql 实现
//String hql = "from User u where u.password = ? "
// List<User> users = this.queryByHql(password);
//判断users存不存在
//if(users!=null&&users.size>0)
return users.get(0);
return null;
}
}
这时我们才算实是完成一个完整的数据服务,我们会回顾一下这个编码步骤
1、编写数据访问层通用接口
2、编写数据访问层通用实现
3、编写通用服务接口
4、编写通用服务实现(包括定制查询,定制hql 或者 封装criteria)
5、转化为pojo
以上就是传统j2ee crud的编码过程。
接下来我们要介绍我们今天的主角,Spring-data
看完上面的一堆代码是不是觉得好烦,为什么呢?因为老子又要写接口,又要写实现,写接口告诉客户干什么,然后又写了一个实现告诉java虚拟机要对计算机干什么。这里需要增加了java 的工程性(使用接口把实现和行为本身分开),减轻了使用者的使用成本,也增加了软件的可维护性扩展性。对于庞大而又复杂的系统来说,这是一个稳健的做发。但是这毫无疑问地增加了开发成本。1、接口和实现本身的代码量增加。2、需求和设计不明确,导至接口扩展,其实实现也必须扩展。所谓接口就是 java工程的命门。接口的制定者往往是最有经验的工程师。因为这些东西实在太影响效率了。于是spring-data诞生了。spring-data 的意思是,你只需要在接口里告诉spring你要查询什么,你要一个什么样的查询,它便帮你实现了。你不用自己再去写查询语句。不用再拼接复杂的查询,如果你根据你的姓氏去查询这个人,你只需要写,那一切就像变魔术一样。获取到一个对象列表
interface PersonRepository extends Repository<Person, Long> {
List<Person> findByLastname(String lastname);
}
你不用再去写你dao实现,再见了hql,再见了sql,再见了criteria ,一切来得这么简洁。到此spring data 为我们做了什么?来我们来回顾一下数据库与java之前间交互的发展历程

从图中可以看我们数据库操作要解决的问题的一个大概历程,spring-data实现了重要的一步,把各orm的框架的实现都隐藏掉,把查询规则和查询接口统一起来,就是行为即实现,由接口去定义数据库的查询实现,而你更不需要关注你使用的是哪个orm框架,因为查询模型(使用统一接口)和返回模型都是统一的,而orm,查询封装这些spring-data通通帮你处理了。
以下为spring-data的接口规则
Logical keyword
| Keyword expressions | |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
初探 spring data(一)--- spring data 概述的更多相关文章
- Spring Boot+MySQL+Spring Data JPA一个Web的Demo
2020.06.23 更新 1 概述 一个简单的web项目配合MySQL+Hibernate+Tomcat的简单示例demo,很容易在此基础上扩展成自己的项目. 2 创建工程 笔者IDE为Intell ...
- java(样品集成框架spring、spring mvc、spring data jpa、hibernate)
这是你自己的参考springside集成框架的开源项目.主要的整合spring.spring mvc.spring data jpa.hibernate几个框架,对于这些框架中仍然感觉更舒适sprin ...
- spring boot(五)Spring data jpa介绍
在上篇文章springboot(二):web综合开发中简单介绍了一下spring data jpa的基础性使用,这篇文章将更加全面的介绍spring data jpa 常见用法以及注意事项 使用spr ...
- Spring Boot集成Spring Data Reids和Spring Session实现Session共享
首先,需要先集成Redis的支持,参考:http://www.cnblogs.com/EasonJim/p/7805665.html Spring Boot集成Spring Data Redis+Sp ...
- Spring boot 整合spring Data JPA+Spring Security+Thymeleaf框架(上)
近期上班太忙所以耽搁了给大家分享实战springboot 框架的使用. 以下是spring boot 整合多个框架的使用. 首先是准备工作要做好. 第一 导入框架所需的包,我们用的事maven 进行 ...
- Spring Boot 结合Spring Data结合小项目(增,删,查,模糊查询,分页,排序)
本次做的小项目是类似于,公司发布招聘信息,因此有俩个表,一个公司表,一个招聘信息表,俩个表是一对多的关系 项目整体结构: Spring Boot和Spring Data结合的资源文件 applicat ...
- spring boot系列(五)spring boot 配置spring data jpa (查询方法)
接着上面spring boot系列(四)spring boot 配置spring data jpa 保存修改方法继续做查询的测试: 1 创建UserInfo实体类,代码和https://www.cnb ...
- Spring Boot 整合Spring Data JPA
Spring Boot整合Spring Data JPA 1)加入依赖 <dependency> <groupId>org.springframework.boot</g ...
- Spring Boot中Spring data注解的使用
文章目录 Spring Data Annotations @Transactional @NoRepositoryBean @Param @Id @Transient @CreatedBy, @Las ...
随机推荐
- windows平台python 2.7环境编译安装zbar
最近一个项目需要识别二维码,找来找去找到了zbar和zxing,中间越过无数坑,总算基本上弄明白,分享出来给大家. 一.zbar官方介绍 ZBar 是款桌面电脑用条形码/二维码扫描工具,支持摄像头及图 ...
- 详解equals()方法和hashCode()方法
前言 Java的基类Object提供了一些方法,其中equals()方法用于判断两个对象是否相等,hashCode()方法用于计算对象的哈希码.equals()和hashCode()都不是final方 ...
- 深入理解 JavaScript(一)
编写高质量 JavaScript 代码的基本要点 转载:http://wiki.jikexueyuan.com/project/javascript-depth-understanding/start ...
- python机器学习模块安装
环境:RHEL6.5 离线安装 ############################################################################ 一,本地yum ...
- Angular4 - Can't bind to 'ngModel' since it isn't a known property of 'input'.
用[(ngModel)]="xxx"双向绑定,如:控制台报错:Can't bind to 'ngModel' since it isn't a known property of ...
- Centos 7部署大众点评CAT(一)——单服务器部署
前一篇拙作上传的时间已经过去2个月了,中间并不是闲着...主要是忙着学习各种组件的安装,写了几篇安装心得存在硬盘里. 最近尝试了点评开源的CAT监控平台的安装,并且希望能够引入到工作中.在部署实践的过 ...
- 前端模块化工具--webpack使用感受
话说前头 webpack前段时间有听说一下,现在已经到了3.x的版本,自己没去接触.因为之前使用gulp来作为自己的项目构建工具.现在感觉gulp使用的趋势在减少.现在这段时间去接触了webpack, ...
- thinkphp 5 前台格式化输出日期
thinkphp格式化输出 {$time|strtotime|date="Y年m月d日",###} $time 是日期字符串,一般后台的时间是"Y-m-d h:i:s ...
- GetConsoleScreenBufferInfo 函数--获取控制台屏幕缓冲区信息
GetConsoleScreenBufferInfo函数 来源:https://msdn.microsoft.com/en-us/library/ms683171(v=vs.85).aspx 作用 获 ...
- (转)Spring boot——logback.xml 配置详解(四)<filter>
文章转载自:http://aub.iteye.com/blog/1101260,在此对作者的辛苦表示感谢! 1 filter的使用 <filter>: Logback的过滤器基于三值逻辑( ...