Hibernate(二)
2016-08-05 13:01
218 查看
一、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)、Query和Criteria接口(作用:执行数据库查询对象,以及控制执行查询过程)。
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(
4000
0,”要设置的值”);
Query还有一个list()方法,用于取得一个List集合的示例,此示例中包括可能是一个Object集合,也可能是Object数组集合。例如:
Query query=session.createQuery(“from Course where kch=100”);
List list=query.list();
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)、Query和Criteria接口(作用:执行数据库查询对象,以及控制执行查询过程)。
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(
4000
0,”要设置的值”);
Query还有一个list()方法,用于取得一个List集合的示例,此示例中包括可能是一个Object集合,也可能是Object数组集合。例如:
Query query=session.createQuery(“from Course where kch=100”);
List list=query.list();
相关文章推荐
- WEB安全之CSRF
- MYSQL
- 2020 绝对值排序
- CF 690C3. Brain Network (hard) from Helvetic Coding Contest 2016 online mirror (teams, unrated)
- DFS_4
- redis单主机多实例
- Java.Web学习笔记 Spring4
- 【排序】插入排序,希尔排序,选择排序,冒泡排序,堆排序详解及稳定性分析
- Mishka and trip(CF 703B)
- Codeforces Round #365 (Div. 2) 703B Mishka and trip 水题
- Linux Redis安装部署
- ruby升级
- 数学公式 —— 向量
- 开个博客瞧一瞧
- 【OpenCV】VS2015与OpenCV2.4.11配置
- selenium2.0报错:stale element reference: element is not attached to the page document的解决办法
- #107 Word Break
- struts2 中 Session的使用简介
- <实训|第十二天>用LVM对linux分区进行动态扩容
- angularjsFileUpload+Springmvc上传文件