hibernate是什么?

  • hibernate 是一个框架(framework)

  • hibernate 是一个orm框架
    orm (object relation mapping) 对象关系映射 框架
    o object -> 业务层(只对对象操作)
    r relation-> 关系数据库
    m mapping 对象关系映射文件

  • hibernate 处于我们项目的持久层位置(正因为如此,所以有人又把hibernate称为 持久层框架)

  • hibernate 实际上就是对jdbc进行了轻量级的封装.

  • hibernate 的基础还是我们java 反射机制

  • 除了hiberante 这个orm框架,还有一些:
    apache ojb / toplink / ibatis / ejb cmp
    Apache OJB ()
      Cayenne ()
      Jaxor ()
      Hibernate ()
      iBatis ()
      jRelationalFramework ()
      mirage ()
      SMYLE ()
      TopLink ()

把对象持久化: 把对象的信息保存到数据库或者是文件.

总结: hibernate 是对jdbc进行轻量级封装的 orm 框架,充当项目的持久层.

为什么需要hibernate?

快如入门案例:

hiberante 可以用在 j2se 项目,也可以用在 j2ee (web项目中)
struts是web框架,所以用在 web项目

我们使用手动配置hibernate方式开发一个hibernate 项目,完成crud操作 。

开发流程

  1. 创建一个项目
  2. 画出一个简单项目框架示意图
  3. 引入hibernate 开发包 (从网上下载 google hibernate http://www.hibernate.org),完后我们
  4. 开发hibernate 有三种方法(开发顺序)
    我们使用第二种开发项目
    创建employe 表.
create table employee(
id number primary key,
name varchar2(64) not null,
email varchar2(64) not null,
hiredate date not null)

创建一个序列,将来用于主键的自增长 :
–创建一个序列

create sequence emp_seq
start with 1
increment by 1
minvalue 1
nomaxvalue
nocycle
nocache
  1. 开发domain对象和对象关系映射文件

对象关系映射文件: 作用是用于指定 domain对象和表的映射关系. ,该文件的取名有规范:
domain对象.hbm.xml,一般我们放在 和domain对象同一个文件夹下(包下)

我们的Employee.hbml.xml配置文件 :

<!DOCTYPE hibernate-mapping PUBLIC"-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping package="com.hsp.domain"><class name="Employee" table="employee"><!-- id元素用于指定主键属性 --><id name="id" column="id" type="java.lang.Integer"><!-- 该元素用于指定主键值生成策略hilo native increment sequence uuid --><generator class="sequence"><param name="sequence">emp_seq</param></generator></id><!-- 对其它属性还有配置 --><property name="name" type="java.lang.String"><column name="name" not-null="false"  /></property><property name="email" type="java.lang.String" ><column name="email" not-null="false"/></property><property name="hiredate" type="java.util.Date"><column name="hiredate" not-null="false" /></property></class></hibernate-mapping>
  1. 手动配置我们的hibernate.cfg.xml文件,该文件用于配置 连接的数据库的类型,driver,
    ,用户名,密码 ,url …同时管理 对象关系映射文件 ,该文件的名称,我们一般不修改.

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 设计者,给我们提供了一写常用的配置 --><!-- 配置使用的driver --><property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property><property name="connection.username">scott</property><property name="connection.password">tiger</property><property name="connection.url">jdbc:oracle:thin:@127.0.0.1:1521:orclhsp</property><!-- 配置dialect方言,明确告诉hibernate连接是哪种数据库 --><property name="dialect">org.hibernate.dialect.OracleDialect</property><!-- 显示出对于sql --><property name="show_sql">true</property><!-- 指定管理的对象映射文件 --><mapping resource="com/hsp/domain/Employee.hbm.xml"/>
</session-factory>
</hibernate-configuration>
  1. 测试文件TestMain.java
package com.hsp.view;
import com.hsp.util.*;
import java.util.Date;import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.*;import com.hsp.domain.Employee;
public class TestMain {/*** @param args*/public static void main(String[] args) {//查询[load]->hql语句(hibernate query language)}public static void delEmp() {//删除//获取一个sessionSession session=MySessionFactory.getSessionFactory().openSession();Transaction ts=session.beginTransaction();//删除1.先获取该雇员,然后删除Employee emp=(Employee) session.load(Employee.class, 3);session.delete(emp);ts.commit();session.close();}public static void updateEmp() {// TODO Auto-generated method stub//修改用户//获取一个会话Session session=MySessionFactory.getSessionFactory().openSession();Transaction ts=session.beginTransaction();//修改用户1. 获取要修改的用户,2.修改//load是通过主键属性,获取该对象实例.<--->表的记录对应Employee emp=(Employee) session.load(Employee.class, 3);emp.setName("韩顺平8");//update...emp.setEmail("abc@sohu.com");ts.commit();session.close();}public static void addEmployee() {//我们使用hibernate完成crud操作[这里我们只见对象,不见表]//现在我们不是用service ,直接测试.//1。创建Configuration,该对象用于读取hibernate.cfg.xml,并完成初始化Configuration configuration=new Configuration().configure();//2.创建SessoinFactory[这是一个会话工厂,是一个重量级的对象]SessionFactory sessionFactory=configuration.buildSessionFactory();//3.创建Sessoin 相当于jdbc Connection[ servelt HttpSession ,也不是 jsp session]Session session=sessionFactory.openSession();//4.对hiberate而言,要求程序员,在进行 增加,删除,修改的时候使用事务提交,Transaction transaction = session.beginTransaction();//添加一个雇员Employee employee=new Employee();employee.setName("shunping");employee.setEmail("shunping@sohu.com");employee.setHiredate(new Date());//insert .............//保存session.save(employee);//save employee就是持久化该对象 (把对象保存到了数据库中称为一条记录)//==>insert into ....[被hiberante封装]//提交transaction.commit();session.close();}}

现在我们体验一下hibernate切换数据库的优势.
这次,我们使用 让hibernate自动完成 domain->映射文件->表 的工作.

  1. 首先我们把 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 设计者,给我们提供了一写常用的配置 --><!-- 配置使用的driver --><property name="connection.driver_class">com.mysql.jdbc.Driver</property><property name="connection.username">root</property><property name="connection.password">root</property><property name="connection.url">jdbc:mysql:/localhost:3306/test</property><!-- 配置dialect方言,明确告诉hibernate连接是哪种数据库 --><property name="dialect">org.hibernate.dialect.MySQLDialect</property><!-- 显示出对于sql --><property name="show_sql">true</property><!-- 让hibernate给我们自动创建表 create :如果没有该表则创建. --><property name="hbm2ddl.auto">create</property><!-- 指定管理的对象映射文件 --><mapping resource="com/hsp/domain/Employee.hbm.xml"/>
</session-factory>
</hibernate-configuration>
  1. 对对象映射文件,做了相应的修改.
<!-- 对主键生成策略我们做了修改 -->
<id name="id" column="id" type="java.lang.Integer">
<generator class="increment"></generator>
</id>

笔试题: 请列举出hibernate常见的接口和类

?请解释什么事pojo类,它有什么要求:

  1. pojo类是和一张表对应
  2. 一般我们放在 com.xxx.domain下
  3. pojo 需要一个主键属性(用于标示一个pojo对象)
  4. 除了主键属性外,它应当还有其属性,属性的访问权限是private
  5. 提供 set /get 方法
  6. 它应当有一个无参的构造方法(hibernate 反射)
  7. pojo类其实就是javabean/ 有些老程序员 叫他 date对象

上机练习:
写一个简单的雇员管理系统.
emp( id , name , tel , birthday ),
可以,进入主界面

请选择数据库类型

  1. 表示 连接 oracle
  2. 表示 连接 mysql
  3. 表示 连接 sql server

请选择操作

  1. 显示所有雇员
  2. 根据id查询指定雇员
  3. 修改雇员信息(请先输入id)
  4. 根据id 删除雇员.
  • 用户可以多次选择操作.

hibernate教程笔记1相关推荐

  1. Hibernate学习笔记(一)----针对不同的数据库不同的配置

    Hibernate初学笔记 l Hibernate初步配置: 1 新建项目 2 学习建立user-library-hibernate,并加入相应的jar包(hibernate核心jar包,lib下的所 ...

  2. hibernate学习笔记二

    上一篇关于hibernate学习笔记一,主要是作为hibernate的入门知识.没有和spring发生任何关系,这一篇我将把spring集成进去,看spring如何管理hibernate,还有和未使用 ...

  3. 台湾国立大学郭彦甫Matlab教程笔记(22) Cramer's method(Inverse matrix逆矩阵法)

    台湾国立大学郭彦甫Matlab教程笔记(22) Cramer's method(Inverse matrix) matrix left division左除:\ or mldivide() solvi ...

  4. 台湾国立大学郭彦甫Matlab教程笔记(21)linear equations(高斯消去法和追赶法)

    台湾国立大学郭彦甫Matlab教程笔记(21) today: linear equation 线性方程 linear system 线性系统 我们先看第一部分 linear equation 假定一个 ...

  5. 台湾国立大学郭彦甫Matlab教程笔记(20) root finding(numeric)

    台湾国立大学郭彦甫Matlab教程笔记(20) root finding(numeric) symbolic vs. numeric符号法和数值法的区别对比 symbolic 1)advantages ...

  6. 台湾国立大学郭彦甫Matlab教程笔记(17)numerical integration

    台湾国立大学郭彦甫Matlab教程笔记(17)numerical integration 数值积分 calculating the numerical value of a definite inte ...

  7. 台湾国立大学郭彦甫Matlab教程笔记(16) 数值微分 numerical differentiation

    台湾国立大学郭彦甫Matlab教程笔记(16) 数值微分 numeric differentiation 复习:diff()函数用来计算vector前后 entry的差异 数值微分继续 various ...

  8. 台湾国立大学郭彦甫Matlab教程笔记(15)polynomial integration 多项式积分

    台湾国立大学郭彦甫Matlab教程笔记(15) Polynomial integration多项式积分 一个多项式和它的积分如下 MATlAB中如何计算积分? polynomial integrati ...

  9. 台湾国立大学郭彦甫Matlab教程笔记(14)polynomial differentiation多项式微分

    台湾国立大学郭彦甫Matlab教程笔记(14) today: polynomial differentiation and integration多项式微分与积分 numerical differen ...

  10. 台湾国立大学郭彦甫Matlab教程笔记(12) advanced 2D plot 下

    台湾国立大学郭彦甫Matlab教程笔记(12) advanced 2D plot 下 上文记录的是关于统计的图标的绘制 下面我们来到另一个模块:颜色 fill()填充函数 功能:某一个封闭曲线,图上特 ...

最新文章

  1. ecside使用笔记(1)
  2. Ubuntu下gedit的相关问题
  3. pythonsuper多重继承_小白都能理解的Python多继承
  4. C代码中如何调用C++ C++中如何调用C
  5. 使用vim的find命令快速打开文件
  6. std::auto_ptr简单使用
  7. imx6 android6.0.1,mfgtool刷写i.MX6 android6.0版本失败
  8. vue学习-MVVM的实现原理
  9. 基因检测报告都用了哪些数据库?
  10. 机器人机电液控制一体化联合仿真
  11. Phoenix创建Hbase二级索引
  12. Unity官方实例教程 Space Shooter(太空射击游戏)
  13. scholarscope不显示影响因子_你的pubmed又不能显示影响因子了,因为 ……
  14. NAACL 2019 | ​注意力模仿:通过关注上下文来更好地嵌入单词
  15. append()的用法
  16. ChatGPT使用案例之自然语言处理
  17. word计算机桌面加密,如何给电脑的Word文件加密
  18. 2021-2027全球与中国MPO连接器市场现状及未来发展趋势
  19. DeadException
  20. 操作系统-1.设计的原则

热门文章

  1. SVM原理,及和逻辑回归区别
  2. nyoj--496--巡回赛(拓扑排序)
  3. 探讨一种 Java 实现分组的方法
  4. Python集合框架
  5. Java 基本语法----数组
  6. 响应式布局之网站头部导航
  7. CocoaPods安装和使用图解
  8. 使用自制ADempiere 3.6.0 LTS安装软件进行安装(基于Ubuntu Desktop 12.04 LTS)
  9. Android开源代码解读のOnScrollListener实现ListView滚屏时不加载数据
  10. 回复 Timer008 的一个类型转换的问题 - 不是很典型, 对其他人参考价值不大