关闭

我的hibernate之旅一

标签: hibernate框架ormjavajava-web
90人阅读 评论(0) 收藏 举报
分类:

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();
    }

}
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:36938次
    • 积分:974
    • 等级:
    • 排名:千里之外
    • 原创:35篇
    • 转载:170篇
    • 译文:1篇
    • 评论:6条
    文章分类
    最新评论