zoukankan      html  css  js  c++  java
  • Hibernate学习笔记

    Hibernate使用XML文档来维护Java类和关系数据库表之间的映射关系。这样通过Hibernate可以吧信息从SQL数据库中提取出来,在将它转换成Java对象。

    一、Hibernate开发

    1.生成和数据库相关的接口类和xml配置文件——对底层数据库

    用Eclipse插件MiddleGenIDE帮助生成关于数据表的文件。将产生User.java和User.hbm.xml。其中java文件包括对数据表中各个属性的定义和set,get操作。xml文件包含对这个队形的映射文件。如下图为xml文件,其中generator是用来告诉Hibernate使用底层数据库是主键的生成方式,native为在数据库中自增加的方式

    2.创建持久化类,即对数据库接口的实现——对底层数据库实现

    在Hibernate中每一个session都有两个状态:瞬时状态和持久化状态。当new一个user类之后,此时就为瞬时状态若要现在需要对user数据表进行相关操作。就需要调用save()方法将其持久化,只有这样在JVM之后这个数据对象还能够存在。当调用delete之后就回到瞬时状态了。

    二、常用的Hibernate操作

    1.select(查询类似)

    public User select(String username){
      Session session =null;
      User record =null;
      
      try {
       session = HibernateSessionFactory.currentSession();//用工厂模式对session进行管理,SessionFactory是线程安全的

      //如何保证线程安全呢?在java中连接数据库依赖的是java.sql.Connection,在Hibernate中Hibernate Session对Connection进行了一层高级封装。一个Session对应了一个Connection,要实现延迟加载必须保证是同一个session并且从头到尾都是一个session.

       //在java中一个请求是一个线程,tomcat采用线程池机制,当有一个http请求的时候,随机从线程池中取出一个线程对象去处理。要保证请求使用同一个session就需要对线程进行绑定。在java中用ThreadLocal实现对线程的绑定。
       Query query = session.createQuery("from User where username=?");//使用问号参数,注意参数是从0开始计数的
       query.setString(0, username.trim());
       record = (User) query.uniqueResult();//查询只有一个结果。若结果是个集合 query.list()
       query = null;
      } catch (HibernateException e) {
       // TODO: handle exception
       throw e;
      }finally{
       HibernateSessionFactory.closeSession();
      }
      return record;
      
     }

    2.Insert

    public Integer insert(User record){
      Session session=null;
      Transaction tx=null;//采用事务
      Integer id=null;
      try {
       session=HibernateSessionFactory.currentSession();
       tx=session.beginTransaction();
       session.save(record);//由瞬时化变为持久化
       id=record.getId();
       tx.commit();//注意提交
      } catch (HibernateException e) {
       // TODO Auto-generated catch block
       throw e;
      }finally{
       if(tx!=null){
        tx.rollback();
       }
       HibernateSessionFactory.closeSession();
      }
      return id;
      
     }

    3.条件查询Criteria(可以取代HQL)

    public Page list(String username, int pageSize, int pageNo) {
      Session session = null;
      Page pager = null;
      try {
       session = HibernateSessionFactory.currentSession();

       // 创建查询条件
       Criteria criteria = session.createCriteria(Address.class);
       criteria.add(Restrictions.eq("username", username));//Restriction用于在在查询中指定各种约束条件

       // 取得总数
       int rowCount = ((Integer) criteria.setProjection(
         Projections.rowCount()).uniqueResult()).intValue();//setProjection投影操作
       criteria.setProjection(null);

       // 取得当前页
       int startIndex = pageSize * (pageNo - 1);

       // 设置排序条件
       criteria.addOrder(Order.asc("username"));
       criteria.setFirstResult(startIndex);
       criteria.setMaxResults(pageSize);
       List<?> result = criteria.list();
       pager = new Page(pageSize, pageNo, rowCount, result);
      } catch (HibernateException e) {
       pager = new Page(pageSize, pageNo, 0, new ArrayList<Object>());
       throw e;
      } finally {
       HibernateSessionFactory.closeSession();
      }
      return pager;
     }

  • 相关阅读:
    union all 与order by的连用
    oracle--trunc与to_char的区别
    oracle函数--trunc
    大公司能给你什么
    要么忍要么滚
    scp报错:not a regular file,解决方法:加参数 -r
    hive中的一种假NULL现象
    使用Python scikit-learn 库实现神经网络算法
    随机梯度下降算法求解SVM
    机器学习算法--svm实战
  • 原文地址:https://www.cnblogs.com/doublesong/p/2601677.html
Copyright © 2011-2022 走看看