我的hibernate之旅一

原创 2017年07月30日 18:24:54

hibernate是什么?

1、hibernate是 轻量级的 ORM 框架。
2、hibernate 处于我们项目的持久层位置(正因为如此,所以有人又把hibernate称为 持久层框架)
3、hibernate 实际上就是对jdbc进行了轻量级的封装.
4、hibernate 的基础还是我们java 反射机制
5、hibernate 是对jdbc进行轻量级封装的 orm 框架,充当项目的持久层

orm是什么

对象关系映射(Object Relation Mapping,简称ORM)是一种
为了解决面向对象与关系数据库存在的互不匹配的现象的技术。
简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,
将java程序中的对象自动持久化到关系数据库中。本质上就是将数
据从一种形式转换到另外一种形式。

hb1

hibernate在项目架构中位置

001

为什么需要hibernate

hb2

根据上图不难看出,不使用hibernate框架时,我的jdb数据库操作语句一般都放在了业务层,编写了大量而复杂的数据库操作语句,那么这样的开发模式给我们带来了一些麻烦。
1、如果切换数据库时,由于各个数据库的操作语句略有不同,我们要重新编写大量的sql语句。
2、 使用jdbc操作数据库,sql语句编写比较麻烦 PreparesSatement(?,?)
set(1,) set(2,?)
3、我们的程序员希望不关注数据库本身,而只关注业务本身

右半部分图可以清晰的看出,使用了hibernate之后我们可以轻松的解决了以上存在的问题,这往往说明了一个新技术的出现必定是来解决历史存在的问题或缺陷。

hibernate基本原理示意图

hb3

快速入门
step
1、新建一个普通Java工程,hibernate只是一个orm框架,所以支持Java se和java ee

2、引入hibernate的开发包

hb4

3、准备数据库和相关的表

hb5

4、构建数据库表对应的实体模型Employe类


public class Employe implements Serializable{


    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    private static final long serialVersionUID = 1L;
    private int id;
    private String name;
    private String password;
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public static long getSerialversionuid() {
        return serialVersionUID;
    }

}

5、构建对象关系映射文件

<?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.ydc.domain">
    <class name="Employe" table="Employe">
        <!-- id元素用于指定主键属性 -->
        <id name="id" column="id" type="java.lang.Integer">
            <!-- 该元素用于指定主键值生成策略hilo native increment sequence uuid -->
            <generator class="increment"></generator>
        </id>
        <!-- 对其它属性还有配置 -->
        <property name="name" type="java.lang.String">
            <column name="name" not-null="false" />
        </property>
        <property name="password" type="java.lang.String">
            <column name="password" not-null="false" />
        </property>

    </class>

</hibernate-mapping>

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

6、构建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.microsoft.sqlserver.jdbc.SQLServerDriver</property>
    <property name="connection.username">sa</property>
    <property name="connection.password">123456</property>
    <property name="connection.url">jdbc:sqlserver://localhost:1433;databasename=XHCommunityService</property>
    <!-- 配置dialect方言,明确告诉hibernate连接是哪种数据库 -->
    <property name="dialect">org.hibernate.dialect.SQLServerDialect</property>
    <!-- 显示出对应的sql语句-->
    <property name="show_sql">true</property>
    <property name="current_session_context_class">thread</property>
    <!-- 指定管理的对象映射文件 -->
    <mapping resource="com/ydc/domain/Employe.hbm.xml"/>
</session-factory>



</hibernate-configuration>

该文件用于配置 连接的数据库的类型,driver,用户名,密码 ,url 等同时管理 对象关系映射文件 ,该文件的名称,我们一般不修改.

7、构建会话工厂MySessionFactory类


final public class MySessionFactory {

    private static SessionFactory sessionFactory = null;

    private static Configuration configuration = null;
    static {
        configuration = new Configuration().configure();
        sessionFactory = configuration.buildSessionFactory();
    }

    private MySessionFactory() {
    };

    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }

}

8、添加一个雇员

// 添加一个雇员
    private static void addEmpoyee() {
        // 1.得到Configuration
        Configuration configuration = new Configuration().configure();
        // 2.得到SessionFactory(会话工厂,这是一个重量级的类,因此要保证在一个应用程序中只能有一个)
        SessionFactory sessionFactory = configuration.buildSessionFactory();

        // 3. 从SessionFactory中取出一个Session对象(它表示 和数据库的出一次会话)
        Session session = sessionFactory.openSession();
        // 4. 开始一个事务
        Transaction transaction = session.beginTransaction();
        // 保存一个对象到数据库(持久化一个对象)
        Employe emp = new Employe();
        emp.setName("ydc008");
        emp.setPassword("123");
        // 不要给id,因为它是自增的
        session.save(emp);// insert into employee (name,id,...) value(?,?,?)
        transaction.commit();
    }

9、测试运行

hb6

hb7

看见没,我们不需要在编写大量的sql语句,只要操作相关的对象就可以轻松的把数据成功添加到数据库中。

