Chinaunix首页 | 论坛 | 博客
  • 博客访问: 167206
  • 博文数量: 20
  • 博客积分: 317
  • 博客等级: 二等列兵
  • 技术积分: 809
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-05 18:37
文章分类

全部博文(20)

文章存档

2014年(1)

2013年(5)

2012年(14)

我的朋友

分类: Java

2013-04-14 19:11:03

1,手动实现hibernate并模仿spring集成的hibernate
(1).java中使用hibernate
先拷贝jar包:
(a)lib同目录下的hibernate3.jar:1个
(b)lib里面的required文件夹所有jar包:6个
(c)lib下面jpa中的jar包:1个
(d)mysql的jar包:1个
(2),etc文件夹下拷贝hibernate.cfg.xml到src目录下
修改配置文件,下面的配置文件的键值对在etc中的hibernate.properties中
添加:加载驱动等四个,方言,show_sql,format_sql,hbm2ddl.auto
(3),写POJO实体类,添加get,set方法
POJO类要求:(1)要有默认构造,因为new Instance的需要(2)最好有主键id(3)不能是final的,因为会对懒加载有影响
写映射文件类名 .hbm.xml到hibernate-core文件夹里面的test中找jms文件夹下有
然后修改属性
(4),写HibernateUtil类
//下面设置进入后会用这个变量得到Session
 private static SessionFactory sessionFactory;

 public static SessionFactory getSessionFactory() {
  return sessionFactory;
 }
 
 private HibernateUtil(){}
  //初始化加载并得到sessionFactory
 static{
  Configuration cfg=new Configuration().configure();
  sessionFactory=cfg.buildSessionFactory();
 }
 //得到session
 public Session getSession(){
  return sessionFactory.openSession();
 }
(5),写一般常用的增删改查的封装类HibernateTemplate
public void save(Object obj) {
  Session session = null;
  Transaction tx = null;
  try {
   session = HibernateUtil.getSession();
   tx = session.beginTransaction();
   session.save(obj);
   tx.commit();
  } catch (Exception e) {
   tx.rollback();
  } finally {
   session.close();
  }

 }
 
 public void delete(Object obj) {
  Session session = null;
  Transaction tx = null;
  try {
   session = HibernateUtil.getSession();
   tx = session.beginTransaction();
   session.delete(obj);
   tx.commit();
  } catch (Exception e) {
   tx.rollback();
  } finally {
   session.close();
  }
 }
 
 public void update(Object obj) {
  Session session = null;
  Transaction tx = null;
  try {
   session = HibernateUtil.getSession();
   tx = session.beginTransaction();
   session.update(obj);
   tx.commit();
  } catch (Exception e) {
   tx.rollback();
  } finally {
   session.close();
  }
 }
 
 public List find(String hql,Object[] obj){
  Session session=HibernateUtil.getSession();
  Query query=session.createQuery(hql);
  for (int i = 0; i < obj.length; i++) {
   query.setParameter(i,obj[i]);
  }
  List list=query.list();
  return list;
 }
 
 public Object get(Class clazz,int id){
  Session session=HibernateUtil.getSession();
  return session.get(clazz, id);
 }
注意:(1)property主元素主要包含四个属性:name(JavaBean中属性名字),type(对应的数据类型),
 column(对应数据库中的字段名)和not-null(数据库约束能否为空,true代表不能为空,默认false)
(2)通过Hibernate API编写访问数据库的代码
     Hibernate的API中包含了五个主要接口
     (a)Configuration接口:用于配置并且启动Hibernate。
     (b)SessionFactory接口:一个SessionFactory实例对应一个数据存储源。从SessionFactory中获得Session
     (c)Session接口:持久化管理器,提供了和持久化相关的操作,如保存,更新,删除和加载对象
     (d)Transaction接口:Hibernate的数据库事务接口,对底层的事务接口做了封装,底层接口包括JDBC事务和JTA事务
   (e)Query接口:Hibernate的查询接口,向数据库查询对象以及控制查询过程,Query实例包装了一个HQL查询语句
