Hibernate的配置以及操作
1.1持久化,DAO与ORM
DAO与ORM三个概念,以及它们之间的关系。
1.1.1 持久化
数据在计算机中有两种状态:
瞬时状态:保存在内存的程序数据,程序退出后,数据就消失了,称为瞬时状态
持久状态:保存在磁盘上的程序数据,程序退出后依然存在,称为程序数据的持久状态。持久化的数据保存在各种文件中,这些文件有不同的后缀,表示不同的类型,这些不同后缀的文件,需要不同的软件读取它。
持久化:将程序数据在瞬时状态和持久状态之间相互转换的机制
现在的项目大多数使用构架,即:表示层,业务逻辑层(服务层),持久化层。这里的持久化层就是持久化的意思。
1.1.2 DAO
DAO的全称为Data Access Object(数据访问对象)。
DAO与持久化的关系是:DAO一种程序数据访问层(持久化层)的设计思想。
现在我们做的项目,数据源都为数据库,也就是说我们把数据都保存在数据库软件中。但有时候我们需要把数据保存在其它类型数据源中,如保存在一个xml文件中,或者保存在一个txt文件中。即便是保存在数据库中,我们访问的方式也有很多种,如全部使用Statement对象来完操作,或者全部使用PreparStatement来完成。并且项目需要在多种数据源之间切换,DAO模式就可以很好的解决这个问题。
DAO 工厂类 (暂时不使用,使用工厂设计模式)
DAO接口(一个)
实现了DAO接口的具体类 ,根据数据源或者数据访问方式的不同有一个或多个
数据传输对象(DTO),数据对象(VO),实体类,POJO。第一个:实现Serializable接口;第二,添加equals方法。
DAO接口中声明常用的保存查询等方法,这样利用面向接口编程,业务逻辑层声明接口,提高程序的可扩展性。
现在我们开发应用程序主要的数据源是数据库,但它还有可能是如XML文件,文本文件等这样的系统,不同的数据源存在不同的访问方式,即便是相同的数据源也存在不同的访问方式。DAO实现类针对不同的数据源编写不同的实现(Impl),即便是相同的数据源,针对不同的访问方式也可以编写不同的实现。
DAO工厂类根据不同的数据源与访问特性生产对应的DAO产品,供业务逻辑类使用。
值对象就是一个实体类,封装一条数据。
1.1.3 ORM
ORM的全称为Object-Relational Mapping(对象关系映射)。
ORM与DAO的关系是:ORM是DAO接口针对关系型数据库的一种实现,本质上就是一个DAO实现类。
现在我们开发的项目数据源大多为关系数据库,而在应用程序中表示数据的为某个实体类对象;利用程序我们把一个实体类的数据转化为关系型数据库表中的一行数据,或者把关系型数据库表中的一行数据转化为应用程序中的一个实体类,我们把:
“完成应用程序对象数据到关系型数据映射的机制称为对象-关系映射”
1.1 cfg 文件的后缀为*.cfg.xml
Eclispe测试和数据库的连接:Date source Explorer ----> Database Connections
hibernate配置文件, 文件中主要存放了
-
数据的url地址
-
数据库用户信息
-
缓存
-
mapping文件的配置路径
<session-factory >
<property name="connection.url">jdbc:oracle:thin:@192.168.8.62:1521:orcl</property>
<property name="connection.username">wangyajie</property>
<property name="connection.password">wangyajie</property>
<property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<property name="dialect">org.hibernate.dialect.Oracle10gDialect</property>
<property name="show_sql">true</property>
</session-factory>
还有更多配置在/hibernate-release-4.3.5.Final/project/etc/hibernate.properties.template
1.2 mapping 文件的后缀为*.hbm.xml
<hibernate-mapping>
<class name="cn.jbit.entity.User" table="users">
<id name="id"type="java.lang.Integer">
<column name="id" />
<generator class="sequence" >
<param name="sequence">SEQ_ID</param>
</generator>
</id>
<property name="name" type="java.lang.String">
<column name="name" length="50" not-null="true" />
</property>
<property name="password" type="java.lang.String">
<column name="password" length="50" not-null="true" />
</property>
<!--省略其他配置-->
</class>
</hibernate-mapping>
-
class元素:定义一个实体类的映射信息。
常用属性如下。
-
name表示对象实体类的全限定名。
-
table表示对应的数据库表名。
-
id元素:定义该属性到数据库表主键字段的映射。
常用属性如下。
-
name表示实体类属性的名字。
-
type表示实体类属性的类型。
-
column 表示数据库表字段的名字,也可在子元素column中指定。
-
generator 元素:id元素的子元素用于指定主键的生成策略。
常用属性及子元素如下。
-
class用来指定具体主键生成策略。
-
param元素用来传递参数。
-
常用主键的生成策略如下
-
increment:对类型为long、short 或int 的主键,以自动增长的方式生成主键的值。主键按数值顺序递增,增量为1。
-
identity:对如SQL Server、DB2、MySQL等支持标识列的数据库,可使用该主键生成策略生成自动增长主键,但要在数据库中将该主键设置为标识列。
-
sequence:对如Oracle、DB2等支持序列的数据库,可使用该主键生成策略生成自动增长主键,通过子元素param传入数据库中序列的名称。
-
native:由Hibernate 根据底层数据库自行判断采用何种主键生成策略,意思是由使用的数据库生成主键的值。
-
assigned:主键由应用程序负责生成,无需Hibernate参与。
-
property 元素:定义实体类中属性和数据库中表的字段的对应关系。
常用属性如下。
-
name表示实体类属性的名字。
-
type表示实体类属性的类型。
-
column 表示数据库表字段的名字,也可在子元素column中指定。
-
column 元素:用于指定其父元素代表的实体类属性所对应的数据库表中的字段。
常用属性如下。
-
name表示字段的名字。
-
length表示字段长度。
-
not-null设定是否可以为null,值为true 表示不能为null。
hibernate操作
2.1操作步骤
1.读取并解析配置文件
// Configuration cfg =new
//Configuration().configure(TestUser.class.getClassLoader().getResource("cn/jbit/hibernate/t4/hibernate.cfg.xml"));
Configuration cfg = new Configuration();
Properties p = new Properties();
p.load(TestUser.class.getClassLoader().getResourceAsStream("cn/jbit/hibernate/t4/hibernate.properties"));
cfg.addProperties(p);
Configuration cfg=new Configuration().configure();
2. 读取解析映射信息,创建sessionFactory
cfg.addClass(User.class);
SessionFactory factory =cfg.buildSessionFactory();
3.打开session
Session session =factory.openSession();
4.开始一个事务
session.beginTransaction();
6.提交事务
session.getTransaction().commit();
7.关闭session
session.close();
factory.close();
jb