Hibernate(二)

来源:互联网 发布:it培训机构排名 编辑:程序博客网 时间:2024/06/01 21:27

一、Hibernate工作原理



1、读取并解析配置文件

2、读取并解析映射信息

3、创建SessionFactory

4、打开Session

5、创建事务Transation

6、持久化操作

7、提交事务

8、关闭Session

9、关闭SessionFactory

 

二、持久化Java类必须遵循的原则

1、为类的持久化类字段申明访问方法(get/set)。Hibernate对JavaBeans风格的属性实行持久化。

2、实现一个默认的构造方法(constructor)。这样的话Hibernate就可以使用Constructor.newInstance()来实例化它们。

3、如果是集合类型的属性,它的类型必须定义为集合的接口。

         例如:List、Set。

4、提供一个标识属性(identifierproperty)。如果没有该属性,一些功能不起作用,比如:级联更新(Cascaded updates)Session.saveOrUpdate()。

 

三、Hibernate核心接口

Hibernate接口分四类:

1、用于配置Hibernate的接口:

   Configuration(作用:配置Hibernate,启动Hibernate和创建SessionFactory对象)、SessionFactory(作用:初始化Hibernate,充当数据存储源的代理,创建Session对象)。

2、提供访问数据库操作的接口:

   Session(作用:负责保存、更新、删除、加载和查询对象)、Transaction(作用:Hibernate的数据事务接口,对底层的事务接口做了封装,底层事务接口JDBC、API、JTA、CORBA API)、QueryCriteria接口(作用:执行数据库查询对象,以及控制执行查询过程)。

3、回调接口,使用应用程序接受Hibernate内部发生的事件,并做出相应的回应:

   Interceptor、Lifecycle、Validatable接口。

4、用于扩展Hibernate的功能的接口:

   UserType。

 

四、一些接口和配置的说明

1、Configuration接口

Configuration负责管理Hibernate的配置信息。Hibernate运行时需要一些底层实现的基本信息,这些信息包括:数据库url,数据库用户名,数据库用户密码,数据库JDBC驱动类,数据库dialect。这些属性在Hibernate配置文件hibernate.cfg.xml中加以设定,当调用:Configuration config=new Configuration().configure();时,Hibernate会自动在目录下搜索hibernate.cfg.xml文件,并将其读取到内存中作为后续操作的基础配置。

 

2、Hibernate配置的两种方法:

(1)属性文件(hibernate.properties)

调用代码:Configurationcfg=new Configuration();

  (2)Xml文件(hibernate.cfg.xml)

   调用代码:Configuration cfg=new Configuration().configure();

 

3、Configuration接口配置文件hibernate.cfg.xml常用参数

数据库连接的配置

hibernate.dialect org.hibernate.dialect.MySQLDialect

hibernate.connection.driver_class com.mysql.jdbc.Driver

hibernate.connection.url jdbc:mysql://localhost/hibernate

hibernate.connection.username root

hibernate.connection.password 123456

hibernate.show_sql true

hibernate.jdbc.fetch_size 50 //设定jdbc的Statement从数据库读取的记录条数

<property name=”hbm2ddl.auto”> //update自动建表

hibernate.jdbc.batch size 25

//是设定对数据库进行批量删除,批量更新,批量插入的时候的批次大小。相当于设置Buffer缓冲区大小的意思。Batch Size越大,批量操作向数据库发送sql的次数越少,速度就越快。

 

4、C3P0的Hibernate连接池配置

<?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">   

<hibernate-configuration>    

<session-factory >    

<!—JDBC驱动程序-->    

<property name="connection.driver_class">com.mysql.jdbc.Driver</property>   

<!-- 连接数据库的URL-->    

<property name="connection.url">     

jdbc:mysql://localhost:3306/schoolproject     

</property>    

<property name="connection.useUnicode">true</property>   

<property name="connection.characterEncoding">UTF-8</property>   

<!--连接的登录名-->    

<property name="connection.username">root</property>   

<!--登录密码-->    

<property name="connection.password"></property>   

      

<!-- C3P0连接池设定-->    

<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider    

</property>    

<property name="hibernate.c3p0.max_size">20</property>   

<property name="hibernate.c3p0.min_size">5</property>   

<property name="hibernate.c3p0.timeout">120</property>   

<property name="hibernate.c3p0.max_statements">100</property>   

<property name="hibernate.c3p0.idle_test_period">120</property>   

<property name="hibernate.c3p0.acquire_increment">2</property>   

<!--是否将运行期生成的SQL输出到日志以供调试-->    

<property name="show_sql">true</property>   

<!--指定连接的语言-->    

<property name="dialect">org.hibernate.dialect.MySQLDialect</property>   

<!--映射Stu这个资源-->    

<mapping resource="com/cn/model/pojo/Stu.hbm.xml" />   

</session-factory>      

</hibernate-configuration>  

 

5、SessionFactory接口

SessionFactory负责创建Session实例,可以通过Configuration实例构建SessionFactory。

SessionFactory保存了对应当前数据库配置的所有映射关系,同时也负责维护当前的二级数据缓存和Statement Pool。SessionFactory的创建过程非常复杂、代价高昂。SessionFactory采用了线程安全的设计,可由多个线程并发调用。

 

   6、Session接口

Session是Hibernate持久化操作的基础,提供了众多持久化方法,如save,update,delete等。Hibernate Session的设计是非线程安全的,即一个Session实例同时只可有一个线程使用,多线程并发调用将导致难以预知的错误。

保存用户:session.save(Person);

查询用户:load(Class theClass,Serializable id)

                    get(Class theClass,Serializable id)

修改用户:session.update(Person);

保存或修改用户:session.saveOrUpdate(Person);

删除用户:session.delete(Person);

删除所有用户:session.delete(“from Person”);

 

   7、Transaction接口

Transaction是Hibernate中进行事务操作的接口,Transaction接口是对实际事务实现的一个抽象,这些实现包括JDBC的事务、JTA 中的UserTransaction,甚至可以是CORBA 事务。之所以这样设计是可以让开发者能够使用一个统一的操作界面,使得自己的项目可以在不同的环境和容器之间方便地移值。

使用Hibernate进行操作(增、删、改)时,必须调用Transaction(默认:autoCommit=false)。

 

  8、Query接口

例如以下语句:

(1)Queryquery=session.createQuery(“from Course where kch=100”);

(2)通过“?”来设置参数

         Query query=session.createQuery(“from Course where kch=?”);

         在后面设置其值:

         query.setString(0,”要设置的值”);

(3)通过“:”设置参数

         Query query=session.createQuery(“from Course where kch=:kchValue”);

         query.setString(“kchValue”,”要设置的课程号值”);

         或者query.setParameter(0,”要设置的值”);


Query还有一个list()方法,用于取得一个List集合的示例,此示例中包括可能是一个Object集合,也可能是Object数组集合。例如:

        Query query=session.createQuery(“from Course where kch=100”);

        List list=query.list();

 

 


0 0
原创粉丝点击