10、增删改查操作


public class TestMain {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        addEmpoyee();
        // queryEmp();
        // delEmp() ;
        // updateEmp();
    }

    // 添加一个雇员
    private static void addEmpoyee() {
        // 1.得到Configuration
        Configuration configuration = new Configuration().configure();
        // 2.得到SessionFactory(会话工厂,这是一个重量级的类,因此要保证在一个应用程序中只能有一个)
        SessionFactory sessionFactory = configuration.buildSessionFactory();

        // 3. 从SessionFactory中取出一个Session对象(它表示 和数据库的出一次会话)
        Session session = sessionFactory.openSession();
        // 4. 开始一个事务
        Transaction transaction = session.beginTransaction();
        // 保存一个对象到数据库(持久化一个对象)
        Employe emp = new Employe();
        emp.setName("ydc008");
        emp.setPassword("123");
        // 不要给id,因为它是自增的
        session.save(emp);// insert into employee (name,id,...) value(?,?,?)
        transaction.commit();
    }

    // 更新
    public static void updateEmp() {
        SessionFactory sessionFactory = MySessionFactory.getSessionFactory();
        Session session = sessionFactory.openSession();
        // 修改一个雇员,先得到,再修改
        Transaction ts = session.beginTransaction();
        // load方法是用于获取 指定 主键的对象(记录.)
        Employe emp = (Employe) session.load(Employe.class, 1);
        emp.setName("小名");
        ts.commit();
    }

    public static void delEmp() {
        // TODO Auto-generated method stub
        SessionFactory sessionFactory = MySessionFactory.getSessionFactory();
        Session session = sessionFactory.openSession();
        // 删除一个雇员,先得到,再修改
        Transaction ts = session.beginTransaction();

        Employe emp = (Employe) session.load(Employe.class, 1);
        session.delete(emp);
        ts.commit();
    }

    public static void queryEmp() {
        SessionFactory sessionFactory = MySessionFactory.getSessionFactory();
        Session session = sessionFactory.openSession();
        // 查询可以不使用事务
        Employe emp = (Employe) session.load(Employe.class, 3);
        System.out.println(emp.getName() + " " + emp.getId());
        session.close();
    }

}

相关文章推荐

SSH三大框架学习心得体会

这篇文章是基本的概念讲解和心得体会,之后会有详细的demo进行解说。在过去的一段时间内,我一直对SSH(spring、Struts2、hibernate)的框架不是很了解,借着这次完成电影购票系统的大...
  • xyx1311
  • xyx1311
  • 2017年06月06日 23:14
  • 845

SSH问题集(一) spring和struts整合配置文件问题

SSH问题集(一) spring和struts整合配置文件问题 1、spring默认配置文件applicationContext.xml的路径设置 contextConfigLocation ...
  • mxhuang
  • mxhuang
  • 2016年11月22日 14:27
  • 255

Java之旅hibernate(1)——初始

说道hibernate,首先不得不提的是JPA,类似于接口,j2EE的十三个规范,JPA是一个标准,或者更加准确的说是一个规范,而hibernate实现了这一规范。  JPA简介   JPA全称J...

SSH——Hibernate初学者之旅(六)

上次我们说到Hibernate对象的几种状态,今天我们来看看Hibernate中的缓存机制。hibernate中的缓存有两种,分为一级缓存和二级缓存, 我们从开始介绍Hibernate概念到Hi...

SSH——Hibernate初学者之旅(二)

上次我们大致介绍了一下hibernate的概念、作用等,知道了hibernate是一种持久化的ORM框架,那么在实际使用中我们是怎么来实现映射关系的呢,我们先一起来看看一对一关联的映射关系。 ...

我的hibernate学习之旅(2)

一、HIbernate第一个实例 该实例的目录结构如下 说明:最后一个HIBERNATE3里面包含了所有的需要引用的jar包1、新建一个普通的java项目,按照上面的步骤引入相关的jar包和配...

ssh学习之旅(2)--关于hibernate实体映射关联关系映射查询的解决方案-lazy属性惹的祸

先来习惯性吐槽下 最近做的ssh项目,一开始以为搭个框架很简单的,可想不到出现的问题异常多啊,tomcat运行内存不够,包重复,引用spring关联不到,一堆。。。。。。。。 辛亏都解决了(这里应该...

我的hibernate学习之旅(3)~通过给类文件添加注解的方式来配置映射

这篇博客将介绍Hibernate的经典内容:对象关系映射。主要介绍映射的基本概念,映射的分类,映射文件。概念 ORM(Object Relational Mapping),即对象关系映...

SSH——Hibernate初学者之旅(四)

之前我们说到了一对一和一对多关系的几种映射类型,最后只剩下多对多关系的映射。一般来讲,我们会将多对多关系抽出第三张表,转化为一对多关系,但是难免会有一些特殊情况。今天我们就来看看多对多关系的映射。 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:我的hibernate之旅一
举报原因:
原因补充:

(最多只允许输入30个字)