学习了Hibernate框架的基本使用之后,我初步掌握了如何在一个项目开发中使用Hibernate技术对数据库进行访问,作此笔记便于日后温习,也便于大家一起交流学习。
首先,在学习Hibernate框架的基础之后,我知道了Hibernate技术其实也是对JDBC技术的封装,因为在Java程序中,要想访问数据库,JDBC技术是唯一的途径,也就是说,java程序访问数据库,底层操作只有通过JDBC技术才能访问,其他的一些数据访问框架如Hibernate、MyBatis等都是对JDBC操作的封装。Hibernate是目前国内最流行的数据访问层框架之一,也被称为持久层框架。下面通过一个示例介绍Hibernate框架使用的基本流程:
1.首先,创建一个项目,为其引入Hibernate框架的jar包,并在主配置文件 hibernate.cfg.xml文件中进行相关配置,如:使用的数据库方言类型、访问数据库的URL、连接数据库的驱动包、用户名和密码等的配置,我的 hibernate.cfg.xml 配置如下:
<?xml version='1.0' encoding='UTF-8'?><!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hbm2ddl.auto">update</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="connection.url">jdbc:mysql://localhost:3306/201company</property>
<property name="connection.username">root</property>
<property name="connection.password">zx123456</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="myeclipse.connection.profile">MySqlCon</property>
<!-- 配置Hibernate参数,打印出Hibernate生成的sql语句 -->
<property name="show_sql">true</property>
<!-- 将生成的sql语句格式化后输出 -->
<property name="format_sql">true</property>
<mapping resource="com/jeason/entity/members.hbm.xml"/>
</session-factory>
</hibernate-configuration>
2.然后,编写实体类, 如下为实体类Members类的定义 Members.java:
package com.jeason.entity;
public class Members {
private String name; //姓名
private String number; //学号
private String location; //位置
//这里必须添加属性的get()和set()方法
..........
}
接下来,为entity(实体类)编写对应的映射描述文件,使实体类与数据表产生映射,一般与其实体类在同一个包路径下, 首先说一下Hibernate中的映射类型:
hbm.xml在描述字段和属性映射时,采用type属性指定映射类型。
映射类型的作用:主要负责实现属性和字段值之间的转化。
映射类型type有两种写法,一般推荐采用第二种写法,即指定Hibernate类型:
a.指定java类型,包名.类名,如:java.lang.String
b.指定Hibernate类型,特点是全部小写,如下:
整数: byte,short,integer, long,
浮点数:float,double
字符串:string
日期和时间:date------(只有年月日,没有时分秒)-----java.sql.Date
time------(没有年月日,只有时分秒)-----java.util.Date
timestamp---------------(有年月日,还有时分秒)
布尔类型:yes_no, true_false(转换的时候,数据库中存储的boolean值将变为char类型)
yes_no---------Y/N
true_false-----T/F
一般在设计数据库的时候会考虑到数据库的移植,尽量避免使用boolean
其他:blob,clob,big_decimal,big_integer
如下为Members实体类编写映射描述文件 members.hbm.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping>
<!-- 指定Members类与201_member表之间的映射 -->
<class name="com.jeason.entity.Members" table="201_members">
<!-- 主键映射 -->
<id name="number" type="string">
<column name="NUMBER"></column>
<!-- 指定主键的生成方式,采用序列方式生成主键 -->
<generator class="native">
指定序列名
<param name="sequence">SEQ_NAME</param>
</generator>
</id>
<!-- 非主键映射 -->
<property name="name" type="string">
<column name="NAME"></column>
</property>
<property name="location" type="string">
<column name="Location"></column>
</property>
</class>
</hibernate-mapping>
====这里介绍一下hbm.xml文件的编写,在编写hbm.xml文件时,首先要指定实体类和对应的数据表,如上述文件,然后指定主键属性和一般属性两种属性,在指定主键属性时,基本格式为: <id name="实体类中的主键属性名" type=主键属性的类型" column="在数据表中主键所对应的字段名"></id>,在该id属性内部我们可以指定主键的生成方式,Hibernate中有以下几种方式指定主键的生成方式:
a.sequence:可以按指定序列生成主键值,只适用于oracle数据库。
<generator class="sequence">
<param name="sequence">SEQ_NAME</param>
</generator>
b.identity: 按照数据库自动增长机制生成主键值, 一般适用于mySql,SqlSever数据库
<generator class="identity"></generator>
c.native: Hibernate会根据方言类型不同,选择不同的主键生成方式;如果是OracleDialect会选择sequence,如果是MySqlDialect会选择identity,可以直接在generator内部指定序列的名称
<generator class="native"></generator>
d.assigned: Hibernate会放弃主键生成,采用此方法,需要在程序中指定主键值。
<generator class="assigned"></generator>
e.increment(存在并发隐患): Hibernate会先执行select max(id) 找出当前记录中的最大值,然后自增1,之后再调用insert语句,它是种 通用型方式,支持各种数据库
<generator class="increment"></generator>
f.uuid/hilo
uuid是指按照UUID算法生成主键值-----------(字符串类型)。
Hilo指的是按照高低位算法生成一个主键值-------(数值类型)
<generator class="uuid/hilo"></generator>
在上述例子中我采用的主键生成方式是native类型。
3.在主配置文件hibernate.hbm.xml中将实体类的映射描述文件加载到主配置文件中,在主配置文件中加入以下配置:
<mapping resource="com/jeason/entity/members.hbm.xml"/>
4. 接下来,就可以使用hibernate进行简单的查询操作:
--> a.首先加载主配置文件;
--> b.然后获取SessionFactory对象;
--> c.通过SessionFactory对象获取一个session连接;
--> d.通过session对数据进行增删改查操作
如:对Members表进行查询可以如下编写:
Configuration cfg = new Configuration(); //加载主配置文件
cfg.configure();
SessionFactory sf = cfg.buildSessionFactory(); //获取SessionFactory对象
Session session = sf.openSession(); //获取session对象
Members mb = (Members)session.get(Members.class,"1308010326"); //根据主键查询
注意: Hibernate进行数据库操作时,一定要注意提交事务,因为在JDBC操作中事务提交默认是打开的,而Hibernate将自动提交事务默认关闭了,
所以在添加操作完成后一定要手动提交事务,否则执行的更新操作将不会生效 ,如下:
Session session = HibernateUtil.openSession();
Transaction tx = session.beginTransaction(); //开始执行事务
session.save(member); //执行添加操作
tx.commit(); //提交事务
session.close(); //释放session连接