公司一个项目用到了hibernate框架,赶紧复习一下,虽然现在都是用Mybatis。
hibernate,Mybatis都是ORM概念的一种具体实现。
ORM概念:Object Realtion Mapping (对象关系映射), 用于解决对象和数据库表之间的映射关系。
简单的说,就是考虑 如何将对象直接保存到表中,以及从表中直接获取到对象。
这里要考虑三个因素:
1) 对象 和 表 要对应
2)对象的属性 和 表的字段 要对应
3)对象属性的类型 和 表字段的类型 要对应
解决这三个问题就可以直接拿对象或者存对象了。
一、先来一个HelloWord
1)导入jar包
https://download.csdn.net/download/quge_name_harder/10892966
2)写实体类 Employee.java
import java.util.Date;
//一、 对象
public class Employee {
private int empId;
private String empName;
private Date workDate;
public int getEmpId() {
return empId;
}
public void setEmpId(int empId) {
this.empId = empId;
}
public String getEmpName() {
return empName;
}
public void setEmpName(String empName) {
this.empName = empName;
}
public Date getWorkDate() {
return workDate;
}
public void setWorkDate(Date workDate) {
this.workDate = workDate;
}
@Override
public String toString() {
return "Employee [empId=" + empId + ", empName=" + empName
+ ", workDate=" + workDate + "]";
}
}
3)写实体类与表的映射文件 Employee.hbm.xml
映射文件作用:
解决这三个问题
1. 对象 和 表 要对应
2. 对象的属性 和 表的字段 要对应
3. 对象属性的类型 和 表字段的类型 要对应
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.zc.a">
<!--name="Employee" 为实体类 table="employee" 为表名 -->
<class name="Employee" table="employee">
<!--
主键映射 ,name="empId" 为实体类的属性,column="id" 为表的字段
-->
<id name="empId" column="id">
<!-- class="native" 为主键自增长的方式-->
<generator class="native"/>
</id>
<!--
非主键映射
我们可以用type指定表字段类型 type="string"
如果不写,则默认和对象属性的类型一致
-->
<property name="empName" column="empName" type="string"></property>
<property name="workDate" column="workDate"></property>
</class>
</hibernate-mapping>
4)在 src/hibernate.cfg.xml 写主配置文件。
主配置文件作用:
1.数据库连接配置
2.加载所用的映射(*.hbm.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节点代表一个数据库 -->
<session-factory>
<!-- 1. 数据库连接配置 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql:///hib_demo</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<!--
数据库方法配置, hibernate在运行的时候,会根据不同的方言生成符合当前数据库语法的sql
-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
<!-- 2. 其他相关配置 -->
<!-- 2.1 显示hibernate在运行时候执行的sql语句 -->
<property name="hibernate.show_sql">true</property>
<!-- 2.2 格式化sql -->
<property name="hibernate.format_sql">true</property>
<!-- 2.3 自动建表 -->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 3. 加载所有映射 -->
<mapping resource="com/zc/Employee.hbm.xml"/>
</session-factory>
</hibernate-configuration>
5)测试
public class test {
@Test
public void testHello() throws Exception {
// 对象
Employee emp = new Employee();
emp.setEmpName("小明");
emp.setWorkDate(new Date());
// 获取加载配置文件的管理类对象
Configuration config = new Configuration();
config.configure(); // 默认加载src/hibenrate.cfg.xml文件
// 创建session的工厂对象
SessionFactory sf = config.buildSessionFactory();
// 创建session (代表一个会话,与数据库连接的会话)
Session session = sf.openSession();
// 开启事务
Transaction tx = session.beginTransaction();
//保存-数据库
session.save(emp);
// 提交事务
tx.commit();
// 关闭
session.close();
sf.close();
}
}
二、Hibernate相关API
在上面测试的时候,我们用到了一些相关的API,下面分别介绍
1)
// 获取加载配置文件的管理类对象
Configuration config = new Configuration();
config.configure(); // 默认加载src/hibenrate.cfg.xml文件
Configuration 配置管理类对象,通过它的configure()方法加载主配置文件(默认加载src/hibenrate.cfg.xml文件)。
当然也可以写上路径,加载指定路径下指定名称的主配置文件
config.configure(“com/config/hibernate.cfg.xml”);
2)
// 创建session的工厂对象
SessionFactory sf = config.buildSessionFactory();
// 创建session (代表一个会话,与数据库连接的会话)
Session session = sf.openSession();
加载完主配置文件后,创建session的工厂对象,并创建一个session。
3)
// 开启事务
Transaction tx = session.beginTransaction();
//保存-数据库
session.save(emp);
// 提交事务
tx.commit();
通过session开启事务,执行具体操作,并提交
4)
// 关闭
session.close();
sf.close();
关闭连接
三、执行具体操作
上节中我们在开启事务后,执行具体操作,也就是我们常说的增删改查。本节介绍一下
常用的有
// 增
// 保存一个对象
session.save(emp);
// 删
// 先根据id查询对象,再判断删除
// 如果直接删除空对象,会报错
Object obj = session.get(Employee.class, id);
if (obj != null) {
session.delete(obj);
}
// 改
// 先根据id查询对象,再判断更新
Employee emp = (Employee)session.get(Employee.class, id);
if (emp != null) {
session.update(emp);
}
//保存或者更新的方法: 没有设置主键,执行保存;有设置主键,执行更新操作; 如果设置主键不存在报错!
session.saveOrUpdate(emp);
// 查
// 主键查询
session.get(Employee.class, id);
session.load(Employee.class, id); // 懒加载
// 此外hibernate提供了面向对象的查询语言,HQL (hibernate query language)
// 它查询的是对象以及对象的属性。区分大小写。
// 而SQL查询的是表以及字段;不区分大小写。
// HQL查询
Query q = session.createQuery("from Employee");
List<Employee> list = q.list();
// 带参数的HQL查询
Query q =session.createQuery("from Employee where empName=?");
// 注意:参数索引从0开始
q.setParameter(0, employeeName);
// 执行查询
List<Employee> list = q.list();
// 设置分页的HQL查询
Query q = session.createQuery("from Employee");
// 设置分页参数
q.setFirstResult(index); // 查询的其实行
q.setMaxResults(count); // 查询返回的行数
List<Employee> list = q.list();