最近工程中用到JPA,头一次接触,踩了不少坑。刚好复习到JDBC,发现JPA用起来真是很简单。就对比一下这两者的区别

总结:JDBC是更接近数据库SQL的抽象,使用时依然使用的是SQL。优点是靠近底层,效率高。缺点:使用起来太繁琐。JPA是基于ORM的一套规范,是更高层次对对象的抽象,使用对象来进行增删改查,这就大大降低了使用的繁琐度。但是JPA的实现依然是依赖于JDBC。

1. JDBC

1.1 示意图

1.2    访问数据库流程

1.3   代码示例

2.JPA

2.1 来源

2.2   示意图

2.3    代码示例

1. JDBC

一组标准API接口,由各个数据库厂商提供实现类,这些实现类就是驱动程序。

1.1 示意图

借用https://www.cnblogs.com/yunche/p/10279324.html的图,JDBC是从各个数据库的SQL中抽象出的一套使用SQL的标准,抽象级别是在SQL层面。

1.2    访问数据库流程

1.3   代码示例

package demo;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement; public class ConnMySql { public static void main(String[] args) throws Exception {
// 1.加载驱动,使用反射
Class.forName("com.mysql.jdbc.Driver");
// 2.使用DriverManager获取数据库连接,
// 其中返回的Connection就代表了java程序和数据库的连接
// 不同数据库的URL写法需要查驱动文档,用户名、密码由DBA分配
Connection conn = DriverManager.getConnection(
"jdbc:mysql://127.0.0.1:3306/select_test",
"root", "0");
// 3.使用Connection来创建一个Statemnet对象
Statement stmt = conn.createStatement();
// 4.执行SQL语句
/*
* Statement有三种执行sql语句的方法:
* 1. execute可执行任何SQL语句。--返回一个boolean值,
* 如果执行后第一个结果是ResultSet,则返回true,否则返回false
* 2. executeQuery 执行Select语句 --返回查询到的结果集
* 3. executeUpdate 用于执行DML语句。 --返回一个整数代表被SQL语句影响的记录条数
*/
ResultSet rs = stmt.executeQuery("select s.* , teacher_name from student_table s,"
+ "teacher_table t where t.teacher_id = s.java_teacher");
// ResultSet有系列的getXxx(列索引 | 列名),用于获取记录指针指向行、特定列的值
// 不断地使用next将记录指针下移一行,如果依然指向有效行,则指针指向行的记录
while(rs.next()){
System.out.println(rs.getInt(1) + "\t"
+ rs.getString(2) + "\t"
+ rs.getString(3) + "\t"
+ rs.getString(4));
}
// 关闭数据库资源
if(rs != null){
rs.close();
}
if(stmt != null){
stmt.close();
}
if(conn != null){
conn.close();
}
} } // end ConnMySql

需要数据库数据:

drop database if exists select_test;

create database select_test;

use select_test;

-- 为了保证从表参照的主表存在,通常应该先建主表

create table teacher_table

(

    -- auto_increment: 实际上代表所有数据库的自动编号策略,通常用作数据表的逻辑主键

          teacher_id int auto_increment,

          teacher_name varchar(255),

          primary key(teacher_id)

);

create table student_table

(

    -- 为本表建立主键约束

          student_id int auto_increment primary key,

          student_name varchar(255),

          -- 指定java_teacher参照到teacher_table的teacher_id

          java_teacher int,

          foreign key(java_teacher) references teacher_table(teacher_id)

);

insert into teacher_table

values

(null, 'Yeeku');

insert into teacher_table

values

(null, 'Sharfly');

insert into teacher_table

values

(null, 'Martine');

insert into student_table

values

(null, '张三', 1);

insert into student_table

values

(null, '张三', 1);

insert into student_table

values

(null, '李四', 1);

insert into student_table

values

(null, '王五', 2);

insert into student_table

values

(null, '_王五', 2);

insert into student_table

values

(null, null, 2);

insert into student_table

values

(null, '赵六', null);

 上面代码需要使用MySQL数据库驱动,该驱动为:JAR:mysql-connector-java-3.1.10-bin.jar

输出:

结果:

1   张三   1   Yeeku

2   张三   1   Yeeku

3   李四   1   Yeeku

4   王五   2   Sharfly

5   _王五  2   Sharfly

6   null   2   Sharfly

2.JPA

2.1 来源

由于JDBC依然需要使用SQL进行增删改查,需要自己做Java对象和数据库表的转换,工作量太大,因此出现很多对象关系映射(ORM)的框架,比如Hibernate。直接通过操作对象来操作数据库,编程的复杂度降低了。

当出现很多的ORM框架时,每个框架下操作数据库的方式、接口存在差异,当项目中框架迁移时就会出现很多问题,所以需要一套规范来同一,即JPA。

2.2   示意图

依然借用https://www.cnblogs.com/yunche/p/10279324.html的图示,JPA的抽象层次较高,是基于ORM的抽象。

2.3    代码示例

只需要定义一个接口,通过函数的方式返回查询的对象,避免了直接使用SQL。

public interface PersonRepository extends JpaRepository<PersonEntity, String>
{ PersonEntity findByFirstName(String firstName); // 直接返回String类型的list是错误的,因为JPA基于对象的抽象,返回的依然是PersonEntity对象
List<String> getFirstNameList();
}

PersonEntity:

