hibernate 总结一

虽然现在我们用hibernate4基于注解很方便,但看了传智博客hibernate3的视频觉得老师讲的很好,所有总结下来。视频网上直接能搜到下载。

一:

以一个小例子作为驱动,讲解hibernate3的开发,hibernate需要的jar包在lib下,hibernate3,还有sql驱动

二:配置文件的含义

讲解配置文件的配置以及含义,hibernate项目po需要注意的:必须有无参构造方法,有id(可选),非final的(可选)

为啥系统能找到src下的配置文件?因为她去classpath下寻找

三:简化hibernate代码

1.hibernate推荐驱动方式PO类---配置文件----表开发中也很常见表----po类----hbm配置文件

2.hibernate生成执行操作那段代码里SessionFactory相当于DriverManagesession相当于Connection可以简化得到session

的步骤,写一个工具类需要session调用工具类不希望继承,使用final修饰不希望被实例化构造方法为peivate,把里面你需要

的定义为static

里面加载配置文件只需要一次,放在static静态块中代码如下

publicfinalclassHibernateUtil{

privatestaticSessionFactorysessionFactory;

privatestaticSessionsession;

privateHibernateUtil(){

}

static{

Configurationcfg=newConfiguration();

cfg.configure();

sessionFactory=cfg.openSessionFactory();

}

//sessionFactory的get方法是static

publicstaticSessionFactorygetSessionFactory(){

returnsessionFactory;

}

publicstaticSessiongetSession(){

returnsessionFactory.openSession();

}

}

4.save

staticvoidaddObject(Objectobj){

Sessions=null;

Transactiontx=null;

try{

s=HibernateUtil.getSession();

tx=s.beginTransaction();

//和persist(Object)对象区别如果事务没开启,persist不执行,save会插入再回滚

s.save(obj);

tx.commit();

//如果有异常,会抛出并自动回滚

}finally{

if(s!=null){

s.close();

}

}

}

四:Session介绍

publicUsergetUser(id){

s=HibernateUtil.getSession();

//不用开启事务session相当于包含了数据的mapkey是类名,value是类信息,get先获取类,再根据id获取某一行

ClassuserClass=User.class;//类的类反射,得到的class里有类的所有信息

Useruser=s.get(UserClass,id);和load(Object,id)和get一样的,懒加载用

returnuser;

}

五:对象的三种状态

1.saveOrUpdate,merge,调用merge对象还是脱管的

2.处于持久状态时发生变化自动提交到数据库

处于脱管不会自动提交会调用update方法不知道对象处于瞬时还是托管用SaveOrUpdate()---持久的

3.新建是瞬时的-----session.save()在session里是持久的-------s.closesession关闭后是托管的

六:完善的hibernateUtil

staticvoidUpdate(Objectobj){

Sessions=null;

Transactiontx=null;

try{

s=HibernateUtil.getSession();

tx=s.beginTransaction();

s.update(obj);

tx.commit();

//如果有异常,会抛出并自动回滚

}finally{

if(s!=null){

s.close();

}

}

}

staticvoidDelete(Objectobj){

Sessions=null;

Transactiontx=null;

try{

s=HibernateUtil.getSession();

tx=s.beginTransaction();

s.delete(obj);

tx.commit();

//如果有异常,会抛出并自动回滚

}finally{

if(s!=null){

s.close();

}

}

}

staticObjectgetById(Classobjclass,Serializableid){

Sessions=null;

try{

s=HibernateUtil.getSession();

Objo=s.get(objclass,id);

returno;

}finally{

if(s!=null){

s.close();

}

}

}

八关键字用反引号括起来配置文件里

九Criteria查询方式

hql查询

staticvoidquery(Stringname)

Sessions=null;

try{

s=HibernateUtil.getSession();

Stringhql="fromUserasuserwhereuser.name=?";

Queryquery=s.createQuery(hql);

query.setString(0,name);

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

//query.uniqueResult();返回object确定只有一个时候使用

//

for(Useruser:list){

System.out.println(user.getName);

}

}finally{

if(s!=null){

s.close();

}

}

}

Criteria条件查询更面向对象,官方推荐hql,因为功能更全面

staticvoidquery(Stringname)

Sessions=null;

try{

s=HibernateUtil.getSession();

Criteriac=s.createCriteria(User.class);

c.add(Restrictions.eq("name",name));

c.add(Restrictions.lt("birthday",newDate()));

//分页

c.setFirstResult(0);

c.setMaxResults(10);

List<User>list=c.list();

//c.uniqueResult();返回object确定只有一个时候使用

for(Useruser:list){

System.out.println(user.getName);

}

}finally{

if(s!=null){

s.close();

}

}

}

十:

用hibernate访问数据操作

步骤:

1.设计类User

2.设计UserDao接口

3.加入hibernate.jar和其他依赖jar包

4.编写映射文件hbm,配置文件:必须参数urlnamepassword方言driverclasshbm2ddl.automapping映射类

5工具类获取session

6.实现接

相关推荐