`

hibernate基础-初步

阅读更多
类拟框架:Apache OJB,JDO,Toplink,EJB(CMP)JPA,IBatis
适合查询及单个对象的编辑,适合于对象之间有清晰的关系,不适用于批量修改,关系复杂的对象及特定的sql功能
第一个项目
1 新建java项目
2 创建User Library,加入如下jar
  * hibernate_home/hibernate3.jar
  * hibernate_home/lib/*.jar
  * MySql jdbc验动
3 创建hibernate配置文件hibernate.cfg.xml,为了便于调试最好加入log4j配置文件
<hibernate-configuration>
    
<session-factory >
     
<!-- 连接串 -->
        
<property name="hibernate.connection.url">jdbc:mysql://localhost/hibernate1</property>
        
<!-- 驱动类 -->
        
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        
<!-- 用户名 -->
        
<property name="hibernate.connection.username">root</property>
        
<!-- 密码 -->
        
<property name="hibernate.connection.password">root</property>
        
<!-- 适配器(反译) -->
        
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        
<property name="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</property>
        
<!-- 显示sql语句 -->
        
<property name="hibernate.show_sql">true</property>
        
<!-- 可以防表被重新建立 -->
        
<property name="hibernate.hbm2ddl.auto">update</property>

        
<mapping resource="com/myobj/hibername/User.hbm.xml"/>
    
</session-factory>
    
</hibernate-configuration>

4 定义实体类,继承java.io.ser
5 定义User类的映射文件User.hbm.xml

<hibernate-mapping>
    
<class name="com.myobj.hibername.User" table="">
        
<id name="id">
            
<generator class="uuid"/>
            
<generator class="native"/>
             
<generator class="assigned"/>
        
</id>
        
<property name="name"/>
        
<property name="password"/>
        
<property name="createTime"/>
        
<property name="expireTime"/>
    
</class>
</hibernate-mapping>
6 将User.hbm.xml文件加入到hibernate.cfg.xml文件中
<session-factory >
        
<property name="hibernate.connection.url">jdbc:mysql://localhost/hibernate1</property>
        
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        
<property name="hibernate.connection.username">root</property>
        
<property name="hibernate.connection.password">root</property>
        
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        
        
<mapping resource="com/myobj/hibername/User.hbm.xml"/>
</session-factory>
7 编写hbm2ddl工具类,将实体类生成数据库表,手工建数据库
public class ExportDB {
    
public static void main(String[] args) {
        
//读取hibernate.cfg.xml文件,默认为.properties文件,
        
//读取xml文件用new Configuration().configure()
        Configuration cfg=new Configuration().configure();
        
//生成工具类
        SchemaExport export=new SchemaExport(cfg);
        
//生成数据库表
        export.create(truetrue);
    }

}
8 开发客户端Client类添加数据
public class Client {

    
public static void main(String[] args) {
        
//读取hibernate.cfg.xml文件
        Configuration cfg=new Configuration().configure();
        
//创建SessionFactory,与数据库绑定,一个数据库对应一个SessionFactory,与二级缓存相关,为重量级对象,是线程安全的
        SessionFactory factory=cfg.buildSessionFactory();
        
//
        Session session=null;//不同于connction,是对其的封装,用时到连接池拿来conn
        
        
try {
            session 
= factory.openSession();
            
//开启事务
            session.beginTransaction();
            
            User user 
= new User();
            user.setName(
"张三");
            user.setPassword(
"123");
            user.setCreateTime(
new Date());
            user.setExpireTime(
new Date());
            
//保存数据
            session.save(user);
            
//提交事务
            session.getTransaction().commit();
        }
 catch (Exception e) {
            e.printStackTrace();
            
//回滚事务
            session.getTransaction().rollback();
        }
finally{
            
if(session!=null){
                
if(session.isOpen()){
                    
//关闭session,是非线程安程的
                    session.close();
                }

            }

        }

    }

}
******session.update()相关类都改,session.merge()只改当前类,session.delete(),都要开启事务******
9 为了方便跟踪SQL执行,在hibernate.cfg.xml中加入
<property name="hibernate.show_sql">true</property>



持久化对象的状态
1 瞬时对象:使用new操作符初始化的对象不是立刻就持久的。
2 持久化对象:持久实例是任何具有数据库标识的实便函。
3 离线对象:Session关闭后持久化对象就变为离线对名象。
持久化对象的生命周期:

Transient对象new但在数据库中没有记录且没有被Session管理,
Persistent对象数据库中有记录,并Session在管理。在清理缓存(或脏数据检查)时与数据库同步。Session与一级缓存绑定.
Detached对象数据库中有记录,Session没有管理它。


创建HibernateUtils类,对重量级容量进行优化:
public class HibernateUtils {
    
private static SessionFactory factory;
    
//static块只执行一次
    static{
        
try {
            Configuration cfg 
= new Configuration().configure();
        }
 catch (Exception e) {
            e.printStackTrace();
        }

    }


    
public static SessionFactory getSessionFactory(){
        
return factory;
    }

    
    
public static Session getSession(){
        
return factory.openSession();
    }

    
    
public static void closeSession(Session session){
        
if(session!=null){
            
if(session.isOpen()){
                session.close();
            }

        }

    }

}


Session接口的CRUD操作
瞬时/持久化/离线对象示例:
public class SessionTest extends TestCase {
    
public void testSave1(){
        Session session
=null;
        Transaction tx
=null;
        User user
=null;
        
try{
            session
=HibernateUtils.getSession();
            
            tx
=session.beginTransaction();
            
//Transient状态,未被Session管理
            user=new User();
            user.setName(
"ssssss");
            user.setPassword(
"123");
            user.setCreateTime(
new Date());
            user.setExpireTime(
new Date());
            
//persistent状态,被Session管理,当属性发生改变的时候,hibernate会自动和数据库同步。
            session.save(user);
            
            user.setName(
"王五");
            tx.commit();
        }
catch(Exception e){
            e.printStackTrace();
            tx.rollback();
        }
finally{
            HibernateUtils.closeSession(session);
        }

        
//detached状态,被Session踢出缓存,未被管理
        user.setName("张三");
        
try {
            session 
= HibernateUtils.getSession();
            session.beginTransaction();
            session.update(user);
            session.getTransaction().commit();
        }
 catch (Exception e) {
            e.printStackTrace();
            session.getTransaction().rollback();
        }
finally{
            HibernateUtils.closeSession(session);
        }

    }

}

Session接口
加载数据get与load的区别:
    lazy代理:get没有,   load支持lazy;
查不存在数据:get返回null,load抛出异常ObjectNotFoundException

//get查询数据
public void testReadByGetMethod1(){
        Session session
=null;
        
try {
            session
=HibernateUtils.getSession();
            session.beginTransaction();
            
//采用get方式,马上发出查询sql,加载波User对象
            User user=(User)session.get(User.class"5c68c3ed206a327d01206a3281fa0001");
http://www.blogjava.net/Images/OutliningIn
分享到:
评论

相关推荐

    Struts Hibernate Spring集成开发宝典.part1

    这样安排的好处是使读者在具备了初步知识的基础上对组件进行更深入的理解,并通过一系列贴近实际的实例来提高读者对组件的把握能力以及迅速丰富开发经验。 本书的配套光盘中包含了本书所有实例的完整源代码以及开发...

    Struts Hibernate Spring集成开发宝典

    这样安排的好处是使读者在具备了初步知识的基础上对组件进行更深入的理解,并通过一系列贴近实际的实例来提高读者对组件的把握能力以及迅速丰富开发经验。  本书的配套光盘中包含了本书所有实例的完整源代码以及...

    Struts,Hibernate,Spring集成开发宝典

    这样安排的好处是使读者在具备了初步知识的基础上对组件进行更深入的理解,并通过一系列贴近实际的实例来提高读者对组件的把握能力以及迅速丰富开发经验。 本书的配套光盘中包含了本书所有实例的完整源代码以及...

    轻量级Java EE企业应用实战——Struts 2+Spring+Hibernate整合开发chap2

    本书适合于有较好的 Java编程基础,或有初步JSP、Servlet基础的读者阅读。尤其适合于对Struts 2、Spring、Hibernate了解不够深入,或对Struts 2+ Spring+Hibernate整合开发不太熟悉的开发人员阅读。

    Struts,Hibernate,Spring集成开发宝典8

    这样安排的好处是使读者在具备了初步知识的基础上对组件进行更深入的理解,并通过一系列贴近实际的实例来提高读者对组件的把握能力以及迅速丰富开发经验。 本书的配套光盘中包含了本书所有实例的完整源代码以及...

    Struts,Hibernate,Spring集成开发宝典5

    这样安排的好处是使读者在具备了初步知识的基础上对组件进行更深入的理解,并通过一系列贴近实际的实例来提高读者对组件的把握能力以及迅速丰富开发经验。 本书的配套光盘中包含了本书所有实例的完整源代码以及...

    Struts,Hibernate,Spring集成开发宝典7

    这样安排的好处是使读者在具备了初步知识的基础上对组件进行更深入的理解,并通过一系列贴近实际的实例来提高读者对组件的把握能力以及迅速丰富开发经验。 本书的配套光盘中包含了本书所有实例的完整源代码以及...

    Struts,Hibernate,Spring集成开发宝典6

    这样安排的好处是使读者在具备了初步知识的基础上对组件进行更深入的理解,并通过一系列贴近实际的实例来提高读者对组件的把握能力以及迅速丰富开发经验。 本书的配套光盘中包含了本书所有实例的完整源代码以及...

    Struts,Hibernate,Spring集成开发宝典4

    这样安排的好处是使读者在具备了初步知识的基础上对组件进行更深入的理解,并通过一系列贴近实际的实例来提高读者对组件的把握能力以及迅速丰富开发经验。 本书的配套光盘中包含了本书所有实例的完整源代码以及...

    Struts,Hibernate,Spring集成开发宝典3

    这样安排的好处是使读者在具备了初步知识的基础上对组件进行更深入的理解,并通过一系列贴近实际的实例来提高读者对组件的把握能力以及迅速丰富开发经验。 本书的配套光盘中包含了本书所有实例的完整源代码以及...

    轻量级J2EE 企业应用实战 Struts+Spring+Hibernate整合开发

    本书所介绍的内容是作者多年J2EE 开发经验的总结,内容涉及Struts 、...本书适用于有较好的Java 编程基础,有初步的J2EE 编程基础的读者。本书既可以作为J2EE 初学者 的入门书籍,也可作为J2EE 应用开发者的提高指导。

    轻量级J2EE企业应用实战:Struts+Spring+Hibernate 整合开发.part1

    本书所介绍的内容是作者多年J2EE开发经验的总结,内容涉及三个...  本书适用于有较好的Java编程基础,有初步的J2EE编程基础的读者。本书既可以作为J2EE初学者的入门书籍,也可作为J2EE应用开发者的提高指导。

    轻量级J2EE企业应用实战:Struts+Spring+Hibernate 整合开发.part2

    本书所介绍的内容是作者多年J2EE开发经验的总结,内容涉及三个...  本书适用于有较好的Java编程基础,有初步的J2EE编程基础的读者。本书既可以作为J2EE初学者的入门书籍,也可作为J2EE应用开发者的提高指导。

    轻量级J2EE企业应用实战:Struts+Spring+Hibernate 整合开发.part3

    本书所介绍的内容是作者多年J2EE开发经验的总结,内容涉及三个...  本书适用于有较好的Java编程基础,有初步的J2EE编程基础的读者。本书既可以作为J2EE初学者的入门书籍,也可作为J2EE应用开发者的提高指导。

    J2EE 企业应用实战:Struts+Spring+Hibernate 整合开发

    本书所介绍的内容是作者多年J2EE开发经验的总结,... 本书适用于有较好的Java编程基础,有初步的J2EE编程基础的读者。本书既可以作为J2EE初学者的入门书籍,也可作为J2EE应用开发者的提高指导。 非常不错的学习资料!

    轻量级 J2EE 企业应用实战:Struts+Spring+Hibernate 整合开发.part2.rar

     本书适用于有较好的Java编程基础,有初步的J2EE编程基础的读者。本书既可以作为J2EE初学者的入门书籍,也可作为J2EE应用开发者的提高指导。 分为两部分,part1地址 http://download.csdn.net/source/1070521

    轻量级 J2EE 企业应用实战:Struts+Spring+Hibernate 整合开发.part1.rar

     本书适用于有较好的Java编程基础,有初步的J2EE编程基础的读者。本书既可以作为J2EE初学者的入门书籍,也可作为J2EE应用开发者的提高指导。 分两部分:part2地址http://download.csdn.net/source/1070540

    輕量級 J2EE 企業應用實戰:Struts+Spring+Hibernate整合開發 (第一部分)

    輕量級 J2EE 企業應用實戰:Struts+Spring+Hibernate整合... 本书适用于有较好的Java 编程基础,有初步的J2EE 编程基础的读者。本书既可以作为J2EE 初学者 的入门书籍,也可作为J2EE 应用开发者的提高指导。

    輕量級 J2EE 企業應用實戰:Struts+Spring+Hibernate整合開發 (第三部分)

    輕量級 J2EE 企業應用實戰:Struts+Spring+Hibernate整合開發... 本书适用于有较好的Java 编程基础,有初步的J2EE 编程基础的读者。本书既可以作为J2EE 初学者 的入门书籍,也可作为J2EE 应用开发者的提高指导。

Global site tag (gtag.js) - Google Analytics