Springdata 系列之spring data jpa

背景:随着互联网技术的发展,现在的企业开发中用到的用于数据存储的产品,不再仅仅是关系型数据库,而是要根据场景需要选择不同的存储技术,比如用于缓存热点数据的redis,用于存储文档数据的mongodb,用于支持强大搜索功能的elasticsearch等等。

在Java中,对于上面所说的产品都提供了优秀的访问技术。比如针对关系型数据库的mybatis、jpa等技术,针对于redis的jedis技术等等..... 这些技术虽然可以很好的针对各个存储产品进行访问操作,但同时也带来了新的问题,那就是不同的持久层技术的API是不一样的。这样一来,开发人员就必须同时掌握多种数据访问技术,这无疑增加了开发成本。有没有这样一种技术,它可以使用一套API支持各个不同的存储的访问呢?就在这样的需求下,SpringData产生了。

在互联网企业中,早期因为要抢占市场等因素,因而需要先推出产品,导致前期业务不确定性很高,因此操作数据库层的框架就需要灵活,绝大部分项目采用的框架就是mybatis,也一直延续至今。而在传统软件企业中,业务的变化没有那么大,比如人力资源管理系统,ERP系统,又或者金融业的大部分系统,更适合领域设计模式,也有必要考虑更适合操作数据库的框架。

本节主要讲述数据库层。现在企业中对数据库操作使用的框架主流的有MyBatis,hibernate,springdata jpa。这三个框架因为设计的时候出发点不同,因此我们有必要了解哪些业务场景使用哪种框架更合适。

  1. mybatis,hibernate,spring data jpa三种区别

Hibernate:Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装。属于全自动的ORM框架,着力点在于POJO和数据库表之间的映射,完成映射即可自动生成和执行sql。

Mybatis:MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation迁移到了google code,并且改名为MyBatis 。属于半自动的ORM框架,着力点在于POJO和SQL之间的映射,自己编写sql语句,然后通过配置文件将所需的参数和返回的字段映射到POJO。

SpringData JPA:Spring Data是一个通过命名规范简化数据库访问,并支持云服务的开源框架。其主要目标是使得对数据的访问变得方便快捷,并支持map-reduce框架和云计算数据服务。Spring data jpa使用jpa规范,支持这套规范的框架是hibernate,因此底层框架还是hibernate。

实现上:mybatis只有一个核心jar包,另外和spring整合需要mybatis-spring的jar包,使用缓存需要mybatis-ehcache的jar包,而hibernate需要一系列的jar包,这也侧面反映了mybatis相对小巧,简单,而hibernate相对来说比较强大,复杂;mybatis的配置主要包括一个用于映射各种类的xml文件以及和实体类一一对应的映射文件,hibernate包括hibernate.cfg.xml和实体类的配置文件hibernate.hbm.xml。

2.开发的难度

Hibernate的开发难度要大于Mybatis、Spring Data。主要是由于Hibernate封装了完整的对象关系映射机制,以至于内部的实现比较复杂、庞大,学习周期较长。

Mybatis 主要依赖于SQL的编写与ResultMap的映射。

SpringData易上手,通过命名规范、注解查询简化查询操作。

3.查询区别

简单查询:

Hibernate提供了基础的查询方法,也可以根据具体的业务编写相应的SQL;

Mybatis需要手动编写SQL语句;

SpringData 继承基础接口,可使用内置的增删改查方法。

从上述几点差别不难得出,针对sql底子不够,而单表操作占据主导的项目建设时,优先考虑spring data jpa。

Spring Data 简介

1.什么是Spring Data

SpringData是一个用来简化dao层开发的框架。它在保证了各个底层存储特性的同时,提供了一套统一的数据访问API。它可以很好的支持常用的关系型数据库和非关系型数据库。使用Spring Data作为dao层开发技术,将大大简化代码量,而且其API比各个技术的原生API更加简单易用。

