第二章 Hibernate增删改查参考

Hibernate中对增删改查的小结

mysql中库表News,字段如下

id|int|auto_increment|primarykey

title|varchar

content|varchar

date|varchar

1:Hibernate的insert操作

Sessionsession=HibernateSessionFactory.getSession();

Newsnews=newNews();

news.setContent("mycontent");

news.setTitle("mytitle");

news.setDate("mydate");//news是VO

Transactiontrans=session.beginTransaction();

session.save(news);//news是PO

trans.commit();//任何有关数据库更新的操作都是commit后进数据库的

HibernateSessionFactory.closeSession();

2:Hibernate的update操作

Sessionsession=HibernateSessionFactory.getSession();

Newsnews=newNews();

news.setId(103);//id不可少,Hibernate只通过id来查找数据库

news.setContent("updatecontent");

news.setTitle("updatetitle");

Transactiontrans=session.beginTransaction();

session.update(news);

trans.commit();

HibernateSessionFactory.closeSession();

注意这里我们更新数据不想对date进行更新,所以没写setDate,但Hibernate会认为我们是想把date设置为null,所以如果要更新表中一些字段,最好用下面的方法。

Sessionsession=HibernateSessionFactory.getSession();

Transactiontrans=session.beginTransaction();

Newsnews=(News)session.get(News.class,103);//*****(1)

news.setDate("updatedate");//*****(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操作

Sessionsession=HibernateSessionFactory.getSession();

Transactiontrans=session.beginTransaction();

Newsnews=newNews();

news.setId(8);//用下面那句效果一样,只是多了句select

//Newsnews=(News)session.get(News.class,;

session.delete(news);

trans.commit();

HibernateSessionFactory.closeSession();

注意,只能通过id来删除数据,不能通过title或content来删除,会报缺少标示符错误。

使用hql来删除(可作批量删除)

Sessionsession=HibernateSessionFactory.getSession();

Stringhql="deleteBilldetailwherename>'detailName1'";

Queryquery=session.createQuery(hql);

intref=query.executeUpdate();

session.beginTransaction().commit();

System.out.println("deletedates=>"+ref);//操作条数

session.close();

4:Hibernate的select操作

Hibernate的select操作非常丰富,这里写常用的:

1.criteria查询

Sessionsession=HibernateSessionFactory.getSession();

Criteriac=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(inti=0;i<list.size();i++)

{

System.out.println(list.get(i).getId()+":"+list.get(i).getDate());

}

HibernateSessionFactory.closeSession();

比较符合面向对象的概念,因为库表和JAVA类已经作了映射关系,注意Hibernate的所有操作都是针对JAVA类的,而不是库表,所以要区分大小写。

上面的查询相当于sql是:select*fromnewswheredate<'date5'anddateBETWEEN'date1'and'date8'ORDERbydatedesc;

2.HQL查询

Queryquery=session.createQuery("fromNews");

List<News>list=query.list();//遍历同上

HQL是Hibernate主推的查询方式,和普通SQL语句也比较接近,但很重要一点不同就是HQL中from后面的是JAVA类名,不是库表名,切忌!!!其它就是如果查询全字段"select*"可以省略不写。

当不是查询全字段,或者是从两张表中联合查询数据时,返回的是一个数组:

Sessionsession=HibernateSessionFactory.getSession();

Queryquery=session.createQuery("selectn.id,n.title,u.usernamefromNewsasn,Useru");

Listlist=query.list();//这里每一行都是一个1维数组

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

{

Object[]o=(Object[])list.get(i);//转型为数组

intid=(Integer)o[0];//和select中顺序的类型相对应,可以是类

Stringtitle=(String)o[1];

Stringusername=(String)o[2];

System.out.println("id:"+id+","+"title"+title+","+username);

}

HibernateSessionFactory.closeSession();

查询结果集的大小(和Hibernate2中稍微有点不同)

(Integer)session.createQuery("selectcount(*)fromUser").iterate().next();

3.SqlQuery查询

List<News>list=session.createSQLQuery("select*fromNews").addEntity(News.class).list();

addEntity不能忘记,这种查询方式是把查询好的结果放到一个实体中,再遍历操作,不推荐使用。

SqlQuery查询一些字段时候用addScalar:

SQLQueryquery=session.createSQLQuery("selectid,titlefromNews");

query.addScalar("id",Hibernate.INTEGER);//注册字段类型,同下

query.addScalar("title",neworg.hibernate.type.StringType());

Listlist=query.list();

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

{

Object[]o=(Object[])list.get(i);

intid=(Integer)o[0];

Stringtitle=(String)o[1];

System.out.println("id:"+id+",title:"+title);

}

javabean的属性可以作为命名的查询参数(HQL)

Sessionsession=HibernateSessionFactory.getSession();

Transactiontrans=session.beginTransaction()

Queryquery=session.createQuery("fromroominclassRoomwhereroom.name=:a")

query.setParameter("a","room1");//和prepareStatement相似

//Roomroom1=newRoom();

//room1.setName("room1");

//Queryquery=session.createQuery("fromroominclassRoomwhereroom.name=:name");//如果用javabean设置参数来查询,=:name的name一定和Room中对应

//query.setProperties(room1);

List<Room>list=query.list();

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

{

System.out.println(list.get(i).getName()+":"+list.get(i).getDescription());

}

trans.commit();

HibernateSessionFactory.closeSession()

相关推荐