Spring Data JPA与JDBC的区别和基本用法

2023-11-20

JPA 与 JDBC 的区别和基本用法

原文地址

JPA 概念

JPA(Java Persistence API)用于对象持久化的 API,是 Java EE 5.0 平台标准的 ORM 规范,使得应用程序以统一的方式访问持久层。

与 JDBC 的对比

JDBC 也是一种规范和接口,不过 JDBC 是面向 SQL 的,使用起来比较繁琐。所以就有了 ORM 框架,建立了 Java 对象与数据库表之间的映射关系,可以通过直接操作对象来实现持久化,简化了操作的繁杂度。而 JPA 就是 ORM 框架的规范,值得一提的是 Hibernate 是符合 JPA 规范的,而 MyBatis 却不符合,因为 MyBatis 还是需要写 SQL 的。

JDBC 示意图:

img

JPA 示意图:

img

例子

在 IDEA 下创建一个 JPA 项目,并实现基本的 CRUD。

1、创建一个 JavaEE Persistence 项目,具体如下所示

img

采用 Hibernate 实现 JPA。

2、导入相应的 Maven 依赖

img

添加 Maven 支持。

pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>groupId</groupId>
    <artifactId>jpa-helloworld</artifactId>
    <version>1.0-SNAPSHOT</version>

   <dependencies>
       <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-entitymanager -->
       <dependency>
           <groupId>org.hibernate</groupId>
           <artifactId>hibernate-entitymanager</artifactId>
           <version>5.4.0.Final</version>
       </dependency>

       <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
       <dependency>
           <groupId>mysql</groupId>
           <artifactId>mysql-connector-java</artifactId>
           <version>8.0.11</version>
       </dependency>

   </dependencies>
</project>

3、配置数据库(MySQL 8)相关内容 persistence.xml

注意此文件要位于类路径下,这里放在 resources/META-INF 下。

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">

    <persistence-unit name="jpa-1">
        <!--是 PersistenceProvider 接口的实现类-->
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>

        <!--添加持久化类-->
        <class>com.yunche.helloworld.Customer</class>
        <properties>
            <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/jpa?useSSL=false&amp;serverTimezone=Asia/Shanghai"/>
            <property name="hibernate.connection.driver_class" value="com.mysql.cj.jdbc.Driver"/>
            <property name="hibernate.connection.username" value="root"/>
            <property name="hibernate.connection.password" value="123456"/>
            <property name="hibernate.archive.autodetection" value="class"/>
            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.format_sql" value="true"/>
            <!--注意这个属性,自动生成的文件前面没有 hibernate,要加上 hibernate -->
            <property name="hibernate.hbm2ddl.auto" value="update"/>
            <!-- 使用 MySQL8Dialect -->
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL8Dialect"/>

        </properties>
    </persistence-unit>
</persistence>

4、新建一个持久化对象类

package com.yunche.helloworld;

import javax.persistence.*;

/**
 * @ClassName: Customer
 * @Description:
 * @author: yunche
 * @date: 2019/01/16
 */
@Entity(name = "customers")
public class Customer {

    private Integer age;
    private String lastName;
    private Integer id;
    private String email;

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Column(name = "last_name")
    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

并在 persistence.xml 中的 persistence-unit 节点下加入:

<!--添加持久化类-->
<!--后来发现:似乎可以不加-->
<class>com.yunche.helloworld.Customer</class>

5、Main 类

package com.yunche.helloworld;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;

/**
 * @ClassName: Main
 * @Description:
 * @author: yunche
 * @date: 2019/01/16
 */
public class Main {
    public static void main(String[] args) {

        //persistence.xml 中的 persistence-unit
        String persistenceUnitName = "jpa-1";
        //1、创建 EntityManagerFactory
        EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory(persistenceUnitName);
        //2、创建 EntityManager
        EntityManager entityManager = entityManagerFactory.createEntityManager();
        //3、开启事务
        EntityTransaction transaction = entityManager.getTransaction();
        transaction.begin();
        //4、进行持久化操作
        Customer customer = new Customer();
        customer.setAge(13);
        customer.setLastName("li");
        customer.setEmail("123@qq.com");

        entityManager.persist(customer);
        //5、提交事务
        transaction.commit();
        //6、关闭 EntityManager
        entityManager.close();
        //7、关闭 EntityManagerFactory
        entityManagerFactory.close();
    }
}

6、结果

img

img

7、注意事项
我后来发现了一点问题,关于包 javax.persistence-api 的,我创建项目的时候选中了 persistence 2.0 , IDEA 自动导入了 javax.persistence-api-2.0.jar,而 maven 下的 hibernate-entitymanager 依赖含有 javax.persistence-api-2.2.jar ,所以 jar 包重复了,并且我发现2.0版本的有些方法没有,所以还是将2.0版本的jar包删除,用 2.2 版本的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Data JPA与JDBC的区别和基本用法 的相关文章

随机推荐

  • 惊艳了!升级版的 APDrawing,秒让人脸照变线条肖像画

    作者 高卫华 出品 AI科技大本营 随着深度学习的发展 GAN模型在图像风格转换的应用越来越多 其中不少都实现了很好的效果 此前 reddit上的一个技术博主AtreveteTeTe基于GAN模型混合将普通的人像照片卡通化 并通过First
  • AJAX——AJAX的异步与同步、AJAX代码封装

    个人主页 胖虎不秃头 个人简介 Java领域新星创作者 随时准备跑路的大二学生 精品专栏 有这一个就够了 个人名言 知道的越多 不知道的越多 刷题神器 推荐一款算法刷题网站Nowcoder 点击跳转刷题网站进行注册学习 文章目录 AJAX的
  • 可以通过2种方法遍历HashMap

