hibernate的增删改查详解!

来源:互联网 发布:淘宝新店铺如何推广 编辑:程序博客网 时间:2024/05/22 02:06

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,

(2)对 PO 进行 date 的更新,其他 数据没变,然后

(3)保存,由于(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 来删除,会报缺少标示符错误。 使用 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 相似 // // // Room room1 = new Room(); room1.setName("room1"); Query query = session.createQuery("from room in class Room where room.name=:name"); //如果用 javabean 设置参数来查询,=:name 的 name 一定和 Room 中对应 // query.setProperties(room1); 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()