hibernate框架如何在项目中运用
- 针对一个项目,如果要使用hibernate框架来对数据库进行操作;我们应该按如下步骤开始操作:
1.建立hibernate框架,首先我们应该导入一些我们项目中所需要的架包,本次示例用到如下架包,也是所有项目基本都会用到的架包:
简单的给大家介绍一下这些架包的具体作用:
antlr-2.7.6.jar:语言转换工具,hibernate利用它将HQL语句转变成SQL语句
commons-collections-3.1.jar:用来增强java对集合的处理能力
dom4j-1.6.1.jar: xml文件解析器
javassist-3.9.0.GA.jar: hibernate在运行时用它来扩展java类
jta-1.1.jar:标准的java事务处理接口(跨数据库)
slf4j: Hibernate使用的一个日志系统
2.根据项目的详细设计说明书,在oracle或者mysql数据库中建立连接对象,然后根据账户和密码登录连接对象,在连接对象中创建自己项目所对应的数据库名称(后面事例以test为例),然后在test数据库中创建项目所需要的表:
eg: CREATE TABLE `person` (
`ID` int(11) NOT NULL,
`NAME` varchar(20) NOT NULL,
`AGE` int(11) NOT NULL,
`ADDRESS` varchar(100) NOT NULL,
PRIMARY KEY (`ID`)
)
3.数据库中创建好表以后,然后在项目中创建pojo包,在包中创建表的映射类,如果有很多的表,就创建很多的类,类名和表名一致;然后根据表中的列的名称和属性在映射类中创建属性,形成一一对应的关系:
public class Person {
private int id;
private String name;
private int age;
private String address;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", age=" + age
+ ", address=" + address + "]";
}
}
4.表的映射类创建好以后,开始配置映射文件,映射文件的扩展名一般为.hbm.xml的形式,文件名的前缀一般和表名保持一致,该文件放在classPath目录下的任意位置。在实际项目开发过程中,我们一般单独建一个存放映射文件的包,以方便管理。映射文件是为了指定对象和关系数据表之间的映射,在运行时,Hibernate将根据这个映射文件来生成各种sql语句。
<?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">
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
<!-- 指定类和表的映射,name属性下面写的是实体类的地址全称,table属性下面写的是表名 -->
<class name="com.etc.cfg.Person" table="PERSON">
<!-- 指定持久化类的对象标识符和表的主键的映射 -->
<id name="id" column="ID" type="integer">
<!-- 指定对象标识符生成器,负责为对象标识符生成唯一的标识符。increment 表示自增 -->
<generator class="increment"></generator>
</id>
<!-- 属性。映射类的属性和表的字段 -->
<property name="name" column="NAME" type="string"></property>
<property name="age" column="AGE" type="integer"></property>
<property name="address" column="ADDRESS" type="string"></property>
</class>
</hibernate-mapping>
5.映射文件配置好以后,开始配置hibernate的主配置文件。主配置文件里面配置hibernate的初始化信息,这个文件在classPath的任意目录下;一般命名为: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">
<!-- Generated by MyEclipse Hibernate Tools. -->
<hibernate-configuration>
<session-factory>
<!-- 属性:配置数据库的驱动类 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- <property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property> -->
<!-- 属性:配置数据库的url地址 -->
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test</property>
<!-- <property name="hibernate.connection.url">jdbc:oracle:thin@localhost:1521:orcl</property> -->
<!-- 属性:配置连接连接对象的时候需要登录的用户名和密码 -->
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">111111</property>
<!-- 属性:配置数据库的sql方言 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- <property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property> -->
<!-- 属性:是否在控制台打印输出hibernate为我们自动拼接好的sql语句 -->
<property name="hibernate.show_sql">true</property>
<!-- 映射:指定程序需要关联的映射文件 -->
<mapping resource="com/etc/cfg/Person.hbm.xml"/>
</session-factory>
</hibernate-configuration>
6.创建一个单例模式获取SessionFactory的工具类,它的作用是专门给调用者生产Session对象。在实际项目开发中,SessionFactory类放在一个连接池类中,SessionFactory生产出来的Session对象我们一般都是放在一个线程安全的threadLocal线程中,threadLocal一般是希望将某一个状态和线程相关联,hibernate主要也是事务管理,所以放在这里很合适,性能比thread更优秀。但是不管是在单个的Util工具类还是连接池这种对数据库访问量减少的更高级编程中,它的原理都是第一步先要加载配置文件,在实际项目的连接池中我们把文件读取这一块放在一个静态块中,这样就可以在类刚被加载的时候就读取配置文件。
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
/**
* 单例模式获取SessionFactory的工具类
* @author 莫小忆
*/
public class SessionFactoryUtil {
private static SessionFactory sessionFactory;
private SessionFactoryUtil() {
}
public static SessionFactory getSessionFactory(){
if(sessionFactory == null){
//初始化配置文件读取对象
Configuration config = new Configuration();
//设定读取的主配置文件路径
config.configure("/hibernate.cfg.xml");
//config.addClass(Person.class);
//创建一个session工厂
sessionFactory = config.buildSessionFactory();
}
return sessionFactory;
}
}
7.创建好SessionFactory的作用就是以后业务需求中谁要对数据库进行增删改查,就自己去向SessionFactory索要Session对象。由Session对象负责对数据库进行增删改查。在实际的项目开发中,我们一般都是按照表名创建类,在类里面专门编写业务需求,来实现所有对这个表进行操作的hql语言,也就是业务逻辑类,这是一个开发项目中80%的工作量。
/**
* 保存用户信息
*/
@org.junit.Test
public void insertPerson(){
SessionFactory sessionFactory = SessionFactoryUtil.getSessionFactory();
//创建session对象
Session session = sessionFactory.openSession();
//开启事务
Transaction ts = session.beginTransaction();
Person ps = new Person();
ps.setName("张三");
ps.setAge(20);
ps.setAddress("北京");
//将用户信息保存早数据库
session.save(ps);
//提交事务
ts.commit();
//关闭session对象,释放资源
session.close();
}
/**
* 根据id获取用户
*/
@org.junit.Test
public void findPersonById(){
SessionFactory sessionFactory = SessionFactoryUtil.getSessionFactory();
//创建session对象
Session session = sessionFactory.openSession();
//根据id获取对象
Person person = (Person) session.get(Person.class, 1);
System.out.println(person.getName());
//关闭session对象,释放资源
session.close();
}
/**
* 查询全部用户
*/
@org.junit.Test
public void findPersons(){
SessionFactory sessionFactory = SessionFactoryUtil.getSessionFactory();
//获取session对象
Session session = sessionFactory.openSession();
//获取查询对象
String hql = "from Person";
Query query = session.createQuery(hql);
List list = query.list();
//使用查询对象返回集合,集合中封装hql中查询的类的实例化对象
for(int i=0;i<list.size();i++){
Person person = (Person) list.get(i);
System.out.println(person.getName());
}
//关闭session对象,释放资源
session.close();
}
/**
* 修改用户信息
*/
@org.junit.Test
public void updatePersonById(){
SessionFactory sessionFactory = SessionFactoryUtil.getSessionFactory();
//获得session对象
Session session = sessionFactory.openSession();
//开启事务
Transaction ts = session.beginTransaction();
//根据id获取对象
Person person = (Person) session.get(Person.class, 1);
person.setName("Tom");
person.setAge(25);
//修改数据
session.update(person);
//提交事务
ts.commit();
//关闭session对象,释放资源
session.close();
}
/**
* 删除用户信息
*/
@org.junit.Test
public void deletePerson(){
SessionFactory sessionFactory = SessionFactoryUtil.getSessionFactory();
//获取session对象
Session session = sessionFactory.openSession();
//开启事务
Transaction ts = session.beginTransaction();
//根据id获取对象
Person person = new Person();
//设定id,hibernate会根据id删除数据
person.setId(1);
session.delete(person);
//提交事务
ts.commit();
//关闭session对象,释放资源
session.close();
}
8.hibernate所做的工作基本就到此为止了。所有用户需要的数据都被session缓存起来了,jsp需要数据的时候,通过session 取得,然后封装到bean对象里面,就可以在整个项目中流传了。
结论:
不管学习什么知识,其实最重要的还是要运用到实际开发当中,我们应该对知识深入浅出,当你真正理解了以后,就会发现,其实我们所用的东西,实际开发中只用到很少很少的一部分,没有想象中那么难。大家要有信心。