    可以通过2种方法遍历HashMap Map map new HashMap for Iterator iter map entrySet iterator iter hasNext Map Entry entry Map Entry ite
  • 裁剪任意直线段 liang-barshky算法 c

    一 实验目的 使用liang barshky算法实现裁剪任意直线段实验工具 二 实验工具 VC6 0 三 实验步骤 思想 以直线的参数方程为基础 X x1 u x2 x1 Y y1 u y2 y1 裁剪区域是不等式 wxl lt X x1
  • 100天精通Python(可视化篇)——第99天:Pyecharts绘制多种炫酷K线图参数说明+代码实战

    文章目录 专栏导读 一 K线图介绍 1 说明 2 应用场景 二 配置说明 三 K线图实战 1 普通k线图 2 添加辅助线 3 k线图鼠标缩放 4 添加数据缩放滑块 5 K线周期图表 书籍推荐 专栏导读 本文已收录于 100天精通Python
  • linux 积累

    linux文件夹打包命令 tar 解包 tar xvf FileName tar 打包 tar cvf FileName tar DirName 注 tar是打包 不是压缩 gz 解压1 gunzip FileName gz 解压2 gzi
  • 重用的undo日志 (3)—mysql进阶(六十六)

    前面说了undo日志的文件格式 第一页和后面的页是不同的 填入undo日志之前 会先把undo page header属性填满 还有undo segment header undo log header List base node存在un
  • Open Camera异常分析(一)

    负责的项目中遇到一些三方和其他的场景使用camera导致问题 并且没有及时释放camera device致使手机camera应用一直无法使用的严重问题 针对这类问题进行了一系列的分析与追踪 最后算是定位到了问题且提供了一些解决方案 但整个追
  • 编程题——连续最大和

    编程题 连续最大和 题目描述 一个数组有 N 个元素 求连续子数组的最大和 例如 1 2 1 和最大的连续子数组为 2 1 其和为 3 输入描述 输入为两行 第一行一个整数n 1 lt n lt 100000 表示一共有n个元素 第二行为n
  • 拼多多anti-token 字段加解密学习分析

    注 本篇文章仅学习交流该APP的加密方法 提示我们的安全技术 不可以对该app和公司造成违法行为 否则后果自负 如有侵权行为 烦请贵司与我第一时间联系 下架文章 感谢 app 版本 6 26 我们抓包得到这里有个关键字段 anti toke
  • 一维卷积神经网络直接读取mat文件并进行数据增强和归一化

    众多师弟师妹在使用一维卷积神经网络对凯斯西储 哥伦比亚等大学开源的轴承故障数据集进行故障诊断时 不知道该怎么把Matlab文件中的数据直接导进伸进网络进行训练 我之前也不会 我一直用matlab打开数据然后黏贴到EXCEL再进行数据增强和归
  • 大华摄像头:视频抓图接口

    大华摄像头 视频抓图接口 CLIENT CapturePictureEx 保存图片 对显示图像进行瞬间抓图 CLIENT SetSnapRevCallBack 设置抓图回调函数 CLIENT SnapPictureEx 抓图请求扩展接口
  • 古典密码汇总。

    一 密码类型汇总 23 维吉尼亚密码 Vigen re Cipher Vigen re Cipher 由于频率分析法可以有效的破解单表替换密码 法国密码学家维吉尼亚于1586年提出一种多表替换密码 即维吉尼亚密码 也称维热纳尔密码 维吉尼亚
  • AQS底层原理

    1 AQS能干嘛 是什么 能干嘛 加锁就会有阻塞 有阻塞就需要排队 实现排队必然需要有某种形式的队列来进行管理 是什么 废话 抽象的队列同步器 翻译一下 AQS是用来构建锁或者其它同步器组件的重量级基础框架及整个JUC体系的基石 通过内置的
  • 一文打通Sleuth+Zipkin 服务链路追踪

    1 为什么用 微服务架构是一个分布式架构 它按业务划分服务单元 一个分布式系统往往有很多个服务单元 由于服务单元数量众多 业务的复杂性 如果出现了错误和异常 很难去定位 主要体现在 一个请求可能需要调用很多个服务 而内部服务的调用复杂性 决
  • 使用brew services管理服务

    原文 https www jianshu com p 6c3b26490861 简介 官网 https github com Homebrew homebrew services macOS使用launchctl命令加载开机自动运行的服务
  • 基于 LoadRunner 实现企业级服务器端性能测试的实践

    后端性能测试工具首先通过虚拟用户脚本生成器生成基于协议的虚拟用户脚本 然后根据性能测试场景设计的要求 通过压力控制器控制协调各个压力产生器以并发的方式执行虚拟用户脚本 并且在测试执行过程中 通过系统监控器收集各种性能指标以及系统资源占用率
  • Linux部署jar包,隐藏命令行参数

    Linux部署jar包 隐藏命令行参数 一 背景需求 二 查阅资料 三 实现隐藏库 3 1 测试test c 3 2 设置隐藏库 3 3 验证 四 应用jar启动命令 五 直接应用结果 最新项目安全检测 发现配置文件中数据库密码 redis
  • Linux提权—脏牛漏洞(CVE-2016-5195)复现

    脏牛漏洞 脏牛漏洞 又叫Dirty COW 存在Linux内核中已经有长达9年的时间 在2007年发布的Linux内核版本中就已经存在此漏洞 Linux kernel团队在2016年10月18日已经对此进行了修复 漏洞范围 影响版本 该漏洞
  • Spring Data JPA与JDBC的区别和基本用法

    JPA 与 JDBC 的区别和基本用法 原文地址 JPA 概念 JPA Java Persistence API 用于对象持久化的 API 是 Java EE 5 0 平台标准的 ORM 规范 使得应用程序以统一的方式访问持久层 与 JDB