版权声明:转载请联系作者本人!!! https://blog.csdn.net/weixin_42061805/article/details/83033044
什么是Hibernate?
- 应用在JavaWeb三层结构中的DAO层
- 主要实现的是对数据库的增删改查,避免了写重复且复杂的JDBC代码
- 它是一个开源并且轻量级的框架
什么是orm思想
- orm即Object Relational Mapping(对象关系映射),简单来说就是让实体类与数据库中的表和实体类中属性与数据库中表的字段进行一一映射
- 不用直接操作数据库,操作表对应的实体类即可
搭建hibernate环境
- 所需jar包
- 配置映射文件和核心文件
1)映射文件和核心文件的配置(前提已经建立好相应的实体类,即JavaBean和数据库中已经建立相应的库)
package tqb.entity;
/**
* 实体类
*/
public class User {
private int uid;
private String username;
private String pwd;
public int getUid() {
return uid;
}
public void setUid(int uid) {
this.uid = uid;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
@Override
public String toString() {
return "User [uid=" + uid + ", username=" + username + ", pwd=" + pwd + "]";
}
}
<?xml version="1.0" encoding="UTF-8"?>
<!-- 对hibernate配置文件的dtd约束 -->
<!-- hibernate-mapping为父标签 -->
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!--
hibernate的映射配置文件
位置与名称没有强制要求,建议名称为 实体类名.hbm.xml,位置和实体类相同即可
-->
<hibernate-mapping>
<!--
name:实体类的全路径
table:数据库对应的表名
-->
<class name="tqb.entity.User" table="t_user">
<!--
hibernate中必须有一个具有唯一值的属性
name:实体中id的属性名
column:就是表中的字段
-->
<id name="uid" column="uid">
<!--
设置字段属性
class:native 就是设置该字段为主键并且自增长
-->
<generator class="native"></generator>
</id>
<!--
配置其他属性和表字段对应
-->
<property name="username" column="username"></property>
<property name="pwd" column="pwd"></property>
</class>
</hibernate-mapping>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<!--
核心配置文件
必须放在src目录下
配置文件名称必须为hibernate.cfg.xml
-->
<session-factory>
<!-- 配置数据库信息 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql:///hibernate_day01</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">123321tqb</property>
<!-- 可选配置 -->
<!-- 输出底层sql语句 -->
<property name="hibernate.show_sql">true</property>
<!-- 输出底层格式化sql语句 -->
<property name="hibernate.format_sql">true</property>
<!-- 若不存在该表,则创建,若存在,则更新 -->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 允许使用方言 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 将session对象绑定到hibernate中 -->
<property name="hibernate.current_session_context_class">thread</property>
<!-- 加载表单项配置文件 -->
<mapping resource="tqb/entity/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
代码实现
package tqb.test;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;
import tqb.entity.User;
public class Demo {
@Test
public void addTest(){
/*
* 加载核心配置文件
* 在src下寻找hibernate.cfg.xml的配置文件
* 在hibernate里进行封装对象
*/
Configuration cfg = new Configuration();
cfg.configure();
/*
* 创建SessionFactory对象
* 读取核心配置文件内容,并在数据库中创建映射的表
*/
SessionFactory factory = cfg.buildSessionFactory();
/*
* 创建Session对象
* 此过程实现与数据库的连接
*/
Session session = factory.openSession();
/*
* 开启事务
*/
Transaction transaction = session.beginTransaction();
/*
* 具体操作
*/
//创建实体对象
User user = new User();
user.setUsername("zhangsan");
user.setPwd("123456");
//添加数据
session.save(user);
/*
* 提交事务
*/
transaction.commit();
/*
* 关闭资源
*/
session.close();
factory.close();
}
}
Hibernate的核心的API
- Configuration
1)加载核心配置文件,即在src目录下找hibernate.cfg.xml的配置文件,创建对象,把核心配置文件放到cfg对象中 - SessionFactory
1)根据文件内容进行数据库表的创建
2)这个过程非常的耗费资源,建议创建工具类,使用静态代码块实现,项目中只加载一次 - Session
1)类似于jdbc中数据库的连接
2)调用session对象的方法进行一些具体的操作
3)session对象为单线程对象,只能自己进行使用
工具类
package utils;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtils {
static Configuration cfg = null;
static SessionFactory sessionFactory = null;
// 静态代码块实现
static {
// 加载核心配置文件
cfg = new Configuration();
cfg.configure();
sessionFactory = cfg.buildSessionFactory();
}
// 提供返回与本地线程绑定的session的方法
public static Session getSessionObject() {
return sessionFactory.getCurrentSession();
}
// 提供方法返回sessionFactory
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}