2.SpringData的主要模块

SpringData支持的持久层技术非常多,只介绍几个常见的:

SpringData common Spring Data 的核心模块,定义了Spring Data的核心功能

SpringData JDBC 对JDBC的Spring Data存储库支持

SpringData JPA 对JPA的Spring Data存储库支持

SpringData MongoDB 对MongoDB的基于Spring对象文档的存储库支持

SpringData Redis 封装Jedis技术,对redis实现访问操作

SpringData Elasticsearch 对Elasticsearch实现访问操作

JPA回顾

JPA全称是Java Persistence API,即java持久化api,是一套ORM规范,不是ORM框架,JPA并没有提供ORM实现,只是提供了一些编程的接口。如下图所示:

JPA实战

搭建JPA环境,并实现一条数据的增删查改。

准备数据库

CREATETABLE `student` (

`SId` varchar(10) COLLATE utf8_bin DEFAULT NULL,

`Sname` varchar(10) COLLATE utf8_bin DEFAULT NULL,

`Sage` datetime DEFAULT NULL,

`Ssex` varchar(10) COLLATE utf8_bin DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8COLLATE=utf8_bin;

创建java工程,导入坐标

<dependencies><dependency><groupId>mysqlgroupId><artifactId>mysql-connector-javaartifactId><version>5.1.49version>dependency><dependency><groupId>org.hibernategroupId><artifactId>hibernate-entitymanagerartifactId><version>5.0.7.Finalversion>dependency><dependency><groupId>junitgroupId><artifactId>junitartifactId><version>4.12version>dependency><dependency><groupId>log4jgroupId><artifactId>log4jartifactId><version>1.2.12version>dependency>dependencies>

创建实体类

public class Student implements Serializable {private String Sid;private String Sname;private String Ssex;private Date Sage;
//省略get和set以及toString方法

}

在实体类中配置映射关系

@Entity
@Table(name = "student")public class Student implements Serializable{@Id
    @Column(name = "SId")private String Sid;@Column(name = "Sname")private String Sname;@Column(name = "Ssex")private String Ssex;@Column(name = "Sage")private Date Sage;

}

加入jpa配置文件

xml version="1.0"encoding="UTF-8"?><persistencexmlns="http://java.sun.com/xml/ns/persistence"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/persistence             http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"version="2.0"><persistence-unitname="jpa01"transaction-type="RESOURCE_LOCAL"><provider>org.hibernate.jpa.HibernatePersistenceProviderprovider><class>com.test.Studentclass><properties><propertyname="javax.persistence.jdbc.driver"value="com.mysql.jdbc.Driver"/><propertyname="javax.persistence.jdbc.url"value="jdbc:mysql:///practice"/><propertyname="javax.persistence.jdbc.user"value="root"/><propertyname="javax.persistence.jdbc.password"value="root"/><propertyname="hibernate.show_sql"value="true"/><propertyname="hibernate.format_sql" value="true"/>

jpa 原生sql 查询返回一个实体_spring data系列之jpa相关推荐

  1. jpa 原生sql 查询返回一个实体_JPA查询--使用原生sql 并且把查询结果转为实体对象...

    这篇文章主要记录 使用原生sql查询 并且把查询结果转为实体对象, 注意:这儿使用的数据库 是oracle数据库 这儿记录了三种查询:精确查询,模糊查询,分页查询. 1.把原生sql查询的结果转为实体 ...

  2. 原生sql 查询返回一个实体_python连接SQLServer执行给定的查询SQL语句,并返回结果数据...

    今天写这篇文章的初衷就是在我昨天发表的文章<Python连接SQLServer数据库执行增删改查操作>后,一些读者反馈说跟Python完全没有关系,这里我想说的是:内容的确是与Python ...

  3. jpa原生query_Spring Data JPA原生SQL查询

    package com.test.cms.dao.repository; import org.springframework.stereotype.Repository; import javax. ...

  4. 使用 JPQL 和原生 SQL 查询 JPA 实体(转)

    使用 JPQL 和原生 SQL 查询 JPA 实体(转) 博客分类: EJB3.JPA及其相关 SQL JPA 企业应用 数据结构 C#  作者:Yuli Vasiliev 了解如何利用 Java 持 ...

  5. 【Flask项目】sqlalchemy原生sql查询,返回字典形式数据

    在原生sql查询的时候,返回一个list,内部是tuple,他们看似是tuple,实则并不是 而是一个特殊的类型"<class 'sqlalchemy.util._collection ...

  6. python graphql query返回一组字典数据_Python的sqlalchemy使用原生sql查询如何返回字典形式的数组?...

    首先使用一个变量接收你以上的查询结果.这个查询结果是一个list,在这个list中包含着一个或多个tuple,其实这并不是标准的Python tuple,而是一个特殊的类型"",这 ...

  7. Hibernate原生SQL查询

    最近在做一个较为复杂的查询,hibernate基本的查询不能满足,只好使用其提供的原生sql查询.参考网上的一些资料,做一些总结. 对原生SQL查询执行的控制是通过SQLQuery接口进行的,通过执行 ...

  8. Hibernate使用原生SQL查询

    Hibernate使用原生SQL查询   Hibernate提供了原生的SQL语句的查询,通过createSQLQuery(String)和createNativeQuery(String),crea ...

  9. Hibernate5.2之原生SQL查询

    原文:http://www.cnblogs.com/miller-zou/p/5720048.html 一. 介绍  在上一篇博客中笔者通过代码的形式给各位读者介绍了Hibernate中最重要的检索方 ...

最新文章

  1. Solr初始化源码分析-Solr初始化与启动
  2. html外链式css运行不出来div,html+css外链式
  3. centos7安装配置ELK(Elasticsearch+Logstash+Kibana)
  4. java适配器模式 场景_Java设计模式之《适配器模式》及应用场景
  5. H - Maximal submatrix HDU - 6957
  6. python字符串内建函数_Python的字符串内建函数(字符串处理)
  7. RS-485通讯协议
  8. 如何配置android的adb环境变量,windows系统下配置adb环境变量的方法步骤
  9. Latex输出大小写罗马数字
  10. 网站虚拟主机是什么?(什么是虚拟主机空间)
  11. 解决Anaconda无法添加环境变量问题,适用于Linux的大多数发行版本。
  12. 低代码”革了谁的命?
  13. java_重写hashCode
  14. Elasticsearch 如何实现时间差查询?
  15. HDMI协议介绍(一)--Overview
  16. 阿里-蚂蚁金服社招面经
  17. 清道夫(scavenger)流量
  18. java license 验证方案,使用License3j实现简单的License验证
  19. Oracle数据库增加表空间
  20. 2020计算机保研之路:211上岸上海985

热门文章

  1. 读取HTTP请求消息头字段案例代码
  2. 无比乐java游戏_传智播客Java JavaEE+物联网云计算 就业班
  3. php 字符串中文截取,PHP 截取中文字符串(支持多种编码)
  4. 写python代码的心得体会_写python代码的一点感想
  5. 用html5做一个介绍自己家乡的页面_厚溥资讯 | HTML5的小知识点小集合(上)
  6. matlab的7.3版本是什么_MX Linux 19.3 发布,Debian和antiX Linux的混合版本
  7. 数独解题程序的python实现_python实现自动解数独小程序
  8. python aiompq集群_国内首款基于AIO(异步IO)支持集群的高性能开源WebSocket服务器 宝贝鱼 CshBBrain V4.0 发布...
  9. python3.7.4怎么运行_记一次win7在python3.7.4环境启动ride报错解决
  10. linux shell 无法ssh,linux – BASH和/或.BASHRC在SU或SSH登录后无法正常工作,除非运行“bash”命令...