**
* 对应person表
*/
@Entity
@Table(name = "person")
public class PersonEntity
{
@Id
private int personId; private String firstName; private String lastName; public PersonEntity(){
super();
} public PersonEntity(String firstName, String lastName)
{
super();
this.firstName = firstName;
this.lastName = lastName;
} public PersonEntity(int personId, String firstName, String lastName) {
this.personId = personId;
this.firstName = firstName;
this.lastName = lastName;
} public int getPersonId() {
return personId;
} public void setPersonId(int personID) {
this.personId = personID;
} public String getFirstName() {
return firstName;
} public void setFirstName(String firstName) {
this.firstName = firstName;
} public String getLastName() {
return lastName;
} public void setLastName(String lastName) {
this.lastName = lastName;
}
}

JDBC与JPA--初学JPA的更多相关文章

  1. springBoot学习(二):初学JPA

    依旧跟着大佬学习JPA,在这里记下过程. JPA主要做的事情是简化数据库操作,至少现在为止,我觉得还是挺方便简单明了的.在原本代码的基础下,更改UserController.User.UserRepo ...

  2. JDBC、ORM、JPA、Spring Data JPA,傻傻分不清楚?一文带你厘清个中曲直,给你个选择SpringDataJPA的理由!

    序言 Spring Data JPA作为Spring Data中对于关系型数据库支持的一种框架技术,属于ORM的一种,通过得当的使用,可以大大简化开发过程中对于数据操作的复杂度. 本文档隶属于< ...

  3. 转:使用 Spring Data JPA 简化 JPA 开发

    从一个简单的 JPA 示例开始 本文主要讲述 Spring Data JPA,但是为了不至于给 JPA 和 Spring 的初学者造成较大的学习曲线,我们首先从 JPA 开始,简单介绍一个 JPA 示 ...

  4. spring data jpa hibernate jpa 三者之间的关系

    JPA规范与ORM框架之间的关系是怎样的呢? JPA规范本质上就是一种ORM规范,注意不是ORM框架——因为JPA并未提供ORM实现,它只是制订了一些规范,提供了一些编程的API接口,但具体实现则由服 ...

  5. 使用 Spring Data JPA 简化 JPA 开发

    从一个简单的 JPA 示例开始 本文主要讲述 Spring Data JPA,但是为了不至于给 JPA 和 Spring 的初学者造成较大的学习曲线,我们首先从 JPA 开始,简单介绍一个 JPA 示 ...

  6. <Spring Data JPA>一 JPA原生

    1.pom依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="htt ...

  7. 【Spring Data 系列学习】了解 Spring Data JPA 、 Jpa 和 Hibernate

    在开始学习 Spring Data JPA 之前,首先讨论下 Spring Data Jpa.JPA 和 Hibernate 之前的关系. JPA JPA 是 Java Persistence API ...

  8. Spring Data JPA 梳理 - JPA与“Spring、Spring Data JPA”的关系

    JPA其实也就是java实体对象和关系型数据库建立起映射关系,通过面向对象编程的思想操作关系型数据库的规范. Spring 框架对 JPA 提供的支持主要体现在如下几个方面: 首先,它使得 JPA 配 ...

  9. Spring Data JPA 梳理 - JPA是什么

    总结: JPA是java的标准,不是Spring的标准 java标准中一般通过Meta-INF文件规范开发层面的事情,JPA也不例外,使用persistence.xml JPA定义了Entity 到 ...

  10. spring boot 中使用 jpa以及jpa介绍

    1.什么是jpa呢?JPA顾名思义就是Java Persistence API的意思,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中.12.jpa具有什么 ...

随机推荐

  1. 【转载】Adobe Acrobat XI Pro闪退原因及解决办法

    https://www.cnblogs.com/zohoo/p/12704689.html https://www.cnblogs.com/zohoo/p/12704689.html

  2. pyg安装

    pyg官网:pytorch_geometric documentation (pytorch-geometric.readthedocs.io) win安装pyg各种报错,原因在于pytorch和py ...

  3. git(后悔药)版本回退

    版本回退 查看提交记录 git log remotes/origin/test --pretty=oneline (建议获取远程日志记录,防止本地没有更新到最新版本) 如果本地是最新版本可以使用:gi ...

  4. UI动画练习 - CABasicAnimation:视图绕X/Y轴旋转(3D效果)

    视图 3D 旋转 1 - 代码示例:以绕 X 轴旋转为例 1 #import "ViewController.h" 2 @interface ViewController () 3 ...

  5. php redis使用 常用方法 | Windows环境下安装Redis | Windows下php安装redis扩展(详解版)

    redis可视化工具:http://www.treesoft.cn/dms.html #php redis使用 常用方法 https://www.cnblogs.com/mg007/p/1043107 ...

  6. OceanBase使用OBLOADER、OBDUMPER进行导入导出

    需求背景 需要定时给OB进行数据备份,并且在需要时可以全量导入,所以只能通过脚本来减少手动操作的繁琐. 脚本示例 导出脚本 #!/bin/bash # 这一步不能省,如果不设置定时运行时可能会有问题 ...

  7. python func_timeout 设置函数超时退出

    使用func_timeout设置函数超时退出,使用func_set_timeout装饰器和func_timeout方法 from func_timeout import func_set_timeou ...

  8. svn 报 is not a working copy 错误

    当时提交代码 svn  报 is not a working copy ,上网查找问题  要我重新拉代码下来 然后放进修改的代码重新提交,我觉得很不合理,我看了下我提交的代码文件有80多个,我在想是否 ...

  9. as8051入门

    汇编例子 MAIN: MOV R0, #16 MOV R1, #16 LOOP: MOV A, R1 MOV @R0,A MOV A,0x0 MOV A, @R0 MOV SBUF, A INC R0 ...

  10. 38.Ribbon

    Ribbon默认是懒加载,所以初次请求时间最长,后续请求会变快,可以通过修改为饥饿加载 ribbon.eager-load.enabled=true ribbon.eager-load.clients ...