前言
上篇分析了CRUD过程,借助JDBC直接操作SQL语句。虽然能达到效果,但总感觉写起来有点繁琐,既然是在Java的世界,那CRUD能否面向对象编程呢?
当然可以,轮到ORM出场了。
通过本篇文章,你将了解到:
- ORM 是什么?
- Hibernate 操作数据库
- Hibernate 与JDBC 关系
- 小结
1. ORM 是什么?
ORM是Object-Relational Mapping(对象关系映射)的缩写,是一种编程技术,用于在面向对象语言(如 Java)和关系型数据库(如 MySQL、PostgreSQL)之间自动转换数据。
一言概之:
将数据库表映射为类,将数据库行映射为对象,将字段映射为属性。
如此一来,我们只需要操作对象无需操作具体的SQL语句。
假设我们有一个数据库表名为:hi_user
映射为Java 类:HiUser
它字段如下:
那么id/password/phone/username 就可以作为HiUser的属性:
public class HiUser {
private Long id;
private String username;
private String password;
private String phone;
}
当需要往hi_user表里插入一条数据时可作如下操作:
- 创建HiUser对象,将对象里的各个属性赋值
- 保存对象到数据库
此时表里有三条数据,对应的是三个HiUser对象。
我们没有写任何SQL语句,也仅需两步操作即可完成往数据库添加数据的功能,实际上背后的工作都是由ORM框架完成。
Java常见的ORM框架:
本次,我们主要分析Hibernate。
2. Hibernate 操作数据库
接下来分析在IDEA里如何添加和使用Hibernate。
首先,在pom.xml里添加依赖。
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.4.32.Final</version>
</dependency>
其次,编辑Hibernate配置文件。
该文件里主要是设置:数据库地址、驱动、数据库账号、密码、表映射的实体类等。
注意此处的文件位置和文件名是固定的,无需更改。
再然后,初始化Hibernate Session工厂,后续的session都是通过工厂构造。
sessionFactory = new Configuration().configure().buildSessionFactory();
最后,就到了CRUD阶段了。
以HiUser为例,定义类结构:
@Entity
@Table(name = "hi_user")
public class HiUser {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "username")
private String username;
@Column(name = "password")
private String password;
@Column(name = "phone")
private String phone;
}
@Entity 表示该类为数据库表映射
@Table 表示该类映射的数据库表名
@Column 表示类属性映射的数据表字段名
有了类和对象,就可以进行CRUD了。
- 插入数据:
public void saveUser(HiUser user) {
Transaction transaction = null;
try (Session session = sessionFactory.openSession()) {
transaction = session.beginTransaction();
session.save(user);
transaction.commit();
} catch (Exception e) {
if (transaction != null) {
transaction.rollback();
}
e.printStackTrace();
}
}
构造好HiUser实体,调用session.save方法即可。
- 查询数据:
public List<HiUser> getUsers() {
long startTime = System.currentTimeMillis();
try (Session session = sessionFactory.openSession()) {
List<HiUser> list = session.createQuery("from HiUser", HiUser.class).list();
System.out.println("getUsers time: " + (System.currentTimeMillis() - startTime));
return list;
}
}
此处createQuery 执行的是HQL(Hibernate Query Language)语句。
"from HiUser"里的HiUser对应的是要查询的表对应的类。
HQL使用类名和属性名查找数据。
SQL使用表名和字段名查找数据。
- 编辑数据
public void updateUser(HiUser user) {
Transaction transaction = null;
try (Session session = sessionFactory.openSession()) {
transaction = session.beginTransaction();
session.update(user);
transaction.commit();
} catch (Exception e) {
if (transaction != null) {
transaction.rollback();
}
e.printStackTrace();
}
}
- 删除数据
public void deleteUser(HiUser user) {
Transaction transaction = null;
try (Session session = sessionFactory.openSession()) {
transaction = session.beginTransaction();
session.delete(user);
transaction.commit();
} catch (Exception e) {
if (transaction != null) {
transaction.rollback();
}
e.printStackTrace();
}
}
可以看出,以上的CRUD我们都是在操作对象,并且使用的方法名也直观地表示出要做的动作。这就是ORM框架的核心,将对象和数据库映射起来。
同时我们也注意到,上述操作涉及到了事务。
事务(Transaction) 是用于控制数据库操作的一组逻辑单元,确保数据在执行增删改等操作时满足 ACID 特性(原子性、一致性、隔离性、持久性)。
以deleteUser为例:
先开启事务,再执行delete操作,最后提交事务,如果删除失败,那么就回滚事务,当做什么都没发生。
其它的操作流程类似。
3. Hibernate 与JDBC 关系
JDBC:
JDBC(Java Database Connectivity) 是 Java 提供的一组接口和类,用于连接和操作数据库。
它是最基础的数据库访问方式,直接使用 SQL 语句进行操作
Hibernate:
Hibernate 是一个 ORM(对象关系映射)框架,它在 JDBC 上层封装,将 Java 对象与数据库表自动映射。
开发者无需编写 SQL,而是通过操作 Java 对象来间接操作数据库。
两者关系如下图:
4. 小结
最后展示一个Hibernate CRUD 实战的例子:
完整工程请点击:点我跳转
下篇我们将通过servlet+hibernate+jsp 来阐述最原始的MVC理念,敬请期待。