相当于ORM的鼻祖
比较早,学校里学过的都是挺老的吧。SS2H
优缺点:
全自动化
相比mybatis是半自动化的,可以根据自己的需求定制。
//但是洗衣机还是要选全自动的。马桶也是。
简化了JDBC繁琐的代码
可移植性好
mysql,oracle什么的都可以用
对面向对象特性支持良好
缺点:
- 不适合需要使用数据库的特定优化机制的情况
- 不适合大规模的批量数据处理
与mybatis比较:
- 相对于MyBatis的”SQL-Mapping”的ORM实现,Hibernate的ORM实现更加完善,提供了对象状态管理、级联操作等功能
- 完全面向对象,语句与数据库无关,开发者无需关注SQL的生成,开发简单,便于修改,数据库移植性好
- 由于直接使用SQL,MyBatis使用自由度较高
第一个hibernate项目
- 搭建Hibernate环境的步骤
- 引入所需的jar文件
- 配置hibernate.cfg.xml
- 创建持久化类并配置相关hbm.xml映射文件
- 在hibernate.cfg.xml中引入hbm.xml映射文件
- hibernate配置文件
resource下新建hibernate.cfg.xml
|
|
创建实体类
随便建一个Dept.java,封装get/set方法;
在实体类同路径下创建Dept.hbm.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24<?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> <!-- name:实体类的名字 table:数据库中对应的表名 dynamic-update:自动更新 --> <class name="cn.qf.hibernate.pojo.Dept" table="dept" dynamic-update="true"> <!-- 主键使用id标签进行关联映射,其余属性property --> <!-- 实体类的属性名和字段名不需要一致 --> <!-- name:实体类的属性名 column:数据库中对应的字段名 type:属性的java类型 --> <id name="deptno" column="deptno" type="java.lang.String"> <!-- 主键的生成策略 assigned 用户自己赋值插入 使用setXXX赋值 --> <generator class="assigned"/> </id> <property name="dname" type="java.lang.String"> <!-- 这么写也行 --> <column name="dname"/> </property> <property name="loc" column="loc" type="java.lang.String"/> </class> </hibernate-mapping>在dao下创建HibernateUtil.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25package cn.qf.hibernate.dao;import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;public class HibernateUtil {
// 声明hibernate的配置对象类
private static Configuration configuration;
//声明一个sessionFactory 创建session
private final static SessionFactory SESSION_FACTORY;
static {
// 1.读取配置文件hibernate.cfg.xml并创建配置对象
configuration = new Configuration().configure();
//2.通过配置对象 构建工厂对象
SESSION_FACTORY = configuration.buildSessionFactory();
}
// 获取session的方法
public static Session getSession() {
//3.通过工厂对象获取session
return SESSION_FACTORY.getCurrentSession();
}
}dao下创建一个BaseDao.java(这个可有可无)
|
|
- dao下创建DeptDao.java
|
|
service下创建DeptService.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27package cn.qf.hibernate.service;import cn.qf.hibernate.dao.DeptDao;
import cn.qf.hibernate.pojo.Dept;
import org.hibernate.Transaction;public class DeptService {
private DeptDao dd = new DeptDao();
//添加方法
public boolean addDept(Dept dept) {
//声明事务对象
Transaction tr = null;
//获取事务对象
try {
tr = dd.getSession().beginTransaction();
dd.addDept(dept);
//提交事务
tr.commit();
dd.getSession().close();
return true;
} catch (Exception ex) {
tr.rollback();
return false;
}
}
}建一个测试类试试
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25package cn.qf.hibernate.test;import cn.qf.hibernate.pojo.Dept;
import cn.qf.hibernate.service.DeptService;public class Test {
static DeptService ds = new DeptService();
public static void main(String[] args) {
addDept();
}
public static void addDept() {
Dept dept = new Dept();
dept.setDeptno("123asd");
dept.setDname("王五");
dept.setLoc("大连市高新园区");
boolean result = ds.addDept(dept);
if (result) {
System.out.println("success");
} else {
System.out.println("failed");
}
}
}运行结果:

获取单个对象的方法:
1 2 3 4 5 6 7 8 9 10 11//查询获取单个对象1 public Dept loadDept(Serializable id) { Dept dept = (Dept) super.getSession().load(Dept.class, id); return dept; }//查询获取单个对象2
public Dept getDept(Serializable id) {
Dept dept = (Dept) super.getSession().get(Dept.class, id);
return dept;
}get和load区别:
get:若数据不存在,返回null;
load:若数据不存在,使用时抛出ObjectNotFoundException异常
三种状态
