Hibernate的应用步骤:
1、导入.jar包
2、创建 entryBean <===bean.hbm.xml===>bean表 + hibernate.cfg.xml配置文件
3、写DAO数据操作类(类似下面的)
Hibernate框架实例化方法:
通过写实例化代码(非通过web.xml配置,通过web容器实例化)
public class HibernateUtils {
private static Configuration conf;
private static SessionFactory factory;
// conf 对象只要加载一次就可以了,如果放入 openSession 方法中效率会降低
static {
conf = new Configuration();//调用 Hibernate 的 API,用于装载 Hibernate 配置文件
conf.configure();//在类路径中装载默认的配置文件 hibernate.cfg.xml,如果配置文件关联了映射文件,同时也装载了映射信息
// conf.configure(new File("hibernate.cfg.xml"));//如果装载指定的配置文件
factory = conf.buildSessionFactory();//创建 SessionFactory
}
public static Session openSession() {
return factory.openSession();//创建 Session(Hibernate 提供的访问接口)
}
}
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操作
void delete( int id) {
Session session = HibernateSessionFactory.getSession();
Transaction trans = session.beginTransaction();
// News news = new News();
// news.setId(8); //用下面那句效果一样,只是多了句select
News news = (News)session.get(News.class, id);
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操作 (查询返回的都是一个List集合),如:findById()
Hibernate的select操作非常丰富,这里写常用的:
1.criteria对象化查询 (适用情况:面向对象操作,革新了数据库操作方式,易读。缺点:适用面较HQL有限)
try{
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"));
c.add(Restrictions.eq("aname",name));//eq是等于,gt是大于,lt是小于,or是或
c.add(Restrictions.eq("apassword", password));
List<News> list = c.list();
for(int i=0;i<list.size();i++) {
System.out.println(list.get(i).getId()+":"+list.get(i).getDate());
}
}finally{
if(session !=null) session .close();
}
HibernateSessionFactory.closeSession();
比较符合面向对象的概念,因为库表和JAVA类已经作了映射关系,注意Hibernate的所有操作都是针对JAVA类的,而不是库表,所以要区分大小写。上面的查询相当于sql是:
select * from news where date < 'date5' and date BETWEEN 'date1' and 'date8' ORDER by date desc;
2.HQL查询 (hibernate自己的查询语言,和SQL语法接近,具有跨数据库的优点,仅适用于Hibernate框架)
try{
Session s=HibernateUtil.getSession();
//from后面是对象,不是表名
String hql="from Admin as admin where admin.aname=:name";//使用命名参数,推荐使用,易读。
Query query=s.createQuery(hql);
query.setString("name", name);
List<Admin> list=query.list();
/*
String hql = "from Test where id = "+id; String hql = "select user from Test as user where user.name like:name";
session = sessionFactory.openSession();
Query query = session.createQuery(hql);
//query.setInteger("id",id.intValue()); query.setString("name","%"+name+"%");
list = query.list();
*/
for(Admin admin:list){
System.out.println(admin.getAname());
}
}finally{
if(s!=null)
s.close();
}
HQL是Hibernate主推的查询方式,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查询 (适用:不熟悉HQL,不打算转数据库平台的朋友,万能方法 缺点:破坏跨平台不易维护不面向对象)
List sql() {
Session s = HibernateUtil.getSession();
Query q = s.createSQLQuery("select * from News").addEntity(User.News);
List<News> list = q.list();
s.close();
return 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()
4.动态分离查询DetachedCriteria (适用:面向对象操作,分离业务与底层不需要字段属性摄入到Dao实现层。 缺点:适用面较HQL有限)
static List dc(DetachedCriteria dc) {
Session s = HibernateUtil.getSession();
Criteria c = dc.getExecutableCriteria(s);
List rs = c.list();
s.close();
return rs;
}
DetachedCriteria dc = DetachedCriteria.forClass(User.class);
int id = 1;
if (id != 0)
dc.add(Restrictions.eq("id", id));
Date age = new Date();
if (age != null)
dc.add(Restrictions.le("birthday", age));
List users = dc(dc);
System.out.println("离线查询返回结果:" + users);
5.例子查询
static List example(User user) {
Session s = HibernateUtil.getSession();
List<User> users = s.createCriteria(User.class).add(
Example.create(user)).list();
// List<User>
// users2=s.createCriteria(User.class).add((Example.create(user)).ignoreCase())
// .createCriteria("child").add((Example.create(user))).list();
return users;
}
6.命名查询 (适用:万能方法,有点像ibatis轻量级框架的操作,方便维护。 缺点:不面向对象,基于hql和sql有一定缺陷)
List namedQuery(int id) {
Session s = HibernateUtil.getSession();
Query q = s.getNamedQuery("getUserById");
q.setInteger("id", id);
return q.list();
}
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.sy.vo.User" table="user" catalog="news">
</class>
<!-- 命名查询:定义查询条件 -->
<query name="getUserById">
<![CDATA[from User where id=:id]]>
</query>
<!-- 命名查询中使用sql,不推荐使用,影响跨数据库
<sql-query name="getUserById2">
<![CDATA[select * from User where ]]>
</sql-query> -->
</hibernate-mapping>
相关推荐
因项目还在开发,所以本人只拿出一块单独的struts+hibernate增、删、改、查来演示,具体的一些包一看就知道; 项目直接在MyEclipse6.0运行,环境是里面自带的,用过的人都知道。本人测试没有问题。 具体的页面...
hibernate增删改查
hibernate -增\删\改\查
hibernate 增删改查
Hibernate+struts 增删改查
自己写的Struts2+Hibernate的整自己写的Struts2+Hibernate的整合小项目,里面有对一张表的增删改查合小项目,里面有对一张表的增删改查
struts2-hibernate增删改查
hibernate+struts实现jsp增删改查分页! hibernate实现对数据库的操作,struts实现对表单的操作! 实现了分页功能! (注:本本项目中文会出现乱码,我还没有解决!附有数据库文件!)
hibernate增删改查事例的web工程,对增删改查做练习。
spring4+hibernate4实现的增删改查,有完整的配置和jar包,使用的是mysql数据库,需要自己创建表
myeclipse+mysql+hibernate+struts2增删改查,中国人民银行企培源代码,亲测可用。
Hibernate入门-搭建框架实现基本的增删改查(源码)Hibernate入门-搭建框架实现基本的增删改查(源码)
使用struts+Hibernate+MySQL框架在MyEclipse6.5中实现增删改查
使用Hibernate实现增删改查,将我们需要的dialect.class的值复制粘贴到我们自己建的文件中 url,username,password 的值就用之前我们讲过的即可; 配置文件中的 <property name="show_sql">true</property> 是为了在...
基于Struts 2+Hibernate实现员工管理系统。一个单位有多个部门,每个部门有多名员工,每个员工只属于一个部门。基于该要求,实现员工和部门的管理(包括添加、查询、删除和修改等操作),并且要实现部门与员工之间的...
使用jsf1.2+spring3.0+hibernate3.3实现集成,利用annotation实现自动对象管理注入,用户表的登录增删改查操作,包括验证码ajax集成,消息机制,国际化处理,自定义转换器,自定义验证器等 qq:38732796 欢迎讨论
spring+struts2+hibernate 增删改查