Hibernate详解

 

org.Hibernate.cfg.Configuration

Configuration类负责管理Hibernate的配置文件 ------- Hibernate.cfg.xml  并读取这个配置文件.

通过配置文件又能够读取映射文件, *.hbm.xml .

Configuration config=new Configuration(); //获取配置文件 

config.configure();//读取配置文件信息

关于Configuration conf = new Configuration().configure();

这行代码的解释, 为什么api 中已经写了有一个 Configuration() 的构造方法 就可以创建一个Configuration类型的对象了 , 还要调用Configuration类本身的方法在返回 自身类型的对象呢

想了想可能是 new Configuration() 这一部虽然是创建一个对象, 但是他只是一个空的对象, 并没有什么什么内容, configure() 方法是去读取 Hibernate.cfg.xml 配置文件的信息,从而创建出一个包含了Hibernate配置信息的对象.

configure()默认是读取Hibernate.cfg.xml 配置文件的,但是如果我们把配置文件改了名称, configure() 方法改变了它要读取的文件名 也是可行的. configure() 方法中有一个是可以接受 配置文件名参数的.

Configuration是一个瞬态对对象, 它占据的资源比较少,一旦SessionFactory 被建立了, 他就被丢弃了.

应用程序是从SessionFactory中获得Session 示例的, 通常情况下 一个数据库只有一个唯一的SessionFactory,

SessionFactory是在应用初始化时被创建的.

SessionFactory缓存了生成的sql语句和Hibernate在运行时使用的映射源数据.

言下之意,SessionFactory非常消耗内存,目的是为每一个客户生成链接.

SessionFactory适合放在哪里啊? 很明显,如果你用网站做的话, 适合放在Application 中的.

SessionFactory就是来管理Session 的生成的

SessionFactory中最有意义的是getSession() closeSession() 2static方法

关于session saveOrUpdate()

   例如在前面的一个对象的信息和数据库中已经存在的信息是重的, 那么saveOrUpdate()会选择数据库中那条记录, 如果数据库中没有该条记录的话 则会直接把该条记录插入进去.

关于load()

如果我们想要查找的数据在数据库中找不到的话, 那么使用load()方法的话 他会抛出异常的 (错误信息挺多的)

如果使用get(Class clz ,Serializable id) 想要加载数据库中不存在的数据时 , 他也会报错, 但是只会报出

NullPointerException, 错误信息较少.

这里好像要涉及到HQL 语句了

查询一个整个对象的数据 就这样写 "from TCustomer t where t.customerbalance > 4000"

这样一条语句是查询出一条记录的全部信息的,

如果想要查询出一条记录中某几列数据的话  就这样写好了

那这样写行么?

Session session = HibernateSessionFactory.getSession();

 

  String hql = "select password , customername from TCustomer t where t.customerbalance > 4000";

  Query query = session.createQuery(hql);

  Iterator i = query.iterate();

  while(i.hasNext())

{

   TCustomer t = (TCustomer)i.next();

   System.out.println(t.getPassword()+" "+t.getCustomername());

  }

报错了说 java.lang.Object 不能被cast TCustomer类型的 .

也就说 , 我们从数据库中想要查询出的 每条记录中的 password  customername  这两列数据 无法构成一个TCustomer 对象, 只是被认定为Object. 那我们怎么获取呢?

String hql = "select password , customername from TCustomer t where t.customerbalance > 4000";

int j = 1 ;

Query query = session.createQuery(hql);

Iterator i = query.iterate();

  while(i.hasNext())

{

   Object object[]  = (Object[])i.next();

   System.out.println(object[0]+" "+object[1]);

   }

不太明白为什么要强制类型转换为Object[]  哪有这种类型啊?

第二种批量查询方法就是准则查询方法:

   Criteria criteria = session.createCriteria(TCustomer.class);

   在这里想要创建一个查询条件 : 要求比某值大 , 使用Restrictions gt() 该方法是用来设置一定要大于某值的这样一个条件的

    criteria.add(Restrictions.gt("customerbalance", 4000.0));

    List list = criteria.list();

    for(int i = 0 ; i < list.size();i++){

    TCustomer t = (TCustomer)list.get(i);

     System.out.println(t.getCustomername()+" "+t.getPassword());

     }

瞧瞧这种写法,这是使用sql语句的

SQLQuery sqlQuery = session.createSQLQuery("select account ,password , customername , customerbalance from t_customer ");

  //将结构从Object 类型转换为TCustomer类型的

    sqlQuery.addEntity(TCustomer.class);

    List list = sqlQuery.list();

    for(int i = 0 ; i < list.size();i++){

    TCustomer t = (TCustomer)list.get(i);

    System.out.println(t.getCustomername()+" "+t.getPassword());

     }

 

如果不想查询出全部信息的话, 指向查询出部分信息 , 怎么做呢只需要把sqlQuery.addEntity(TCustomer.class);

把前面的强制转换为TCustomer 换成转换为 Object 类型的 ,

这一部省略掉就OK !

在实际项目操纵中, 对数据库执行批量操作的话是绝对应该使用存储过程的

想要在hibernate中调用存储过程的话 应该怎么弄呢?

java.sql.Connection conn = session.connection() ;

conn.prepareCall(String proc);

prepareCall() 是调用存储过程的方法.

出自:http://blog.csdn.net/tjzero_sapce/archive/2009/02/18/3907794.aspx

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值