Hibernate学习笔记(1)
来源:互联网 发布:桌面便签数据恢复 编辑:程序博客网 时间:2024/05/04 19:12
这个假期准备把hibernate学会,学习这个hibernate的动机就是觉得自己在开发项目的时候,数据库操作方面的代码效率不高,只是使用了简单的JDBC操作数据库,没有数据库连接池或者缓存之类的机制,所以准备学习hibernate,填补这方面的缺陷。
写这篇博客的目的是总结学习hibernate的每个阶段,一方面可以加深对知识的理解,另一方面可以供自己以后查阅。
1. Hibernate是什么
- hibernate是一个框架(framework)
- hibernate是一个ORM(Object Relation Mapping,关系对象映射)框架
- hibernate处于项目的持久层位置
- hibernate实际上就是对JDBC进行了轻量级的封装
2. Hibernate的基础是java的反射机制
3. 需要重点学习的三个方面:
①hibernate api
②hibernate.cfg.xml hibernate核心配置文件
③对象关系映射文件
4. Hibernate可以应用在J2SE项目中,也可以用在J2EE项目中。Struts是web框架,所以只能用在web项目中。
5. 对象持久化:把对象保存在数据库中或者文件中。
6. 手动配置Hibernate,完成CRUD操作
①在MyEclipse中创建一个java项目
②画出一个简单项目框架示意图
③引入hibernate开发包
④开发hibernate项目有三种方式
a) 由Domain object -> mapping -> db (官方推荐)
b) 由db开始。用工具生成mapping和domain object (使用较多)
c) 由映射文件开始
7. 我们使用第二种开发方式
1) 创建employee表(oracle数据库)
create table employee(id number primary key,name varchar2(64) not null,email varchar2(64) not null,hiredate date not null)2) 开发domain对象和对象关系映射文件
关于POJO:实际上就是JavaBean,一个POJO类应当具有:
① 有一个主键属性,用于唯一标识该对象
② 有其他属性
③有对各个属性操作的get/set方法
④属性一般是private修饰
⑤一定有一个无参的构造函数(用于hibernate框架放射用)
⑥pojo对象需要序列化
POJO类一般放在com.xxx.domain包下
对象关系映射文件:作用是指定domain对象和表的映射关系,命名规则:domain对象.hbm.xml,一般放在和domain对象同一个文件夹(包)下。
3) 创建一个序列,用于主键生成策略
create sequence emp_seqstart with 1increment by 1minvalue 1nomaxvaluenocyclenocache
4) 配置文件Employee.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 package="com.hh.domain"><!-- class中,table代表数据库中的表,name表示所映射的java类的类名 --><class name="Employee" table="employee"><!-- id元素用于指定主键属性.name=id表示Employee中表示的主键,column表示对一个的表中的主键 --><id name="id" column="id" type="java.lang.Integer"><!-- generator用于指定主键值生成策略 --><generator class="sequence"><param name="sequence">emp_seq</param></generator></id><!-- 对其它属性进行配置 --><property name="name" type="java.lang.String"><!-- column中的name值对应的是数据表中的字段的名字,not-null=false表示不允许为空 --><column name="name" not-null="false"></column></property><property name="email" type="java.lang.String"><column name="email" not-null="false"></column></property><property name="hiredate" type="java.util.Date"><column name="hiredate" not-null="false"></column></property></class></hibernate-mapping>
5) 手动配置hibernate.cfg.xml文件,该文件用于配置连接的数据库类型、driver、用户名、密码、URL等等,同时管理对象关系映射文件。hibernate.cfg.xml这个文件的文件名一般不修改。
6) 在hibernate中,几个比较重要的类和接口
①Configuration
②SessionFactory
③Session
④Transaction
7) 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><!-- hibernate 设计者给我们提供了一些常用的配置可在etc文件夹下找到 --><property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property><property name="connection.username">csr</property><property name="connection.password">***</property><property name="connection.url">jdbc:oracle:thin:@127.0.0.1:1521:orcl</property><!-- 配置dialect,明确告诉hibernate连接的是哪种数据库 --><property name="dialect">org.hibernate.dialect.Oracle10gDialect</property><!-- 显示出对应的SQL语句 --><property name="show_sql">true</property><!-- 指定对象关系映射文件 --><mapping resource="com/hh/domain/Employee.hbm.xml" /></session-factory></hibernate-configuration>
8) 测试文件TestMain.java文件内容如下
package com.hh.view;import java.util.Date;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.cfg.Configuration;import com.hh.domain.Employee;import com.hh.util.*;public class TestMain {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stub}//删除用户public static void deleteEmployee() {//获取一个对话Session session = MySessionFactory.getSessionFactory().openSession();Transaction ts = session.beginTransaction();//删除 1.先获取该雇员,然后删除Employee employee = (Employee)session.load(Employee.class, 3);session.delete(employee);ts.commit();session.close();}//修改用户public static void updateEmployee() {//获取一个会话Session session = MySessionFactory.getSessionFactory().openSession();Transaction ts = session.beginTransaction();//修改用户1.获取要修改的用户。 2.修改//loda方法是通过主键属性,获取该对象实例,该对象与表的记录对应Employee employee = (Employee)session.load(Employee.class, 3);//这句话产生一个select语句employee.setName("胡辉8");//update.这句话会导致一个update语句产生employee.setEmail("abc@sohu.com");//修改两个地方,但是也只产生一个SQL语句ts.commit();session.close();}//增加用户public static void addEmployee() {// 我们使用hibernate完成crud操作【这里我们只见对象,不见表】// 不使用Service,直接测试// 1.创建Configuration,用于读取配置文件hibernate.cfg.xml,并完成初始化Configuration configuration = new Configuration().configure();// 2.创建SessionFactory,这是一个会话工厂,是一个重量级的对象SessionFactory sessionFactory = configuration.buildSessionFactory();// 3.创建session,相当于JDBC中的Connection,用于和数据库的对话.这个会话不是jsp中的sessionSession session = sessionFactory.openSession();// 4.对Hibernate而言,要求程序员,在进行增加,删除,修改的时候使用事务提交,查询可以不用Transaction transaction = session.beginTransaction();// 添加一个雇员Employee employee = new Employee();employee.setName("huhui");employee.setEmail("huhui@sina.com");employee.setHiredate(new Date());// 保存session.save(employee);// 持久化该对象(保存到了数据库中)==>insert into.......// 提交transaction.commit();// 关闭资源session.close();}}
需要注意,在使用hibernate开发项目的时候,请一定保证只有一个SessionFactory。如果连接了多个数据库,可以有多个SessionFactory,即一个数据库分配一个SessionFactory。
于是,对上面的java代码进行优化,创建MySessionFactory.java,目的是将SessionFactory做成单态:
final public class MySessionFactory {private static SessionFactory sessionFactory = null;private MySessionFactory(){}static{sessionFactory = new Configuration().configure().buildSessionFactory();}public static SessionFactory getSessionFactory(){return sessionFactory;}}
- Hibernate学习笔记(1)
- Hibernate 学习笔记(1)
- Hibernate 学习笔记(1)
- Hibernate学习笔记(1)
- 【学习笔记】Hibernate(1)
- Hibernate学习笔记(1)
- hibernate 学习笔记(1)
- Hibernate学习笔记(1)
- hibernate学习笔记1
- Hibernate学习笔记(1)
- Hibernate 学习笔记 1
- hibernate学习笔记1
- Hibernate学习笔记1
- Hibernate学习笔记1
- Hibernate学习笔记1
- hibernate学习笔记-1
- hibernate学习笔记(1)
- hibernate学习笔记 1
- linux 网站日志分析常用命令
- C语言运算符优先级(供查阅)
- 利用ArcMap对tiff或jpg格式地图图片的配准步骤
- poj2002
- 二年PHP女程少许感想
- Hibernate学习笔记(1)
- 小总结
- 我的第一个sencha touch应用
- 小总结02
- 快速学习js 笔记四 screen 对象
- Eclipse setup with GWT and SVN
- 金融算法交易的前沿发展
- 养老院的出院的存储过程包括历史记录备份和原记录删除,并调用其他存储过程
- Linus:利用二级指针删除单向链表