public void paramTest2(){
String hqlString="from Student s where s.name like :name";
Session session = HibernateUtil.currentSession();
Query query =session.createQuery(hqlString);
String name="zh%";
//按参数名字进行匹配
query.setString("name", name);
List<Student> student=query.list();
System.out.println(student);
}
1. Hibernate 是用来干什么的?
Hibernate是用来连接javabean对象和数据库的,那为什么不用JDBC呢,JDBC在连接数据库时,不能面向对象,产生冗余代码,然而Hibernate对JDBC对做了轻量级的封装,在连接数据库时,能直接面向对象,操作简单方便。
2.Hibernate是怎样建立数据库和javabean对象的连接呢?
说道这个问题,我们就要说一个概念—持久化,简单的说就是把java对象中涉及的数据都永久的保存磁盘中或数据库中。到底是怎么持久化的呢,hibernate用的是ORM框架,通过配置文件把对象模型和数据库的表一一映射起来。
3.具体的连接步骤如下。
(1)创建项目,导入jar包。
(2)创建主机配置文件。
<?xml version='1.0' encoding='utf-8'?>
<!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>
<!-- 1.数据库连接信息 -->
<!-- 数据库JDBC驱动类名 -->
<property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<!-- 数据库连接URL -->
<property name="connection.url">jdbc:oracle:thin:@localhost:1521:XE</property>
<!-- 数据库用户名 -->
<property name="connection.username">owner</property>
<!-- 数据库密码 -->
<property name="connection.password">123</property>
<!-- 2.hibernate相关配置 -->
<!-- 数据库方言 -->
<property name="dialect">org.hibernate.dialect.Oracle10gDialect</property>
<!-- 是否输出Hibernate生成的SQL语句,开发阶段一般需要开启 -->
<property name="show_sql">true</property>
<!-- 是否对输出SQL进行格式化 -->
<property name="format_sql">true</property>
<!-- 3.连接池配置 -->
<!-- 此处可替换成别的连接池实现,我们现在使用的是c3p0 -->
<property name="hibernate.connection.provider_class">
org.hibernate.service.jdbc.connections.internal.C3P0ConnectionProvider
</property>
<!-- 这是C3P0随时准备好的最少的JDBC连接数量 -->
<property name="hibernate.c3p0.min_size">5</property>
<!-- 连接池中JDBC连接的最大数量 -->
<property name="hibernate.c3p0.max_size">20</property>
<!-- 超时周期,在它之后,闲置连接将从池中移除 -->
<property name="hibernate.c3p0.timeout">300</property>
<!-- 最多高速缓存100个预编译语句,该属性是使Hibernate获得较好性能的要素。 -->
<property name="hibernate.c3p0.max_statements">100</property>
<!-- 连接被自动验证前,以秒为单位的闲置时间 -->
<property name="hibernate.c3p0.idle_test_period">3000</property>
<!-- 注册ORM实体类映射文件的路径-->
<mapping resource="entity/Student.hbm.xml" />
<mapping resource="entity/Book.hbm.xml" />
<mapping resource="entity/Type.hbm.xml" />
<mapping resource="entity/Record.hbm.xml" />
</session-factory>
</hibernate-configuration>
(3)配置映射文件。
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
[...]
</hibernate-mapping>
(4)在主配置文件中添加实体文件映射路径。(主配置文件为hibernate.cfg.xml)
<mapping resource=“***/***/***.hbm.xml" />
(5)连接好好,进行测试。
4.用Hibernate操作数据库的步骤。
(1)获取配置。(2)创建SessionFactory 。(3)获取Session。(4)打开事物。(5)持久化操作。对数据库表增删改查就在这一步。(6)提交事物。(7)关闭session。
5.在hibernate中,三种实体对象的状态转换。
瞬时状态(Transient)
刚用new语句创建,还没有被持久化,且不处于Session的缓存中
持久状态(Persistent)
已经被持久化,且加入到Session的缓存中
游离状态(Detached)
已经被持久化,但不再处于Session的缓存中
通过new产生瞬时状态,通过save saveOrUpdate方法转换为持久态,通过delete方法可以将对象变回瞬时态。
session关闭之后,原有的持久态就变成了游离态,游离态通过update() ,savaOrUpdate() ,lock()等方法变为 持久态。
session的get load方法可直接获得一个持久态对象。
6.关系映射。
(1)单向多对一映射(many-to-one)。many的一端应持有one的一端的对象(引用)。
在映射文件中配置如下:
<hibernate-mapping>
<class name="org.ijob.bean.Resume" table="ijob_resume">
<!—省略主键映射及属性映射 -->
<!-- 多对一关联 -->
<many-to-one name="seeker" class="org.ijob.bean.Seeker"> 1
<column name="seeker_id"></column> 2
</many-to-one>
</class>
</hibernate-mapping>
1、name为属性名,class为“one”端类名
2、 " seeker_id"外键列列名,具体情况下下相应的列名。
(2)单向一对多映射(one-to-many)。one的一端应持有many端的对象集合。
在映射文件中设置如下:
<hibernate-mapping>
<class name="org.ijob.bean.Seeker" table="ijob_seeker">
<!—省略主键映射及属性映射 -->
<set name="resumes" > 1
<key column="seeker_id"></key> 2
<one-to-many class="org.ijob.bean.Resume"/> 3
</set>
</class>
</hibernate-mapping>
1、set集合节点适用于配置一对多关联关系, name属性指定one的一端对应属性名。
2、" seeker_id"外键列列名。具体情况下下相应的列名
3、class属性指定many端的全限定类名。
(3)多对多关联。将多对多转换成两个一对多。为中间表建立实体类及映射文件,两个端点和中间端分别建立双向一对多关联。
如果中间表是联合主键,在映射文件中配置:
<!-- 联合主键 -->
<composite-id>
<key-many-to-one name=“**” column=“***" class=“***" ></key-many-to-one>
<key-many-to-one name=“**” column=“**" class=“**" ></key-many-to-one>
</composite-id>
7.Hibernate的HQL查询操作。
HQL是一种面向对象的查询语言,其中没有表和字段的概念,只有类、对象和属性的概念,它的语法与SQL很像。
在HQL中,Student是类名,不是表名,s.name 是 属性名。
上面的介绍只是基本查询,还可以设置参数查询。
(1) 定位参数:定位参数下标从0开始。
public void paramTest1(){
String hqlString="from Student s where s.name like ?";
Session session = HibernateUtil.currentSession();
Query query =session.createQuery(hqlString);
String name="a";
//定位参数
query.setString(0, "z_%"+name+"%");//参数匹配从0开始
List<Student> student=query.list();
System.out.println(student);
}
(2)命名参数:在HQL语句中," :"一定不能少了,
public void paramTest2(){
String hqlString="from Student s where s.name like :name";
Session session = HibernateUtil.currentSession();
Query query =session.createQuery(hqlString);
String name="zh%";
//按参数名字进行匹配
query.setString("name", name);
List<Student> student=query.list();
System.out.println(student);
}
还有HQL的其它用法,就不介绍了,大家可以上网查看。
8. Hibernate加载计划。Hibernate有默认的加载计划。
1.关联对象和关联集合的默认加载计划是:延迟加载,即加载主对象时它们不会被立即加载,而是直到使用这些对象和集合时才发送SQL语句、获取数据、初始化对象和集合。
2、主对象本身是否延迟加载取决于使用的是load()方法还是其它方法,load()方法是延迟的,而get()方法或其它方法是立即的。
3、主对象的属性默认是被立即加载的。