day1
一. hibernate数据持久化组件
对象持久化:把数据保存在永久的存储介质中(数据库)
1.为什么要持久化:
a.内存是暂时存储设备,断电后数据易丢失
b.网络传输易丢失数据
c.内存中数据查询,组织不方便
d.内存数据存储量少
2.怎样持久化
a.对象序列化 --> 二进制流
合并存储,粒度大,无规律
不支持检索
只适合少数个别对象的序列化
b.用JDBC/EJB/ORM 将数据存入数据库
用JDBC:(Java DB Connection)
优点:底层开发,控制力强(细); 效率最高; 标准的(SQL)JDBC,有可移植性
缺点:过于复杂; 代码量大; 可维护性差(代码重用性低);
用EJB:(Entity Java Bean)
优点:直接自动生长JDBC代码; 持久对象(PO)的状态由服务器管理; 声明式的事务
缺点:功能不全(特殊的组件,不能做继承关系); EJB容器是侵入性容器,失去OO的优点; 调试更复杂
用ORM:(object relation mapping)对象关系映射
优点:自动生成JDBC(代码量下降); 使用(plain oldest java object---pojo),非侵入型; 提供状态管理; 难度下降,不需要容器
缺点:由于开源, 文档少; bug多; 技术支持差
结论: 用java开发-->须将数据持久化-->须用数据库-->须用ORM-->需要用Hibernate
二. Hibernate
1.POJO类
plain oldest java object,就是标准的Java Bean。
2.Hibernate
Hibernate -->一个可以自动的根据xml完成对象关系映射,并持久化到数据库的开源组件。其底层也是由JDBC实现的。
hibernate是通过xml文件的配置,对数据库的底层的方言,以及数据库连接所需的信息,以及连接数据库的驱动。
hibernate的系统配置文件
hibernate.cfg.xml -->与数据库建立连接(一般放在项目的根目录下)
XXXX.hbm.xml -->用来建立类与表之间的映射关系(一般将映射类的xml文件和实体类放在一起)
3.Hibernate API
Configuragion 读配置文件(默认名:hibernate.cfg.xml) (org.hibernate.cfg.Configuration)
生成SessionFactory
SessionFactory 重量级的对象, 线程安全 (org.hibernate.SessionFactory)
生成Session
Session 相当于JDBC中的Connection (org.hibernate.Session)
轻量级的对象,线程不安全(原则上一个线程一个Session,不要放在并发的环境中)
生成Transaction
Transaction 管理事务的对象 (org.hibernate.Transaction)
Query 查询对象,提供面向对象的查询语言(HQL)
4.使用hibernate编程步骤
1,配置环境,加载hibernate的jar文件,以及连接数据库连接使用的jar文件,并配置CLASSPATH环境变量。
2,写hibernate所需的配置文件,hibernate.cfg.xml ,Xxxxx.hbm.xml
3,写POJO类
4,调用hibernate API。
1)使用Configuration对象的buildSessionFactory()方法创建SessionFactory对象
2)使用SessionFactory对象openSession()方法创建Session对象。
3)使用Session的相应方法来操作数据库,将对象信息持久化到数据库。
5. HQL语句
Query q = s.createQuery("from Account where actNo=:actNo");
//from 类名 where 属性名=:shuxingming
q.setLong("actNo",12345);//设置属性名,并赋值
q.uniqueResult()//获得匹配HQL的唯一属性
附: 1.环境配置:
a. 类库
*** 导入hibernate 库文件 ***
1、在eclipse中建立一个java工程,如:hbn
2、在工程hbn的属性--Build Path中选择Add Libraries
3、在Add Libraries窗口中选择User Library点next按钮
4、在User Library窗口中点User Libraries ...按钮
5、在User Libraries窗口中,点new按钮
6、在New user library窗口中,填写一个User
libary name(如:hbnlib,注意不要选择System
libary 复选框),点OK按钮回到User Liberies窗口
7、在User Liberaries窗口中选择刚刚创建的
hbnlib,点Add jars按钮
8、在打开的文件选择窗口中找到解压好的
hibernate的库文件,全部选中,点"打开"
按钮,返回User Libraries窗口
9、在User Libraries窗口中点OK按钮,返回
User Library 窗口;再点Finish按钮,结束操作
b. 驱动
c. 映射文件/配置文件 的模板
d. Eclips导入2个DTD文件
*** 导入hibernate 库文件 ***
1、在eclipse中建立一个java工程,如:hbn
2、在工程hbn的属性--Build Path中选择Add Libraries
3、在Add Libraries窗口中选择User Library点next按钮
4、在User Library窗口中点User Libraries ...按钮
5、在User Libraries窗口中,点new按钮
6、在New user library窗口中,填写一个User
libary name(如:hbnlib,注意不要选择System
libary 复选框),点OK按钮回到User Liberies窗口
7、在User Liberaries窗口中选择刚刚创建的
hbnlib,点Add jars按钮
8、在打开的文件选择窗口中找到解压好的
hibernate的库文件,全部选中,点"打开"
按钮,返回User Libraries窗口
9、在User Libraries窗口中点OK按钮,返回
User Library 窗口;再点Finish按钮,结束操作
2. hibernate.cfg.xml的写法
<?xml version="1.0"?>
<!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="show_sql">true</property><!--显示sql语句-->
<property name="format_sql">true</property><!--使显示的sql语句格式化-->
<property name="hbm2ddl.auto">create</property><!--如果原表存在则先删原表再创新表-->
<property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<property name="connection.url">jdbc:oracle:thin:@10.10.3.237:1521:tarena</property>
<property name="connection.username">openlab</property>
<property name="connection.password">open123</property>
<property name="connection.isolation">2</property><!-- 设置事务隔离级别(2表示避免脏读) -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property><!-- 使用的数据库方言信息 -->
<mapping resource="com/yinglinhai/biz/entity/Account.hbn.xml"/><!-- 映射文件的位置,和实体类放在同一目录 -->
</session-factory>
</hibernate-configuration>
3. hibernate的映射类的XXXX.hbm.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">
<!-- 建立类于数据库中表的映射关系 -->
<hibernate-mapping package="com.yinglinhai.biz.entity"><!--映射类所在的包-->
<!-- 类名和表名的映射 -->
<class name="Account" table="yinglh_account">
<!-- 属性和字段的映射 -->
<id name="aid" column="aid"><!--主键生成策略-->
<generator class="hilo"><!-- 高低位计算 -->
<param name="table">yinglh_hilo</param>
<param name="column">hi</param>
</generator>
</id>
<property name="actNo" column="actNo"></property>
<property name="balance" column="balance"></property>
<!--在hibernate中其他类型可以自动识别只有Data类型必须指名-->
</class>
</hibernate-mapping>
4. 创建数据库表结构:
create yinglh_account(
aid number(20) primary key,
actNo varchar(50) not null unique,
balance number(12,2) not null);
create t_hilo(hi number(20));
insert into t_hilo values(1);//必须事先插入一条记录到表中
5. 调用hibernate API
public class Test {
public static void main(String[] args) {
Account act = null;
//step1: 创建Configration对象
Configuration config = new Configuration().configure();
//step2: 获取SessionFactorye
SessionFactory sf = config.buildSessionFactory();
//step3:获取Session和Transaction,进行持久化操作
Session s = null;
Transaction tran = null;
try {
s = sf.openSession();
tran = s.beginTransaction();//启动事务
act = new Account(12345, 2000.00);
s.save(act);//将帐户对象持久化
tran.commit();//提交事务
} catch (Exception e) {
if(tran != null)
tran.rollback();
e.printStackTrace();
} finally{
if(s!=null) s.close();
}
}
}
6.Util工具类:
public class HbnUtilV1 {
private static SessionFactory sf;
static{
Configuration config = null;
try {
config = new Configuration().configure();
sf = config.buildSessionFactory();
} catch (Exception e) {
e.printStackTrace();
}
}
public static Session getSession(){
Session s = null;
if(sf!=null)
s = sf.openSession();