Hibernate介绍
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用。Hibernate的出现解放了程序员百分之九十的工作量
部分名词解释:
- POJO:简单的java类,实际上就是我们常说的bean类。类中提供简单的私有属性和get&set方法,并提供构造方法。
- 对象关系映射:ORM,将bean类与数据库中对应的数据表进行联系。
- 数据持久化:在程序中,数据有三种状态,分别是瞬时状态,持久状态,托管状态。
实现一个Hibernate小样
第一步:导包。
其中包含两个个部分:
- 数据库的包(这里使用Oracle数据库)
- Hibernate的包(依赖包和核心包)
第二步:在数据库中新建表
<!-- 创建表格 -->
create table person
(
pid number(4) primary key,
pname varchar2(20),
pwd varchar2(20)
);
<!-- 创建序列(自增) -->
create sequence se_single
minvalue 1000
maxvalue 2000
start with 1001
increment by 1
nocache;
<!-- 创建触发器 -->
CREATE OR REPLACE TRIGGER tri_person
BEFORE
insert on person
for each row
begin
select se_single.nextval into :new.pid from dual;
end ;
复制代码
第三步:创建hibernate.cfg.xml文件
该文件可在解压好的hibernate压缩包下****\hibernate\hibernate-distribution-3.6.6.Final\project\etc\hibernate.cfg.xml复制而来,只需要修改一些属性的值。 我们将hibernate.cfg.xml文件复制到项目的src下面,打开如下:
<!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 name="foo">
<property name="show_sql">true</property>
<mapping resource="org/hibernate/test/legacy/Simple.hbm.xml"/>
<class-cache
class="org.hibernate.test.legacy.Simple"
region="Simple"
usage="read-write"/>
</session-factory>
</hibernate-configuration>
复制代码
- 其中session-factory属性,是Hibernate的核心,这里对name属性不需要更改
- show_sql属性,类型是boolean,表示是否在控制台上打印Hibernate的sql语句(Hibernate自己生成的)
- 标签表示引入映射文件(此处先忽略)
- 标签我们不需要知道,删除即可
修改后的文件
<!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 name="foo">
<property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property>
<property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<property name="hibernate.connection.username">chuxus</property>
<property name="hibernate.connection.password">angle</property>
<property name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<mapping resource="com/hibernate/bean/Person.hbm.xml"/>
</session-factory>
</hibernate-configuration>
复制代码
- 新增方言属性,方言的作用是让hibernate分清楚是什么类型的数据库,以生成相应的sql语句
- 新增数据库驱动、url、账户、密码属性,这里相当于MVC中的Util类中的设置。
- 新增format_sql属性,将sql语句格式化
第四步:创建实体类和对应的ORM文件
- 实体类中包含私有属性,get&set方法,构造方法和toString方法
- 创建Person.hbm.xml(对象关系映射)文件
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.hibernate.bean">
<class name="Person" table="person">
<!-- 这里的name是对应实体类中的属性,column中是数据库中的表列名,这里区分大小写 -->
<id name="pid" type="int" column="pid">
<!-- Oracle的自增归用户所有,这里相对于MySql有区别 -->
<generator class="sequence">
<param name="sequence">se_single</param>
</generator>
</id>
<!-- 这里的类型是小写的string,如果使用大写,则需要前缀java.lang.String -->
<property name="pname" type="string" column="pname" />
<property name="pwd" type="string" column="pwd"></property>
</class>
</hibernate-mapping>
复制代码
- 修改hibernate.cof.xml文件<mapping resource="com/hibernate/bean/Person.hbm.xml"
这里的resource是关系映射文件的位置(一般和实体类放在同一个包下)
第五步:新建HibernateUtil类,用来获取session
package com.hibernate.util;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtil {
static SessionFactory sf = null;
/**
* java中加载顺序
* 默认值
* 初始化快
* 构造方法
* 顺序如下:默认值->初始化快->构造方法
*/
static {
Configuration con = new Configuration();
con.configure();
sf = con.buildSessionFactory();
}
public static Session getSession() {
return sf.openSession();
}
}
复制代码
第六步:新建dao层,imp层
- dao层
package com.hibernate.dao;
import java.util.List;
/**
* 基础dao层
* @author Chuxus
*
* @param <T>
*/
public interface BasicDao<T> {
/**
* 登陆
* 添加
* 删除
* 更新
*
* @param t
* @return
*/
public boolean login(T t);
public boolean add(T t);
public boolean delete(int id);
public boolean update(T t);
}
复制代码
- imp层(部分代码)
public class BasicImp<T> implements BasicDao<T> {
Session session = null;
@Override
public boolean login(T t) {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean add(T t) {
session = HibernateUtil.getSession();
//开启事务
Transaction tr = session.beginTransaction();
int result = (Integer)session.save(t);
boolean flag = false;
if(result>0) {
flag = true;
//提交事务
tr.commit();
}
return flag;
}
}
复制代码
package com.hibernate.dao.imp;
import com.hibernate.bean.Person;
public class PersonImp2 extends BasicImp<Person> {
}
复制代码
在Oracle中,增删改都是需要事务提交之后的,如果没有事务提交,那么被修改的数据只是存在Oracle的缓存中,不会真正写入到数据库中,这里需要注意。
新建测试类
package com.hibernate.test;
import com.hibernate.bean.Person;
import com.hibernate.dao.PersonDao;
import com.hibernate.dao.imp.PersonImp2;
import com.hibernate.dao.imp.personImp;
public class Test {
@org.junit.jupiter.api.Test
public void Demo() {
Person p = new Person(1024,"Jerry","111111");
PersonImp2 pd = new PersonImp2();
boolean flag = pd.add(p);
System.out.println(flag);
}
}
复制代码
结果如下:
数据库中查询数据,已经插入,至此,第一个hibernate程序就完成了。