**
java框架开发技术—搭建Hibernate项目
**
1. 了解ORM**
ORM:Object Relational Mapping,对象关系映射。 对象:是存在内存中。 关系:数据库关系表。 该产品是为了解决内存中的对象和数据库中的表在存储结构上的匹配问题。 通过使用描述对象和数据库之间的映射元数据,将 java 程序中的对象自动持久 化到数据库中,反过来将数据库中的数据自动读取到对象的内存当中。在 ORM 产品中主要是用元数据进行匹配,元数据主要使用 XML 或注解(Annotation) 的形式进行配置。
ORM 产品的优点
① 减少一些乏味的代码;
② 更加的面向对象的设计;
③ 更好的性能;
④ 更好的移植性。
Hibernate的优点
Hibernate对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。
Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现,它很大程度的简化了dao层编码工作。
2.搭建Hibernate项目
2.1 新建javaweb工程
2.2 导入相关jar包
Hibernate所需jar包
数据库连接所需jar包
2.3 新建并配置Hibernate的主配置文件hibernate.cfg.xml
配置数据库连接信息(Driver 、url、username、password等)
配置vo类的映射文件(元数据)
<?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="dialect">
org.hibernate.dialect.Oracle9Dialect
</property>
<property name="connection.url">
jdbc:oracle:thin:@localhost:1521:orcl
</property>
<property name="connection.username">scott</property>
<property name="connection.password">RootRoot123</property>
<property name="connection.driver_class">
oracle.jdbc.driver.OracleDriver
</property>
<!-- 配置在控制台进行sql语句的打印 -->
<property name="show_sql">true</property>
<!-- 配置是否自动生成数据库表
create:每次执行都会创建新表,如果表存在,删除原来的表结构
update:每次执行都回去更新数据库中的表,如果表不存在,则会进行创建
none:不进行数据库表的创建和更新
-->
<property name="hbm2ddl.auto">update</property>
<!-- 添加类映射文件 -->
<mapping resource="com/xixw/vo/UserVo.hbm.xml"/>
</session-factory>
</hibernate-configuration>
新建一个Vo类:UserVo.java
public class UserVo {
private int id;
private String userName;
private String password;
private String email;
....get/set方法省略
}
配置Vo类对应的映射文件:UserVo.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>
<!-- 映射表和类
name:指定类的完全限定名
table:指定映射的表名
-->
<class name="com.xixw.UserVo" table="user_t">
<!-- 映射主键
name:类中主键的属性名
column:表中主键的字段名,如果该名称和类中的属性名一致则可以省略
-->
<id name="id" column="id">
<!-- 配置主键生成策略
increment:参用mysql中的自增长的功能生成主键(oracle不能使用)
sequence:参用oracle序列生成主键(mysql不能使用)。
-->
<generator class="increment"></generator>
</id>
<!-- 映射字段和属性 -->
<property name="name" column="name"></property>
<property name="password"></property>
<property name="email"></property>
</class>
</hibernate-mapping>
注意
① 用class指定类和数据库关系表的映射关系
② 通过id配置主键,设置主键的生成策略
③ 通过property配置vo类中属性和数据库表中字段的映射关系
④ 当Vo类中的属性和数据库表的字段名称相同时,可以省略列column字段的配置。
测试
(1)Hibernate操作所涉及到的类和接口
操作 | 说明 |
---|---|
Session(接口) | 负责持久化对象的增删查改操作,该对象是非线程安全的 |
SessionFactory(接口) | 用来负责初始化Hibernate,并且用来产生session对象。SessionFactory是重量级的对象,一般情况下一个数据库只需要一个factory对象,如果操作多个数据库,也可以为每一个数据库制定一个 |
Configuration(类) | 用来配置和启动Hibernate,并且创建SessionFactory对象。在hibernate启动的过程当中,Configuration类要定位主配置文件的位置,并且读取主配置文件,主配置文件一般使用默认的,不然在读取配置文件的时候要手动去指定 |
Transaction(接口) | 主要负责Hibernate中的一些事务的处理 |
Query和Criteria(接口) | 主要用来负责Hibernate中一些高级查询 |
(2)测试的步骤
① 创建Configuration对象(new Configuration())
② 加载主配置文件信息通过configure()方法
③ 获取session工厂
④ 获取session对象
⑤ 开启事务操作
⑥ 通过session对象进行数据库操作
⑦ 提交事务
⑧ 关闭session对象
注意:当进行数据库操作,插入、更新、删除操作必须要放在事务中进行,查询可以不放在事务中。
测试代码如下
public static void main(String[] args) {
//1.创建一个Configuration
Configuration cfg=new Configuration();
//2.加载配置文件
cfg.configure();
//3.获取一个SessionFactory工厂对象
SessionFactory factory=cfg.buildSessionFactory();
//4.获取session对象
Session session=factory.openSession();
//5.开启事务操作
Transaction tr=session.beginTransaction();
UserVo user=new UserVo();
user.setName("小军1");
user.setPassword("222222");
user.setEmail("123@qq.com");
//6.通过session对象进行数据库操作
int id=(Integer) session.save(user);
System.out.println(id);
/**
* get():调用get方法后会立即执行sql语句进行查询,没有懒加载机制
* load():调用了load()方法以后如果不使用该对象,不会进行数据库的sql语句查询,只有在使用的时候才会进行数据库的查询,有懒加载机制
*/
//UserVo user=(UserVo) session.load(UserVo.class, 3);
//session.delete(user);
//7.提交事务
tr.commit();
//UserVo user=(UserVo) session.get(UserVo.class, 1);
//System.out.println(user.getName());
//8.关闭session
System.out.println(user.getName());
session.close();
}
//hibernate4.0以后的SessionFactory的获取方式
configuration = new Configuration().configure();
//业务注册的对象
serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
sessionFactory =configuration.buildSessionFactory(serviceRegistry);
下一篇介绍:Hibernate高级查询