zoukankan      html  css  js  c++  java
  • hibernate学习二 基本用法

    一  映射文件User.hbm.xml

    定义了持久化类实例是如何存储和加载的,这个文件定义了持久化类和表的映射。

    根据映射文件,Hibernate可以生成足够的信息以产生所有的SQL语句,也就是类的实例进行插入,更新,删除和查询所需要的SQL语句。

    二  配置文件hibernate.cfg.xml(另外一种格式是hibernate.properities)

    Hibernate配置文件:配置数据库连接以及Hibernate运行时所需要的各个属性的值。两种格式的文件是等价的,同时存在的的话xml的会覆盖properties的。

    xml相比properties的优势:XML格式的文件更易于修改,配置能力更强;当改变底层应用配置时不需要改变和重新编译代码,由hibernate自动加载,而properties就没有这个优势。

    常见配置属性:

       (1) Hibernate JDBC属性

            访问DB,要获得JDBC连接,所以需要有JDBC连接属性:    JDBC驱动, URL, 用户名, 密码, 连接池个数(pool_size)

             (2) hibernate.dialect属性

             不同SQL数据库的SQL语言有一定的差异,为了让hibernate对不同的DB产生合适的SQL,需要指定方言。Hibernate会根据JDBC返回的metadata得到正确的方言。

        (3) hibernate.show_sql

             SQL语句输出到控制台,方便调试。

        (4) 映射文件列表

              包含xxx.hbm.xml文件

    三: HibernateUtil.java

    要启动hibernate需要创建一个SessionFactory对象。SessionFactory是一个线程安全的对象,只能被实例化一次,可以被多个线程共享。使用SessionFactory可以获得Session的一个或多个实例。package cn.jbit.auction.dao;import org.hibernate.Session;import org.hibernate.SessionFactory;

    Session是持久化操作的基础,为持久化对象提供CURD操作。

    Hibernate在处理session的时候使用延迟加载机制,在真正访问DB的时,才从连接池中获取数据库连接。

    Session不是线程安全的,所以这里使用了Thread Local模式。

    import org.hibernate.cfg.Configuration;
    
    public class HibernateUtil {
        // 初始化一个ThreadLocal对象
        private static final ThreadLocal sessionTL = new ThreadLocal(); // Session每个线程有一个session的副本,线程之间不影响。

    // configuration 和 SessionFactory都是静态的,只能实例化一次
    private static Configuration configuration; private final static SessionFactory sessionFactory; static { try { configuration = new Configuration().configure(); sessionFactory = configuration.buildSessionFactory(); } catch (Throwable ex) { throw new ExceptionInInitializerError(ex); } } public static Session currentSession() { //sessionTL的get()方法根据当前线程返回其对应的线程内部变量, //也就是我们需要的Session,多线程情况下共享数据库连接是不安全的。 //ThreadLocal保证了每个线程都有自己的Session。 Session session = (Session) sessionTL.get(); // 如果session为null,则打开一个新的session
    // 如下的标为红色的代码不需要加锁,不需要双重判断,因为session本身是线程局部变量了,不存在多线程的问题。
    if (session == null) { //创建一个数据库连接对象session。 session = sessionFactory.openSession(); // 保存该数据库连接session到ThreadLocal中。 sessionTL.set(session); } //如果当前线程已经访问过数据库了, //则从sessionTL中get()就可以获取该线程上次获取过的数据库连接对象。 return session; } /** * 关闭Session */ public static void closeSession(){ Session session = (Session) sessionTL.get(); sessionTL.set(null); session.close(); } }

    四 编写Dao(Data Access Object)接口

    Dao模式是标准的J2EE模式:

      (1) 一个Dao接口

      (2) 一个实现Dao接口的具体类

      (3) 一个Dao工厂类

      (4) 数据传递对象,主要是POJO

    Dao接口定义了所有的CURD操作。Dao实现类实现了接口中定义的方法。

    UserDAOImple.java的的一部分代码如下:

    public void  save(User user)
    {
           Session session = HibernateUtil.getSession();
           Transaction   tx = session.beginTransaction();
           try {
               session.save(user);
               tx.commit();
          } catch(Exception e) {
               tx.rollback; 
          }
          finally {
                HibernatenateUtil.closeSession();
           }
    }
  • 相关阅读:
    现代软件工程 第一章 概论 第3题——韩婧
    现代软件工程 第一章 概论 第2题——韩婧
    小组成员邓琨、白文俊、张星星、韩婧
    UVa 10892 LCM的个数 (GCD和LCM 质因数分解)
    UVa 10780 幂和阶乘 求n!中某个因子的个数
    UVa 11859 除法游戏(Nim游戏,质因子)
    Codeforces 703C Chris and Road 二分、思考
    Codeforces 703D Mishka and Interesting sum 树状数组
    hdu 5795 A Simple Nim SG函数(多校)
    hdu 5793 A Boring Question 推公式(多校)
  • 原文地址:https://www.cnblogs.com/liufei1983/p/8595311.html
Copyright © 2011-2022 走看看