初探 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{//数据访问接口 @Autowiredpublic 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 | |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
转载于:https://www.cnblogs.com/goldfish-coder/p/6380423.html
初探 spring data(一)--- spring data 概述相关推荐
- Spring系列学习之Spring Data Envers数据访问
英文原文:https://spring.io/projects/spring-data-envers 目录 概述 快速开始 学习 文档 概述 该项目是Spring Data JPA项目的扩展,允许访问 ...
- Spring系列学习之Spring Data Elasticsearch数据访问
英文原文:https://spring.io/projects/spring-data-elasticsearch 目录 概述 特性 快速开始 学习 文档 概述 Elasticsearch的Sprin ...
- Spring系列学习之Spring Data R2DBC数据访问
英文原文:https://spring.io/projects/spring-data-r2dbc 目录 概述 快速开始 学习 文档 示例 概述 Spring Data R2DBC是更大的Spring ...
- Spring系列学习之Spring Data Pivotal GemFire数据访问
英文原文:https://spring.io/projects/spring-data-gemfire 目录 概述 特性 快速开始 学习 文档 概述 Pivotal GemFire项目的Spring ...
- Spring系列学习之Spring Data Apache Geode数据访问
英文原文:https://spring.io/projects/spring-data-geode 目录 概述 特性 快速开始 学习 文档 概述 Spring Geode项目Spring Data的主 ...
- springboot整合hibernate_峰哥说技术系列-17 .Spring Boot 整合 Spring Data JPA
今日份主题 Spring Boot 整合 Spring Data JPA JPA(Java Persistence API)是用于对象持久化的 API,是Java EE 5.0 平台标准的 ORM 规 ...
- Spring Boot中Spring data注解的使用
文章目录 Spring Data Annotations @Transactional @NoRepositoryBean @Param @Id @Transient @CreatedBy, @Las ...
- Spring Boot 之Spring data JPA简介
文章目录 添加依赖 添加entity bean 创建 Dao Spring Data Configuration 测试 Spring Boot 之Spring data JPA简介 JPA的全称是Ja ...
- datav本地部署 java,Spring Boot对Spring Data JPA的自动配置
一 点睛 Spring Boot对Spring Data JPA的自动配置放置在如下路径: 二 源码分析 1 JpaRepositoriesAutoConfiguration类分析 @Configur ...
- 使用Spring Rest和Spring Data JPA和H2以及Spring Boot示例的Restful API
你好朋友, 在本教程中,您将学习以下内容: 1.在Spring Boot中配置Spring Rest,Spring Data JPA和H2 2.使用Spring Boot创建Springful服务端点 ...
最新文章
- xp大容量u盘补丁_Win XP系统下载与安装(U盘)
- lightoj 1224
- Okay 第一篇文章从java字符串开始
- vue rule鼠标移走校验_Vue-cli+Element-ui实现后台管理系统(二)实现后台登录功能...
- Linux signal 编程(转载)
- linux把集群中所有机器关闭,Hadoop集群(第5期)_Hadoop安装配置
- eclipse中help下默认没有Software Updates选项解决办法
- MyBatis-Spring-Boot 使用总结
- perl表达 匿名数组和匿名哈希
- 【车间调度】基于matlab粒子群算法求解6X6车间调度问题【含Matlab源码 411期】
- CF1041A Heist
- 解决is exceeding the 65535 bytes limit问题
- 腾讯bugly热更新接入
- Postfix部署【2】传输代理
- 抖音推荐算法原理全文详解
- 女人眼中最美的七种男人……
- 片段中onCreate(),onCreateView()和onActivityCreated()的区别和用法
- python元组赋值_【Python】元组的基本使用
- 刷问卷星调查问卷_如何通过回答快速调查问卷从Google获得免费资金
- 它又来了!FastJson又被发现漏洞,autotype的安全控制开关限制可以被绕过...你方了没?...
热门文章
- Lab、RGB、CMY、HSV、HSL
- Could not fetch URL https://pypi.org/simple/selenium/: There was a problem confirming the ssl cer...
- java 滑杆和进度条_进度条 和 滑条
- 珠峰高 8848 米,一张纸 0.01 米,这张纸对折多少次后高度超过珠峰
- string类的深拷贝和浅拷贝
- 预编译头.pch文件详解
- ARPG角色扮演页游《明朝江湖》全套代码
- squid高性能代理缓存服务器
- nova云主机evacuate简单分析
- 隐私空间伪装计算机,隐私空间app(文件夹隐藏) 6.1.9 免root