2,hibernate中常用方法:save,update,delete,get。query中常用的函数:uniqueResult(),list(),setFirstResult(0),setMaxResults(3);
save,persist在不开事物的时候,persist没有insert语句,save有但是没有显示的保存
delete,
update,脱管的记录更新时才调用这个方法
merge是更新或保存的意思,与saveOrUpdate一样,判断是瞬时还是脱管,根据判断id是否有值。调saveOrUpdate对象是持久的,调merge对象还是脱管的
get(User.class,id)和load:load不会立即访问数据库,在第一次访问的时候才访问数据库,牵涉到懒加载
HQL(Hibernate Query Language)查询语句:操作的全是对象
(1)一般的查询语句:
   (a)查询某个表:String hql="select u from Users u";
   (b)模糊查询某个表的字段:String hql="select u from Users u where u.userName like 'g%'";
   (c)带条件的某范围查询:String hql="select u from Users u where u.scores>=80 and u.scores<=100";
   (d)降序查询:String hql="select u from Users u where u.scores between 80 and 100 order by u.scores desc";
   (e)值为1或2:String hql="select u from Users u where u.state in(1,2)";
均执行下面操作:
        Session session = HibernateSessionFactory.getSession();
 Query query = session.createQuery(hql);
 List list = query.list();
(2)带有占位符的查询:
   (a)String hql="select u from Users u where u.userName=:uname and u.userPwd=:upass";
 Session session = HibernateSessionFactory.getSession();
 Query query = session.createQuery(hql);
 query.setString("uname", "jia");
 query.setString("upass", "123");
 List list = query.list();
   (b)String hql="select u from Users u where u.userName=? and u.userPwd=?";
       Session session = HibernateSessionFactory.getSession();
 Query query = session.createQuery(hql);
 query.setString(0, "jia");
 query.setString(1, "123");
 List list = query.list();
(3)聚合函数的查询:count,max, min,avg,sum
//String hql="select count(u) from Users u";
//String hql="select max(u.scores) from Users u";
  String hql="select avg(u.scores) from Users u";
  Session session = HibernateSessionFactory.getSession();
  Query query = session.createQuery(hql);//psmt.PreparedStatement(sql);
  Object count = query.uniqueResult();//执行聚合函数获取返回值唯一语句(如果知道返回的只有一个结果时用这个函数)
//当hql是update或delete的时候可以用int rows=query.executeUpdate()方法,返回的是影响的对象数
  System.out.println(count);
(4)分页查询:
//String hql="select u from Users u ";//select * from users limit 0,5
  String hql="select u from Users u order by u.scores desc";//select * from users  order by scores desc limit 0,5
  Session session = HibernateSessionFactory.getSession(); //
  Query query = session.createQuery(hql);//psmt.PreparedStatement(sql);
//query.setFirstResult(5); //设置起始位置:起始位置=(当前页-1)*分页单位
//query.setMaxResults(5);//设置分页单位
  query.setFirstResult(0);
  query.setMaxResults(3);
  List list = query.list();
(4)多表联合查询:如果存在层级关系必须按层级顺序进行查询,不能越级查询,即使含有那个字段
//查询学生姓名为sss5所发表的评论
//select c.* from commentinfos c,studentinfos s,users u where s.userId=u.userId
                                 and u.userId=c.userId and s.studentName='sss5'
  String hql="select c from Commentinfos c,Studentinfos s,Users u where s.users.userId=u.userId
                                       and u.userId = c.users.userId and s.studentName='sss5'";
  Query query = session.createQuery(hql);
  List list = query.list();
3,hibernate对象的三个状态:
瞬时状态:(Transient Object(new对象时))不在session管辖范围内,数据库中没有相应的记录(new 对象)
持久态:(Persist Object)在session中存在该对象,受session管理,数据库中有记录
离线状态:又叫游离态(Detached Object)session关闭或清空导致对象脱离了session管辖,数据库中有相应的记录
在持久态的对象如果发生变化,数据库会自动变化因为hibernate能检测到,要是有多个set,会更新一次,相同属性都是更新最后一次
session = HibernateUtil.getSession();
tx = session.beginTransaction();
session.save(u);
u.setDate("111");
u.setDate("222");
u.setName("lisi");
u.setName("wangwu");
tx.commit();
只有wangwu被自动更新进入数据库

阅读(4537) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~