一概念引入
1 持久化:
狭义概念: 数据存储在物理介质不会丢失
广义概念: 对数据的 CRUD 操作都叫做持久化
2 加载: hibernate 里, 数据从数据库中加载到 session
3ORM -- Object Relation Mapping
好处:
解决阻抗不匹配: 对象与关系数据库不匹配
没有侵入性: 在代码中不用去继承或者实现 hibernate 类或实现 hibernate 提供的接口
hibernate: 一个 ORM 的轻量级框架, 解决持久化问题, 是程序员可以从编写复杂的 JDBC 工作中解放, 专注于业务, 提高程序员的开发效率
二第一个 Hibernate 程序
1 资源包介绍
documentation : 相关文档
lib : 相关的 jar 包
project : 相关资源文件模板文件源码等
2 搭建 hibernate 环境
a) 相关 jar 包 (required 下的 jar)
补充一点: hibernate 所处的位置关系:
hibernate.cfg.xml 主要是配置信息
*.hbm.xml 实体与表的映射关系
b) 添加配置文件 (hibernate.cfg.xml)
- <!DOCTYPE hibernate-configuration PUBLIC
- "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
- "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
- <hibernate-configuration>
- <session-factory>
- <!-- 第一部分: 数据连接配置 -->
- <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
- <property name="connection.url">jdbc:mysql://localhost:3306/hibernate_test</property>
- <property name="connection.username">json</property>
- <property name="connection.password">123456</property>
- <!-- 第二部分: 其他相关配置 -->
- <!-- 数据库方言 - 配置 hibernate 方言, 可针对特定的数据库优化 -->
- <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
- <!-- 是否在运行时候 sql 语句输出到控制台, 编码阶段便于测试的 (默认设置为 true)-->
- <property name="show_sql">true</property>
- <!-- 输出在控制台 sql 语句是否进行格式化, 便于阅读 (默认设置为 true) -->
- <property name="format_sql">true</property>
- <!--
- 可帮助由 java 代码生成数据库脚本, 进而生成具体表结构如: create/update/create-drop/validate
- create: 每次都重新建表, 原来的表删除, 同时数据全部清楚重新插入数据 (每次加载 hibernate, 重新创建数据库表结构, 这就是导致数据库表数据丢失的原因)
- create-drop: 每次在创建 sessionFactory 时执行创建表, 当调用 sessionFactory 的 close 方法的时候, 删除表 (在实际项目中不用)
- update: 只是根据映射文件去和数据库中的表对应起来, 如果不一致, 就更新表的结构
- validate: 加载 hibernate 时, 验证创建数据库表结构, 如果是不同的话则不创建表
- PS:
- 1. 请慎重使用 hbm2ddl.auto 此参数, 没必要就不要随便用
- 2. 如果发现数据库表丢失, 请检查 hibernate.hbm2ddl.auto 的配置
- -->
- <property name="hbm2ddl.auto">update</property>
- </session-factory>
- </hibernate-configuration>
c) 创建数据库
- CREATE TABLE `user` (
- `id` bigint(20) NOT NULL AUTO_INCREMENT,
- `name` varchar(255) DEFAULT NULL,
- `pwd` varchar(255) DEFAULT NULL,
- PRIMARY KEY (`id`)
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
d) 创建实体对象
- package com.demo.pojo;
- public class User {
- private Long id;
- private String name;
- private String pwd;
- public Long getId() {
- return id;
- }
- public void setId(Long id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String getPwd() {
- return pwd;
- }
- public void setPwd(String pwd) {
- this.pwd = pwd;
- }
- @Override
- public String toString() {
- return "id=" + id + ", name=" + name + ", pwd=" + pwd;
- }
- }
e) 编辑 *.hbm.xml 文件
文件名一般为实体类 User 对应的名称 User.hbm.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE hibernate-mapping PUBLIC
- "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
- <hibernate-mapping package="org.hibernate.test.cache.infinispan.functional.entities">
- <class name="com.demo.pojo.User" table="user">
- <id name="id" type="java.lang.Long">
- <!-- 主键生成策略 -->
- <generator class="identity"/> <!-- 自增 -->
- </id>
- <!-- 实体类属性 -->
- <property name="name" type="java.lang.String"/>
- <property name="pwd" type="java.lang.String"/>
- </class>
- </hibernate-mapping>
f) 测试
前提: 将 *.hml.xml 文件 加入到 hibernate.cfg.xml 中
- <!DOCTYPE hibernate-configuration PUBLIC
- "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
- "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
- <hibernate-configuration>
- <session-factory>
- <!-- 第一部分: 数据连接配置 -->
- <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
- <property name="connection.url">jdbc:mysql://localhost:3306/hibernate_test</property>
- <property name="connection.username">json</property>
- <property name="connection.password">123456</property>
- <!-- 第二部分: 其他相关配置 -->
- <!-- 数据库方言 - 配置 hibernate 方言, 可针对特定的数据库优化 -->
- <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
- <!-- 是否在运行时候 sql 语句输出到控制台, 编码阶段便于测试的 (默认设置为 true)-->
- <property name="show_sql">true</property>
- <!-- 输出在控制台 sql 语句是否进行格式化, 便于阅读 (默认设置为 true) -->
- <property name="format_sql">true</property>
- <!--
- 可帮助由 java 代码生成数据库脚本, 进而生成具体表结构如: create/update/create-drop/validate
- create: 每次都重新建表, 原来的表删除, 同时数据全部清楚重新插入数据 (每次加载 hibernate, 重新创建数据库表结构, 这就是导致数据库表数据丢失的原因)
- create-drop: 每次在创建 sessionFactory 时执行创建表, 当调用 sessionFactory 的 close 方法的时候, 删除表 (在实际项目中不用)
- update: 只是根据映射文件去和数据库中的表对应起来, 如果不一致, 就更新表的结构
- validate: 加载 hibernate 时, 验证创建数据库表结构, 如果是不同的话则不创建表
- PS:
- 1. 请慎重使用 hbm2ddl.auto 此参数, 没必要就不要随便用
- 2. 如果发现数据库表丢失, 请检查 hibernate.hbm2ddl.auto 的配置
- -->
- <property name="hbm2ddl.auto">update</property>
- <!-- 第三部分: 加载所有的映射 (*.hbm.xml) -->
- <mapping resource="com/demo/pojo/User.hbm.xml"></mapping>
- </session-factory>
- </hibernate-configuration>
测试类:
- package com.demo.test;
- import org.hibernate.Session;
- import org.hibernate.SessionFactory;
- import org.hibernate.Transaction;
- import org.hibernate.boot.MetadataSources;
- import org.hibernate.boot.registry.StandardServiceRegistry;
- import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
- import org.junit.jupiter.api.Test;
- import com.demo.pojo.User;
- public class QueryTest {
- @Test
- public void connectTest() {
- /*//1 新建 Configuration 对象 (Configuration 管理加载配置文件)
- Configuration config = new Configuration().configure();
- //2 通过 configuration 得到 SessionFactory 对象
- //3 通过 SessionFactory 得到 Session 对象
- //hibernate3.x 中的写法
- SessionFactory session = config.buildSessionFactory();
- //hibernate4.3 之前 ~~ 4.0
- ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();
- SessionFactory sessionFactory = config.buildSessionFactory(serviceRegistry);
- Session session = sessionFactory.openSession();
- //hibernate4.3 其中的一种 获取 SessionFactory 的方法
- ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(config.getProperties()).build();
- SessionFactory sessionFactory = config.buildSessionFactory(serviceRegistry);
- Session session = sessionFactory.openSession();
*$/Hibernate5.1 的获取 SessionFactory 的方法
- StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().configure().build();
- SessionFactory sessionFactory = new MetadataSources(serviceRegistry).buildMetadata().buildSessionFactory();
- Session session = sessionFactory.openSession();
- //4 通过 Session 得到 Transaction 对象 (两种写法)
- //Transaction transaction = session.getTransaction();
- //transaction.begin();
- Transaction transaction = session.beginTransaction();
- //5 保存数据
- User user = new User();
- user.setName("张三");
- user.setPwd("123456");
- session.save(user);
- //6 提交事务
- transaction.commit();
- //7 关闭 Session
- session.close();
- }
- @Test
- public void queryTest() {
- //Hibernate5.1 的获取 SessionFactory 的方法
- StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().configure().build();
- SessionFactory sessionFactory = new MetadataSources(serviceRegistry).buildMetadata().buildSessionFactory();
- Session session = sessionFactory.openSession();
- //5 保存数据
- User user = session.get(User.class, 8L);
- System.out.println(user);
- //6 提交事务
- //7 关闭 Session
- session.close();
- }
- @Test
- public void saveTest() {
- //Hibernate5.1 的获取 SessionFactory 的方法
- StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().configure().build();
- SessionFactory sessionFactory = new MetadataSources(serviceRegistry).buildMetadata().buildSessionFactory();
- Session session = sessionFactory.openSession();
- //4 通过 Session 得到 Transaction 对象
- Transaction transaction = session.beginTransaction();
- //5 保存数据
- User user = new User();
- user.setName("张三");
- user.setPwd("123456");
- session.save(user);
- //6 提交事务
- transaction.commit();
- //7 关闭 Session
- session.close();
- }
- }
- PS:
SessionFactroy 对象: 是一个 session 工厂, 是一个重量级的对象, 在一个应用中最好也是单例的, 是一个线程安全的, 属于进程级的对象
Session 对象: 使用 hibernate 进行数据库操作, 主要使用 sessionsession 可以理解为对 connction 对象的一个包装 session 对象中提供了对数据库的 CRUD 操作, Session 是一个线程不安全的对象, 生命周期很短暂, 一般和事务一一对应 Session 又称为 hibernate 的一级缓存 Session 又是 Transaction 对象的工厂
Transaction 对象: 事务管理对象, 通过 Session 获取该对象
Query 对象: 条件查询
PS: 源码地址 https://github.com/JsonShare/hibernate-demo
来源: https://www.cnblogs.com/JsonShare/p/8647269.html