Hibernate 中对增删改查

来源:互联网 发布:scala编程思想怎样 编辑:程序博客网 时间:2024/06/14 04:42
Hibernate 中对增删改查的小结 mysql 中库表 News,
字段如下 id title date | int | auto_increment | primary key |  varchar | varchar content | varchar 
-------------------------------------------------------------------------------------------
1:Hibernate 的 insert 操作 :
Session session = HibernateSessionFactory.getSession();
  News news = new News();
  news.setContent("my content");
  news.setTitle("my title");
  news.setDate("my date"); //news是VO 
  Transaction trans = session.beginTransaction();
session.save(news); //news是PO 
  trans.commit(); //任何有关数据库更新的操作都是 commit后进数据库的
HibernateSessionFactory.closeSession();
--------------------------------------------------------------------------------------
2:Hibernate 的update 操作 :
  Session session = HibernateSessionFactory.getSession();
  News news = new News();
  news.setId(103); //id不可少,Hibernate只通过id来查找数据库 
  news.setContent("update content"); 
  news.setTitle("update title"); 
  Transaction trans = session.beginTransaction();
  session.update(news);
  trans.commit();
  HibernateSessionFactory.closeSession();
注意这里我们更新数据不想对 date 进行更新,所以没写setDate,但Hibernate会认为我们是想把date设置为null所以如果要更新表中一些


字段,最好用下面的方法。 
  Session session = HibernateSessionFactory.getSession();
  Transaction trans = session.beginTransaction();
  News news = (News)session.get(News.class, 103); //*****(1)
  news.setDate("update date");//*****(2) 
  session.save(news); //*****(3)
  trans.commit();
  HibernateSessionFactory.closeSession(); // 这里其实对数据库进行了两次操作。
(1)时从数据库中把相应纪录查找出来,这里 news 是一个 PO,
对 PO 进行 date 的更新,其他 数据没变,然后保存,由于(1)查出的数据就有 title,content,所以保存时候 title 和 content


不会是 null。
--------------------------------------------------------------------------------------------------------
3:Hibernate的delete 操作 : 
  Session session = HibernateSessionFactory.getSession();
  Transaction trans = session.beginTransaction();
  News news = new News(); 
news.setId(8); //用下面那句效果一样,只是多了句select 。
  News news = (News)session.get(News.class, 8);
  session.delete(news); 
  trans.commit();
  HibernateSessionFactory.closeSession(); 
//注意,只能通过 id 来删除数据,不能通过 title 或 content 来删除,会报缺少标示符错误。
(2)使用hql来删除(可作批量删除) 
  Session session = HibernateSessionFactory.getSession(); 
  String hql = "delete Billdetail where name>'detailName1'";
  Query query = session.createQuery(hql);
  int ref = query.executeUpdate(); 
  session.beginTransaction().commit(); 
  System.out.println("delete dates=>"+ref); //操作条数 
session.close();
--------------------------------------------------------------------------------------------------------
4:Hibernate 的 select 操作 :
   Hibernate 的 select 操作非常丰富,这里写常用的: 
 (1)criteria 查询:
Session session = HibernateSessionFactory.getSession();
  Criteria c = session.createCriteria(News.class);//News 是类,所以 N 大写 
  c.add(Expression.lt("date", "date5"));
  c.add(Expression.between("date", "date1", "date8"));
  c.addOrder(Order.desc("date")); 
List<News> list = c.list(); 
  for(int i=0;i<list.size();i++) { 
System.out.println(list.get(i).getId()+":"+list.get(i).getDate());
 
  HibernateSessionFactory.closeSession(); 
//比较符合面向对象的概念,因为库表和JAVA类已经作了映射关系,注意Hibernate的所有操作都是针对JAVA类的,而不是库表,所以要


区分大小写。 
上面的查询相当于 sql 是:
  select * from news where date < 'date5' and date BETWEEN 'date1' and 'date8' ORDER by date desc; 
-------------------------------------------------------------------------------------------------------- (2).HQL查询 
Query query = session.createQuery("from News "); 
List<News> list = query.list(); //遍历同上
HQL是Hibernate主推的查询方式,和普通SQL语句也比较接近,但很重要一点不同就是 HQL 中 from 后面的是 JAVA 类名,不是库 表名,切忌!!其


它就是如果查询全字段 "select *" 可以省略不写。


!当不是查询全字段,或者是从两张表中联合查询数据时,返回的是一个数组:
Session session = HibernateSessionFactory.getSession(); 
Query query = session.createQuery("select n.id,n.title,u.username from News as n,User u");
List list = query.list();//这里每一行都是一个1维数组 
for(int i=0;i<list.size();i++) {
Object []o = (Object[])list.get(i); //转型为数组
int id = (Integer)o[0];  //和select中顺序的类型相对应,可以是类
String title = (String)o[1]; 
String username = (String)o[2];
  System.out.println("id:"+id+" , "+"title"+title+" , "+username);
 
HibernateSessionFactory.closeSession(); 
//查询结果集的大小(和 Hibernate2 中稍微有点不同) 
(Integer)session.createQuery("select count(*) from User").iterate().next(); 
----------------------------------------------------------------------------------------------------
 (3).SqlQuery 查询 
List<News> list = session.createSQLQuery("select * from News").addEntity(News.class).list(); 
 //addEntity 不能忘记,这种查询方式是把查询好的结果放到一个实体中,再遍历操作,不推荐使用。
 SqlQuery 查询一些字段时候用 addScalar: 
SQLQuery query = session.createSQLQuery("select id,title from News"); 
query.addScalar("id", Hibernate.INTEGER); //注册字段类型,同下 
query.addScalar("title",new org.hibernate.type.StringType());
  List list = query.list(); 
for(int i=0;i<list.size();i++) {
  Object[] o = (Object[])list.get(i);
  int id = (Integer)o[0]; 
String title = (String)o[1];
System.out.println("id:"+id+" , title:"+title);

//javabean 的属性可以作为命名的查询参数(HQL)
  Session session = HibernateSessionFactory.getSession();
  Transaction trans = session.beginTransaction() 
Query query = session.createQuery("from room in class Room where room.name=:a")
  query.setParameter("a", "room1"); //和 prepareStatement 相似
List<Room> list = query.list();
  for(int i=0;i<list.size();i++) { 
System.out.println(list.get(i).getName()+":"+list.get(i).getDescription()); 

trans.commit();
  HibernateSessionFactory.closeSession() 

原创粉丝点击