首页 > 代码库 > Hibernate入门

Hibernate入门

PS:相关概念

1.Configuration类,启动Hibernate,用来指定对象,关系映射,文件的位置或者动态配置hibernate的属性
 
2.SessionFactory接口,一个存储源(DB)的代理,一个Factory对应一个DB
 
3.session接口 持久化管理器,主要增删改查
 
4.Transaction接口 主要是事务管理
 
5.Query和Criteria接口 都是查询 get() load();
 

一、创建一个Oracle用户

 
1.sqlplus / as sysdba //进入管理员账户
create user db_hxzg identified by 123 //创建用户
default tablespace hxzg_data; //创建默认表空间
 
2,创建表空间
create tablespace hxzg_data
logging
datafile ‘C:\app\data\hxzg_data.dbf‘
size 50m
autoextend on
next 50m maxsize 20480m ;
 
3,创建用户
create user db_hxzg identified by 123
default tablespace hxzg_data;
 
4,赋权
grant resource,connect to db_hxzg;
 
5,给其他用户访问权限(db_hxzg以DBA权限登录)
grant select any table to sun;
 

二、创建第一个Xml文件

hibernate文档帮助路径:
documentation/manual/en-US/html/index.html
 
<!--头文件-->
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
 
<!--1.1.4. Hibernate configuration-->
<hibernate-configuration>
<session-factory>
<!-- 数据库连接设置-->
<property name="connection.driver_class">oracle.jdbc.OracleDriver</property>
<property name="connection.url">
jdbc:oracle:thin:@localhost:1521:orcl</property>
<property name="connection.username">soap</property>
<property name="connection.password">123</property>
 
<!-- JDBC 连接设置 -->
<property name="connection.pool_size">5</property>
 
<!-- c3p0连接池配置 -->
<!-- 当配置了c3p0连接池后会自动关闭Hibernate内置的默认连接池 -->
<!-- 最大连接数 -->
<property name="hibernate.c3p0.max_size">20</property>
<!-- 最小连接数 -->
<property name="hibernate.c3p0.min_size">5</property>
<!-- 获得连接的超时时间,若超过这个时间会抛出异常,单位:毫秒 -->
<property name="hibernate.c3p0.timeout">5000</property>
<!-- 创建的PreparedStatement对象的最大数量 -->
<property name="hibernate.c3p0.max_statements">100</property>
<!-- 每隔指定时间检查连接池中的空闲连接,时间单位:秒 -->
<property name="hibernate.c3p0.idle_test_period">150</property>
<!-- 当连接池中的连接使用完毕,c3p0会再和数据库建立n个连接放置到连接池中 -->
<property name="hibernate.c3p0.acquire_increment">2</property>
<!-- 每次都验证连接是否可用 -->
<property name="hibernate.c3p0.validate">false</property>
 
<!-- SQL 方言 3.4.1. SQL Dialects-->
<property name="dialect">org.hibernate.dialect.Oracle10gDialect</property>
 
<!-- Echo all executed SQL to stdout -->
<property name="show_sql">true</property>
 
<!-- mapping类的XML-->
<mapping resource="com/soap/pojo/Bank_Users.hbm.xml" />
 
</session-factory>
</hibernate-configuration>
 

三、创建实体类后创建第二个Xml文件

 
<!--1.1.3. The mapping file-->
<hibernate-mapping package="com.soap.pojo">
<!-- 创建自增 -->
<class name="Bank_Users" table="Bank_Users">
<id name="bid" column="bid" type="int">
<generator class="sequence">
<param name="sequence">bank_id</param>
</generator>
</id>
<!-- name中是匹配的实体类中的get/set方法 -->
<property name="bname" type="string" column="bname" />
<property name="age" type="string" column="age" />
<property name="sex" type="string" column="sex" />
<property name="phone" type="string" column="phone" />
</class>
</hibernate-mapping>

 

四、操作hibernate

1.进行新增
//确认配置
Configuration cfg = new Configuration();
cfg.configure("hibernate.cfg.xml");
 
//得到session工厂后打开session
SessionFactory sf = cfg.buildSessionFactory();
Session se = sf.openSession();
 
//得到事务管理器
Transaction transaction = se.beginTransaction();
 
//创建对象后提交
Bank_Users bu = new Bank_Users("赵日天", "123", "男", "1555555555");
se.save(bu);
//提交事务后可以关闭session
transaction.commit();
 
2.进行查询
//后一个参数为当前表的主键
Bank_Users bu = (Bank_Users) se.load(Bank_Users.class,3);
 
--------------------------------1~4为简单的hibernate程序创建-------------------------------------
 

五、Session优化

 
原则:尽量减少SessionFactory 重量级的创建,而使用session这种轻量级的去创建,每一个进程只有一个session,session是单例的,而且session在一次访问数据库后不会消失。
 
1.方法一:
建立一个类HibernateSessionFactory
// 建立静态,只创建一次
private static SessionFactory factory;
private static Configuration config;
 
// 在独立的线程中 session是单例的
private static ThreadLocal<Session> local = new ThreadLocal<Session>();
 
static {
config = new Configuration();
config.configure("hibernate.cfg.xml");
factory = config.buildSessionFactory(
// 去支持以注册表的形式读取
new ServiceRegistryBuilder().applySettings(
config.getProperties()).buildServiceRegistry());
}
 
/**
* 得到一个Session
*/
public static Session getSession() {
Session session = local.get();
if (session == null) {
session = factory.openSession();
local.set(session);
}
return session;
}
 
/**
* 关闭session
*/
public static void closeSession() {
Session session = local.get();
if (session != null) {
session.close();
local.set(null);
}
}
 
 
2.方法二、
/**
* getCurrentSession()内包含关闭方法
*/
public static Session getSession() {
Session session = factory.getCurrentSession();
return session;
}
 
要在XML种配置这句话
<property name="current_session_context_class">thread</property>
 
注意,应该提交事务,不加就报错:
Transaction tran = session.beginTransaction();
tran.commit();
 
 
 
 
 
 
 
 

Hibernate入门