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.实现接