文章分类:Java编程
四、Hibernate开发步骤:(重点:必须掌握)
开始:(设置环境变量和配置)
在myeclipse里导入Hibernate的文件包(包括各数据库的驱动和其他的jar包,对版本敏感,注意各版本的兼容)
按hibernate规范编写名字为hibernate.cfg.xml文件(默认放在工程文件夹下)
步骤一:设计和建立数据库表
可以用Hibernate直接生成映射表。
Oracle里建表: create table t_ad (oid number(15) primary key,
ACTNO varchar(20) not null unique,BALANCE number(20));
步骤二:持久化类的设计
POJO---- POJO 在Hibernate 语义中理解为数据库表所对应的Domain Object。(此类中只含有属性、构造方法、get/set方法)
这里的POJO就是所谓的“Plain Ordinary Java Object”,字面上来讲就是无格式普通Java 对象,
简单的可以理解为一个不包含逻辑代码的值对象(Value Object 简称VO)。
步骤三:持久化类和关系数据库的映射
编写*.hbm.xml文件---该文件配置持久化类和数据库表之间的映射关系
Xml代码
<class name=“POJO的类全路径” table=“对应的库表名” //这两项一定要配置,其它的都可以不配置 discriminator-value=“discriminator_value” //区分不同子类的值,多态时使用。默认与类名一样
dynamic-update=“true | false” //是否动态更新SQL。false:每次都更新所有属性;true:只更新修改的
dynamic-insert=“true | false” //是否动态插入SQL。false:每次都插入所有属性;true:只插入非空的
select-before-update=“true | false” //是否在update前查询对象是否被修改过,修改过才update
polymorphism=“implicit | explicit” //设置多态是显性(explicit)的还是隐性(implicit)的
where=“查询时使用的SQL的条件子句” //查询时使用的SQL的条件子句
lazy=“true | false” //设置延迟加载策略
/>
<class name=“POJO的类全路径” table=“对应的库表名” //这两项一定要配置,其它的都可以不配置 discriminator-value=“discriminator_value” //区分不同子类的值,多态时使用。默认与类名一样
dynamic-update=“true | false” //是否动态更新SQL。false:每次都更新所有属性;true:只更新修改的
dynamic-insert=“true | false” //是否动态插入SQL。false:每次都插入所有属性;true:只插入非空的
select-before-update=“true | false” //是否在update前查询对象是否被修改过,修改过才update
polymorphism=“implicit | explicit” //设置多态是显性(explicit)的还是隐性(implicit)的
where=“查询时使用的SQL的条件子句” //查询时使用的SQL的条件子句
lazy=“true | false” //设置延迟加载策略
/>
一个实体对应一个xml文件,组件用id,非组件用property。
*.hbm.xml文件样板:
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">
<!--package指文件所在的包名 -->
<hibernate-mapping package="com.tarena.ebank.biz.entity">
<!-- name:POJO类的名; table数据库里对应的表名-->
<class name="Account" table="student">
<!-- OID:(唯一,中性)表自动生成的(需要另外添加hilo表) -->
<id name="oid" column="OID">
<generator class="hilo">
<param name="table">t_hi</param>
<param name="column">hi</param>
</generator></id>
<property name="actNo" column="ACTNO" unique="true" not-null="true"/>
<property name="bal" column="BALANCE" not-null="true"/>
</class>
</hibernate-mapping>
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--package指文件所在的包名 -->
<hibernate-mapping package="com.tarena.ebank.biz.entity">
<!-- name:POJO类的名; table数据库里对应的表名-->
<class name="Account" table="student">
<!-- OID:(唯一,中性)表自动生成的(需要另外添加hilo表) -->
<id name="oid" column="OID">
<generator class="hilo">
<param name="table">t_hi</param>
<param name="column">hi</param>
</generator></id>
<property name="actNo" column="ACTNO" unique="true" not-null="true"/>
<property name="bal" column="BALANCE" not-null="true"/>
</class>
</hibernate-mapping>
步骤四:Hibernate配置文件
hibernate.cfg.xml或hibernate.properties
1.需要配置那些信息:持久化映射,方言,特性,登陆信息
多数使用默认的设置。
A、dialect:方言,就是拼驱动程序和SQL语句。每种数据库对应一种方言其实就是指定了用那一种数据库。
Oracle数据库方言:org.hibernate.dialect.OracleDialect
MySql数据库方言:org.hibernate.dialect.MySQLDialect
B、Object Persistence:对象持久化。把内存中的数据保存到一个永久的介质中,比如说数据库。
C、ORM:对象关系映射,是一个自动的过程
注:持久对象与临时对象最大的区别是有没有数据库id标识。
2.hibernate.cfg.xml的样板:
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="connection.url">jdbc:mysql://localhost:3306/test</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.username">root</property>
<property name="connection.password">password</property>
<!-- 自动建表语句:create覆盖旧表,update自动更新,none不理会 -->
<property name="hbm2ddl.auto">update</property>
<!-- 是否在控制台上打印SQL(Hibernate把语句转化为SQL语句),默认false-->
<property name="show_sql">true</property>
<!-- 缓存策略,数据量不大可不写 -->
<property name="cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
<property name="cache.use_query_cache">false</property>
<property name="cache.use_second_level_cache">false</property>
<!-- 不同数据库使用的SQL选择 -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="myeclipse.connection.profile">mysql</property>
<!-- 连接池配置,练习时不写,使用默认的 -->
<property name="connection.pool_size">1</property>
<!--决定是采用thread或jta或自定义的方式来产生session,练习时不写,使用默认的 -->
<property name="current_session_context_class">thread</property>
<!-- *.hbm.xml文件路径,各关联表要一同写上 -->
<mapping resource="many_to_one/vo/Customer.hbm.xml" />
<mapping resource="com/tarena/ebank/biz/entity/Order.hbm.xml" />
</session-factory>
</hibernate-configuration>
<?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="connection.url">jdbc:mysql://localhost:3306/test</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.username">root</property>
<property name="connection.password">password</property>
<!-- 自动建表语句:create覆盖旧表,update自动更新,none不理会 -->
<property name="hbm2ddl.auto">update</property>
<!-- 是否在控制台上打印SQL(Hibernate把语句转化为SQL语句),默认false-->
<property name="show_sql">true</property>
<!-- 缓存策略,数据量不大可不写 -->
<property name="cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
<property name="cache.use_query_cache">false</property>
<property name="cache.use_second_level_cache">false</property>
<!-- 不同数据库使用的SQL选择 -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="myeclipse.connection.profile">mysql</property>
<!-- 连接池配置,练习时不写,使用默认的 -->
<property name="connection.pool_size">1</property>
<!--决定是采用thread或jta或自定义的方式来产生session,练习时不写,使用默认的 -->
<property name="current_session_context_class">thread</property>
<!-- *.hbm.xml文件路径,各关联表要一同写上 -->
<mapping resource="many_to_one/vo/Customer.hbm.xml" />
<mapping resource="com/tarena/ebank/biz/entity/Order.hbm.xml" />
</session-factory>
</hibernate-configuration>
步骤五:使用Hibernate API
Java代码
//读取Hibernate.cfg.xml配置文件,并读到内存中为后续操作作准备
Configuration config = new Configuration().configure();
//SessionFactory缓存了生成的SQL语句和Hibernate在运行时使用的映射元数据。
SessionFactory sessionFactory = config.buildSessionFactory();
//Session是持久层操作的基础,相当于JDBC中的Connection。
Session session = sessionFactory.openSession();
try{
原子性,必须捕捉异常。所有事务都放在这一代码块里。
//操作事务时(增、删、改)必须显式的调用Transaction(默认:autoCommit=false)。
Transaction tx = session.beginTransaction();
for(int i=0; i<=1000; i++){
Student stu = new Student(...);
session.save(stu);//set value to stu
//批量更新:为防止内存不足,分成每20个一批发送过去。
if(i%20==0){session.flush();session.clear();}//不是大批量更新,则不需要写这一行
//默认时,会自动flush:查询之前、提交时。
} tx.commit();//提交事务,Hibernate不喜欢抛异常,如有需要,自己捕捉。
//查询方法。如果有必要,也可以用事务(调用Transaction)
String hql = "from Student s where s.stuNo like ? and s.Sal > ?";//Student是类而不是表
List list = session.createQuery(hql)
.setString(0, "a00_").setDouble(1, 3000.0)//设置HQL的第一二个问号取值
.list();//Hibernate里面,没有返回值的都默认返回List
StringBuffer sb = new StringBuffer();
for(Student st
List<Student>)list){//(List<Student>)强制类型转换
sb.append(st.getOid()+" "+st.getName()+"\n");//拿到Student类里的属性
}System.out.print(sb.toString());//直接打印sb也可以,它也是调用toString,但这样写效率更高
} catch (HibernateException e) {
e.printStackTrace();
session.getTransaction().rollback();//如果事务不成功,则rollback
} finally {
session.close();//注意关闭顺序,session先关,Factory最后关(因为它可以启动多个session)
sessionFactory.close();//关闭SessionFactory,虽然这里没看到它,但在HbnUtil里开启了。
}
分享到:
相关推荐
《Hibernate学习笔记特别详细》 Hibernate,作为一款开源的Object-Relational Mapping(ORM)框架,为Java开发者提供了强大的数据库操作支持。它简化了数据库访问的复杂性,使得开发人员可以像操作对象一样操作...
【Java相关课程系列笔记之十四Hibernate学习笔记】 Hibernate是一个开源的对象关系映射(ORM)框架,它极大地简化了Java应用程序对数据库的操作。本笔记将详细阐述Hibernate的核心概念、使用方法和特性。 一、...
### Hibernate 学习笔记知识点概览 #### 一、Hibernate 概述 - **定义**:Hibernate 是一款开源的对象关系映射(ORM)框架,它实现了将 Java 应用程序中的对象模型映射到关系型数据库中的记录。通过 ORM 技术,...
根据提供的信息,我们可以总结出以下关于达内HIBERNATE学习笔记的重要知识点: ### 第一章:Hibernate入门 #### 1.1 学习目标 - 理解Hibernate的基本概念。 - 掌握如何使用Hibernate进行开发。 #### 1.2 对象持久...
【hibernate学习笔记】 在Java开发中,Hibernate是一个强大的对象关系映射(ORM)框架,它极大地简化了数据库操作。以下是对Hibernate的学习要点的详细解释: 1. **建立第一个Hibernate版本的HelloWorld** - **...
### Hibernate学习笔记01 #### 一、Hibernate简介与安装 **Hibernate** 是一款开源的对象关系映射(Object Relational Mapping, ORM)框架,它能够有效地简化Java应用程序与数据库之间的交互,提供了一种更为优雅...
在深入探讨Hibernate学习笔记第二天的源码之前,我们先来理解一下Hibernate的核心概念。Hibernate是一个开源的对象关系映射(ORM)框架,它允许Java开发者将数据库操作转化为对象模型,大大简化了数据访问层的开发...
首先,创建 Hibernate 项目的步骤包括新建 Java 项目,然后设置 User Library 并加入必要的 JAR 包,例如 Hibernate 的主库 hibernate3.jar 和所有相关的 lib/*.jar,以及 MySQL JDBC 驱动。接下来,我们需要创建 ...
### hibernate框架学习笔记整理 #### 一、Hibernate框架简介 **Hibernate框架**是一种用于Java应用的**对象关系映射**(Object-Relational Mapping, ORM)解决方案,它允许开发者使用面向对象的方式操作数据库中的表...
**Hibernate学习笔记源码及文档** Hibernate 是一款强大的Java持久化框架,它简化了数据库操作,使得开发者可以更专注于业务逻辑而不是数据库交互。本资源包含了Hibernate的学习笔记、源码分析以及开发流程说明文档...
### hibernate-note学习笔记知识点详解 #### 一、对象持久化 **1.1 概述** 对象持久化是指将程序中的对象状态保存到非易失性存储中(如硬盘或磁盘等),以便在系统重启后仍能保留这些状态。这种技术常用于将对象的...
【Java相关课程系列笔记之十四Hibernate学习笔记】 Hibernate是一个开源的对象关系映射(ORM)框架,主要用于简化Java应用程序对数据库的访问。它提供了一种在Java对象和数据库记录之间进行映射的机制,使得开发者...