Hibernate学习笔记
http://blog.youkuaiyun.com/a1n9n7e/article/details/77861458
Hibernate的基本概念
Hibernate是什么?
hibernate是一个是对JDBC进行了轻量级封装的orm框架(framework),处于项目的持久层。orm(Object relation mapping)对象关系映射框架
ROM是什么
对象关系映射(ObjectRelation Mapping,简称ORM)是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将java程序中的对象自动持久化到关系数据库中。本质上就是将数据从一种形式转换到另外一种形式。
结论:使用orm技术(hibernate是其中最为流行的)可以在java程序以类和对象的方式去操控数据库表和记录.
Hibernate的优点
- 引入hibernate可以使工作人员角色细化,让程序员更关心业务流程。让数据库人员关注数据库相关的各种操作。
- 分层更清晰,耦合性更小。
- 通用性强:可以更轻松的从一个数据库平台转移到别的平台。
- 对象化:把关系数据库变成了Java的对象,更加方便操作。
- 性能保证:hibernate可能按不同的数据库,处理不同的操作是用
- 最优化的SQL语句,不用我们去想,对于分等算法,在hibernate中会显得更简单,可靠。
- 增加了程序的鲁棒性!
什么是POJO
在使用hibernate时,要求和数据库的某张表相互映射的那个java类,是一个POJO类,一般放在com.xxx.domain包下。
POJO类翻译过来就是:简单的Java对象(Plain Ordinary Java Objects)实际就是普通JavaBeans,使用POJO名称是为了避免和EJB混淆起来。一个POJO类应当具有:
- 有一个主键属性,用于唯一标识该对象。(这就是为什么hibernate设计者建议要映射的表需要一个主键)
- 有其它的属性
- 有对各个属性操作的get/set方法
- 属性一般是private修饰.
- 一定有一个无参的构造函数(用于 hibernate 框架反射用 .)
Hibernate依赖的其他库介绍
库文件 | 说明 |
---|---|
antlr | Java开源的语法分析器 |
Commons Collections | Commons的集合类库 |
dom4j | 进行XML解析的类库 |
开源的分析、编译和创建java字节码的类库 | |
slf4j-api | Simple Logging Facade for Java,日志处理api |
slf4j-simple | SLF4J API的实现 |
JTA | Java Transaction API,java中额事务处理API |
Hibernate入门项目
Hibernate的三种开发方式
- 由Domain object -> mapping->db。(官方推荐)
- 由DB开始,用工具生成mapping和Domainobject。(使用较多)
- 由映射文件开始。
这里主要针对第二种开发方式进行实例操作
简答入门实例
1.创建数据库(MySQL)
create table employee(
id int(4) primary key not null auto_increment,
name VARCHAR(64) not null,
email VARCHAR(64) not NULL,
hiredate TIMESTAMP not null
);
2.创建POJO,Employee类
package com.nick.domain;
import java.util.Date;
//该POJO按照规范应当序列化,目的是可以唯一的标识该对象,同时可以在网络和文件传输
public class Employee implements Serializable {
private String name;
private Integer id;
private String email;
private Date hiredate;
public Employee() {
// TODO Auto-generated constructor stub
}
//这里省略get,set方法,但是在配制时一定要写出
public void get(){}
public void set(){}
}
3.配置Employee类对应的 Employee.hbm.xml 映射文件
注意,这里的 Employee.hbm.xml 放在和 Employee相同路径中。即在 package com.nick.domain 下创建并配置 Employee.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">
<!-- package="com.nick.domain" 配置映射文件所在的包 -->
<hibernate-mapping package="com.nick.domain">
<!-- 配置在当前包下,指定类和表进行匹配 -->
<class name="Employee" table="Employee">
<!-- id元素用于指定主键属性 -->
<id name="id" column="id" type="java.lang.Integer">
<!-- 该元素用于指定主键值生成策略 -->
<generator class="increment" />
</id>
<!-- 对其他属性配置 -->
<property name="name" type="java.lang.String">
<column name="name" not-null="false" />
</property>
<property name="email" type="java.lang.String">
<column name="email" not-null="false" />
</property>
<property name="hiredate" type="java.util.Date">
<column name="hiredate" not-null="false" />
</property>
</class>
</hibernate-mapping>
4.手动配置 hibernate.cfg.xml 文件
hibernate.cfg.xml 文件 ,主要用于配置连接的数据库类型,数据库驱动,用户名,密码,url等等
hibernate的源码包中提供了便捷配置,文件位于 hibernate-release-5.2.10.Final\project\etc 目录下的 hibernate,properties 文件,该文件中给出了各种数据库的驱动,用户名,密码,url等,使用时复制粘贴即可
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<!-- 配置domain对象和表的对应关系 -->
<hibernate-configuration>
<session-factory>
<!-- 配置MySQL驱动类 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- MySQL连接端口号(3306)与数据库(myee) -->
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test</property>
<!-- MySQL用户名 -->
<property name="hibernate.connection.username">root</property>
<!-- MySQL密码 -->
<property name="hibernate.connection.password">123456</property>
<!-- 配置dialect方言,明确告诉hibernate连接的是哪种数据库, Hibernate根据你选择的“方言”,针对每种数据库,作调整,如生成不同的SQL语句等 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 为了便于跟踪,该配置可以显示出对应执行的sql语句 -->
<property name="show_sql">true</property>
<!-- 与实体类连接(包名com/nick/domain/实体类的xml) -->
<mapping resource="com/nick/domain/Employee.hbm.xml"/>
</session-factory>
</hibernate-configuration>
5.创建一个测试类,进行数据库操作。
package com.nick.view;
import java.util.Date;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import com.nick.domain.Employee;
public class TestMain {
public static void main(String[] args) {
// 使用hibernate完成crud操作,(这里我们只见对象,不见表)
// 1.创建configuration, 该对象用于读取 hibernate
// 的配置文件,并完成初始化。configure()默认查找读取hibernate.cfg.xml.
Configuration configuration = new Configuration().configure("hibernate.cfg.xml");
// 2.创建SessionFactory [这是一个会话工厂,是一个重量级对象,通常确保这个对象为单态]
SessionFactory sessionFactory = configuration.buildSessionFactory();
// 3.创建Session [类似于 jdbc中的Connection ]
Session session = sessionFactory.openSession();
// 4.对hibernate而言,要求对数据库进行 增、删、改时使用事务提交,否则操作不成立
Transaction transaction = session.beginTransaction();
// 添加一个雇员
Employee employee = new Employee();
employee.setName("nick");
employee.setEmail("5936XXXX@qq.com");
employee.setHiredate(new Date());
// 保存数据
session.save(employee); // [相当于 insert into ... , 数据库语句被hibernate封装]
transaction.commit();
session.close();
}
}
当前实例中控制台显示:
Hibernate: select max(id) from Employee
Hibernate: insert into Employee (name, email, hiredate, id) values (?, ?, ?, ?)
6.对SessionFactory 进行单态封装。
package com.nick.util;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
/**
* 使用hibernate开发项目,项目只是用一个数据库时,务必保证只有一个SessionFactory
*
* @author shengsheng
*
*/
final public class MySeesionFactory {
private static SessionFactory sessionFactory;
static {
Configuration configuration = new Configuration().configure("hibernate.cfg.xml");
sessionFactory = configuration.buildSessionFactory();
}
private MySeesionFactory() {
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
7.重新修改测试类
这里为了方便演示我将增删改的操作全部写在了测试类,在实际项目通常会讲这些操作进行封装
package com.nick.view;
import java.util.Date;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import com.nick.domain.Employee;
import com.nick.util.MySeesionFactory;
public class TestMain {
public static void main(String[] args) {
//添加
addEmployee();
//更新
updateEmp();
//删除
deleteEmp();
}
private static void deleteEmp() {
// 删除
// 1.先获取session
Session session = MySeesionFactory.getSessionFactory().openSession();
Transaction transaction = session.getTransaction();
// 1.获取雇员
Employee employee = session.load(Employee.class, 5);
session.delete(employee);
transaction.commit();
session.close();
}
private static void updateEmp() {
Session session = MySeesionFactory.getSessionFactory().openSession();
Transaction transaction = session.beginTransaction();
// 修改用户
// 1.获取要修改的用户
// load是通过主键属性,获取该对象实例
Employee employee = session.load(Employee.class, 2);
// 2.修改
employee.setName("张老三");
employee.setEmail("souhu@souhu.com");
transaction.commit();
session.close();
}
/*
* 这里给出的是进行hibernate操作的大致流程,往后会对sessionfactory进行单态处理
*/
private static void addEmployee() {
// 使用hibernate完成crud操作,(这里我们只见对象,不见表)
// 1.创建configuration, 该对象用于读取 hibernate
// 的配置文件,并完成初始化。configure()默认查找读取hibernate.cfg.xml.
Configuration configuration = new Configuration().configure("hibernate.cfg.xml");
// 2.创建SessionFactory [这是一个会话工厂,是一个重量级对象,通常确保这个对象为单态]
SessionFactory sessionFactory = configuration.buildSessionFactory();
// 3.创建Session [类似于 jdbc中的Connection ]
Session session = sessionFactory.openSession();
// 4.对hibernate而言,要求对数据库进行 增、删、改时使用事务提交,否则操作不成立
Transaction transaction = session.beginTransaction();
// 添加一个雇员
Employee employee = new Employee();
employee.setName("nick");
employee.setEmail("5936XXXX@qq.com");
employee.setHiredate(new Date());
// 保存数据
session.save(employee); // [相当于 insert into ... , 数据库语句被hibernate封装]
transaction.commit();
session.close();
}
}