一、hibernate配置文件学习
Hibernate配置文件主要用于配置数据库连接和Hibernate运行时所需的各种特性。
在之前的配置中,我们需要在src目录下添加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">scott</property>
<property name="hibernate.connection.password">tiger</property>
<!-- 数据库链接字符串 -->
<property name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>
<!-- 数据库语句是否打印 -->
<property name="show_sql">true</property>
<!-- 会话上下文 线程绑定模式-->
<property name="current_session_context_class">thread</property>
<!-- 实体对象映射 -->
<mapping resource="com/it/hibernate/entity/Person.hbm.xml"/>
</session-factory>
</hibernate-configuration>
1.会话上下文current_session_context_class
共有三种模式:jta|thread|managed三种默认为jta。
第一步:先加入配置语句:
<property name="current_session_context_class">thread</property>
第二步:改变获取session的方法:
public static Session getSession(){
//线程绑定模式
return sessionFactory.getCurrentSession();
}
第三部:在对数据库的增删改查必须都在事物中:
public boolean addPerson(Person person){
Session session = HibernateUtil.getSession();
Transaction tran = session.beginTransaction();
int result = (int) session.save(person);
boolean flag = false;
if(result>0){
flag = true;
tran.commit();
}
//当采用线程绑定模式,当事务提交后自动关闭session
//session.close();
return flag;
}
public Person qeuryPerson(int pid){
Session session = HibernateUtil.getSession();
//线程绑定模式需要在事物
Transaction tran = session.beginTransaction();
Person person = (Person) session.get(Person.class, pid);
return person;
}
当使用ssh框架时,会将事物交由spring管理,一般使用thread模式。
2.事物管理 hibernat.transaction.factory.class
有两种jdbc|jta
暂时使用到这两种,后面再做增加
二、load与get区别
load() 称为懒加载,延迟加载,用到再进行加载。
get() 则是直接加载直接加载。
三、save与saveOrUpdate区别
save() 只进行存储操作
saveOrUpdate() 有更新则更新无更新则存储
四、实体映射的配置
例: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.it.hibernate.entity">
<!--class中name为java类的名称 ,table则为数据库中的表名 -->
<class name="Person" table="person">
<!--id为主键 type为主键类型 colum为字段名 -->
<id name="pid" type="int" column="pid">
<!-- 为id添加唯一标示 hibernate中部分生成器-->
<generator class="sequence">
<!-- 在oracle中使用序列生产自增id 此序列名为数据库中已建立的序列名-->
<param name="sequence">seq_person</param>
</generator>
</id>
<property name="pname" type="string" />
<property name="pwd" type="string"></property>
</class>
</hibernate-mapping>
这里将数据库表与java对象映射,标准是以java为核心。
generator标签中hibernate内置了一些生成器:
increment:用于为long,short,int生成唯一标识
identity:对db2,mysql,sql server的内置标识字段提供支持。
native:根据底层数据库的能力选择identity,sequence中的一个。
assigned:让应用程序在save()之前为对象分配一个标识符。
sequence:适用于orcle。
五、持久化类的状态
持久化类通常是域模型中的实体域类,并且符合javabean的标准。
hibernate运用的是java反射的思想。
1.瞬时-transient
由new操作创建,且尚未于hibernate session关联的对象就是瞬时的。
注意如果没有对瞬时对象进行使用,他将会被垃圾回收器销毁。
2.持久-persistent
持久的实例在数据库中由对应的记录,并拥有一个持久化标识。
它可能是刚被保存的,或刚被加载的,他都在仅在相关联的session生命周期内保持这种状态。
3.脱管
与持久对象关联的session被关闭后,对象就是脱管的。他可以被重新关联到session中。
六、数据库级分页
1.oracle数据库分页
select * from (select a.*,rownum rc from 表名 where rownum<=endrow) a where a.rc>=startrow
2.SQL Server 2005数据库分页
Select * from (select 列名,row_number() over(order by 列名1) as 别名from 表名) as t where t.列名1>=startrow and t.列名1<=endrow
3.MySQL数据库分页
Select * from 表名 limit startrow,pagesize
(Pagesize为每页显示的记录条数)