- 浏览: 64014 次
- 性别:
- 来自: 武汉
最新评论
-
武大鹏程加内特:
武大鹏程加内特 写道任雅菲 写道
3Q 呵呵
你QQ多少? ...
第十一章 MyEclipse自动生成映射文件(上) -
武大鹏程加内特:
zzy90718 写道
第九章 Spring配置数据连接池 -
武大鹏程加内特:
任雅菲 写道
3Q 呵呵
第十一章 MyEclipse自动生成映射文件(上) -
武大鹏程加内特:
任雅菲 写道
第十一章 MyEclipse自动生成映射文件(上) -
任雅菲:
第十一章 MyEclipse自动生成映射文件(上)
Hibernate中对增删改查的小结
mysql中库表News,字段如下
id | int | auto_increment | primary key
title | varchar
content | varchar
date | 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,;
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()
mysql中库表News,字段如下
id | int | auto_increment | primary key
title | varchar
content | varchar
date | 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,;
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()
发表评论
-
第十七章 离线,命名查询
2010-05-03 20:29 827 离线查询 在Hibernate中,查询有两种方式,一种是 ... -
第十六章 批量插入,多类分页查询
2010-05-03 20:26 957批量插入 有时候我们需要做导入的功能,那么这个时候就需要批量插 ... -
第十五章 事务边界问题
2010-05-03 20:24 2593 事务边界问题 我们先回顾一下我们现在写的代码: 可 ... -
第十四章 缓存的使用
2010-05-03 20:18 828缓存的使用 我们先来模拟一个缓存的机制 以查询学生为示例: p ... -
第十三章 lazy懒加载
2010-05-03 20:12 947lazy属性:懒加载 作用:当调用方法的时候才去执行要执行的S ... -
第十二章 继承关系的映射
2010-05-03 20:07 856继承模型 在企业中经常会有员工的分类 我们在Java对象模型 ... -
第十一章 MyEclipse自动生成映射文件(下)
2010-04-28 19:57 1253选中必要的选项 选择主键生成的策略: 设置类名与数据库 ... -
第十一章 MyEclipse自动生成映射文件(上)
2010-04-28 19:44 3193 设置数据库连接 转换视图 创建新的数据库连接 设置 ... -
第十章 Inverse的作用
2010-04-28 19:04 743Inverse的作用 我们还是拿上一章的班级与学生的示例来说 ... -
第九章 级联,集合映射
2010-04-28 19:03 766级联开关 1.级联是指两个对象之间的操作联动关系,对一个对象执 ... -
第八章 Hibernate分页
2010-04-28 18:55 656Hibernate分页 -
第七章 多对多
2010-04-28 18:50 637 多对多 什么情况下会出现多对多呢?比如学生选课就会出现多 ... -
第六章 一对一关系
2010-04-28 18:49 746什么时候采用一对一关系映射呢? 比如我们有时在网上注册的时候, ... -
第五章 一对多关系
2010-04-28 18:44 800 一对多的关系 在学生与班级对象模型中,通常多个学生实体对应 ... -
第四章 多对一关系
2010-04-28 18:43 838今天我们讲多表操作, 多对一的关系 何为多对一呢? 示例: 学 ... -
第三章 对象的状态
2010-04-28 18:42 852 current_session_context_class ... -
第二章 策略及对象增删改查操作
2010-04-28 18:37 1068Generator 主键生成器 incre ... -
第二章 对象关系数据库映射基础
2010-04-28 18:35 902Generator 主键生成器 incre ... -
第一章 Hibernate环境搭建
2010-04-28 18:34 1417如果是WEB工程,我们只需 ...
相关推荐
hibernate增删改查
因项目还在开发,所以本人只拿出一块单独的struts+hibernate增、删、改、查来演示,具体的一些包一看就知道; 项目直接在MyEclipse6.0运行,环境是里面自带的,用过的人都知道。本人测试没有问题。 具体的页面...
hibernate增删改查事例的web工程,对增删改查做练习。
hibernate 增删改查
spring+struts2+hibernate 增删改查
struts+hibernate增删改查 word版 从最基础最详细开始
基于Struts 2+Hibernate实现员工管理系统。一个单位有多个部门,每个部门有多名员工,每个员工只属于一个部门。基于该要求,实现员工和部门的管理(包括添加、查询、删除和修改等操作),并且要实现部门与员工之间的...
SpringMVC+Spring+HIbernate增删改查,MyEclipse项目
一个简单的hibernate小例子,只含有一张表,3个字段,增删改查,简单实用,MySQL数据库id字段自增
自己写的Struts2+Hibernate的整自己写的Struts2+Hibernate的整合小项目,里面有对一张表的增删改查合小项目,里面有对一张表的增删改查
使用Hibernate实现增删改查,将我们需要的dialect.class的值复制粘贴到我们自己建的文件中 url,username,password 的值就用之前我们讲过的即可; 配置文件中的 <property name="show_sql">true</property> 是为了在...
这里使用hibernate+strtus做的一个增删改查,特别试用刚开始学习这个技术的新的朋友。数据库使用的是mysql.这个例子是用户和部门之间的一个小的查询。有一个关联。
使用struts+Hibernate+MySQL框架在MyEclipse6.5中实现增删改查
HibernateUtil 分页 增删改查 封装 HibernateUtil 分页 增删改查 封装 HibernateUtil 分页 增删改查 封装
Hibernate+struts 增删改查
struts2+hibernate增删改查的示例源代码,带数据库脚本,包含必须的jar包,myeclipse6导入即可测试使用,内含代码说明
struts2+hibernate 增删改查,数据库也在里面,下载即用,测试完毕了的