Hibernate课堂小结一

来源:互联网 发布:淘宝旧版本6.11.3 编辑:程序博客网 时间:2024/05/18 03:41

                               Hibernate原理与应用

JDBC数据库连接

JDBC的优点:

直接底层操作,提供了很简单、便捷的访问数据库的方法,跨平台性比较强。灵活性比较强,可以写很复杂的SQL语句。

JDBC的缺点

1.因为JAVA是面向对象的,JDBC没有做到使数据能够面向对象的编程,使程序员的思考仍停留在SQL语句上。

2.操作比较繁琐,很多代码需要重复写很多次。

3.如果遇到批量操作,频繁与数据库进行交互,容易造成效率的下降。

Java面向对象语言,对象模型,其主要概念有:继承、关联、多态等;数据库是关系模型,其主要概念有:表、主键、外键等。

解决办法

       1使用JDBC手工转换。

       2使用ORM(Object Relation Mapping对象关系映射)框架来解决。

Hibernate是一个开源ORM框架。

ORM全称Object Relation Mapping,即对象关系映射。它是一种用来完成对象模型到关系模型的映射技术。就是把应用程序中的对象数据持久化到关系数据库的表的一种技术。

使用ORM( Object Relation Mapping )框架来解决。主流的ORM框架有JBoss公司的Hibernate、Oracle公司的TopLink、Apache组织的OJB、Sun公司的JDO。

简单的说:ORM能利用面向对象的思想开放基于关系型数据库的应用程序,它的主要工作是将对象数据保存到关系数据库的表中,以及将关系数据库表中数据读入到对象中。

使用Hibernate框架步骤:

           1.新建java项目,并加入相应的jar包,及jdbc驱动。

           2.创建持久化类

           3. 准备数据库表

           4.创建配置文件 hibernate.cfg.xml

           5.创建映射文件 xxx.hbm.xml

           6.创建测试文件

注:配置文件hibernate.cfg.xml和hibernate.properties,XML和properties两种,这两个文件的作用一样,提供一个即可,推荐XML格式,下载目录/etc下是示例配置文件。

可以在配置文件指定:

       数据库的URL、用户名、密码、JDBC驱动类、方言等。

       启动时Hibernate会在CLASSPATH里找这个配置文件。

配置文件详解:

Hibernate.connection.url  表示要链接的数据库地址

Hibernate.connection.driver_class    表示要链接的数据库的驱动类

Hibernate.connection.username     要连接的数据库的用户名

Hibernate.connection.password      要连接的数据库的密码

Hibernate.dialect   表示要使用的数据库的类型

          org.hibernate.dialect.MySQL5Dialect       mysql数据库

          org.hibernate.dialect.Oracle9Dialect        oracle数据库

          org.hibernate.dialect.SQLServerDialect    SQLServer数据库

hibernate.hbm2ddl.auto

          validate:加载hibernate时验证创建表结构

          update:加载hibernate时自动更新数据库结构,如果表存在不用创建,如果不存在就创建。

          create:每一次加载hibernate时都创建表结构

          create-drop:加载hibernate时创建,退出时删除

基本概念和CURD

开发流程

1、由Domain object -> mapping->db。(官方推荐)

2、由DB开始,用工具生成mapping和Domain object。(使用较多)

3、由映射文件开始。

Domain Object限制

       1、默认的构造方法(必须的)。

       2、有无意义的标示符id(主键)(可选)

       3、非final的,对懒加载有影响(可选)

       Domain Java Object(User)

       public class User {

              private int id;

              private String name;

              private Date birthDay;

              //getter setter…

}

1、xx.hbm.xml

<?xml version="1.0"?>

<hibernate-mapping package=“cn.itcast.domain">

<class name="User" table="user">

       <id name="id">

              <generator class="native"/>

       </id>

       <property name="name"/>

       <property name="birthday”/>

</class>

</hibernate-mapping>

对象关系映射文件:把面向对象中的实体类对象映射到数据库中的实体(表的记录),把实体类之间的关联关系也映射到数据库中多个表之间的相互关系中。这样,在Hibernate中对这些实体对象的操作就直接转换为对数据库表的记录的操作。

 

1.Configuration类

   是Hibernate的入口,它负责配置并启动Hibernate。Hibernate通过Configuration的实例加载配置文件信息,然后读取指定对象关系映射文件的内容并创建SessionFactory实例。

2.SessionFactory接口

  负责初始化Hibernate。一个SessionFactory实例对应一个数据库。应用程序从SessionFactory中获得Session实例。

3.Session接口

   Session被称为持久化管理器,负责管理与持久化相关的操作:存储、更新、删除和加载对象。

4.Transaction接口

是Hibernate框架的事务接口。它对底层的事务接口做了封装。包括:JDBC API和JTA。

 

Session的缓存(一级缓存)

Session的CRUD方法以及调用查询接口的list(),iterate()方法时,如果session缓存中不存在相应的对象,Hibernate就会把该对象加入到第一级缓存中,如果session缓存中已经存在这个对象,就不需在去数据库加载,而直接使用缓存中的对象。

    flush: 进行清理缓存(此时缓存中的数据并不丢失)的操作,让缓存和数据库同步执行一些列sql语句,但不提交事务,;

     commit:先调用flush() 方法,然后提交事务. 则意味着提交事务意味着对数据库操作永久保存下来。  

session的缓存一般交由hibernate框架自动管理。

1、初始化代码(只做一次)

        Configuration cfg = new Configuration();

        cfg.configure(“config.cfg.xml”);

        也可以通过cfg.setProperty设置属性。

        SessionFactory sessionFactory = cfg.buildSessionFactory()

       2、模板代码

Session session = null;Transaction tx = null;

try{

       session = sessionFactory.openSession();

       tx = session.beginTransaction();

       //…你的代码save,delete,update,get…

       tx.commit();

}catch(Exception e){

       if(tx !=null)tx.rollback();throw e;

}finally{

       if(session != null)session.close();

}

Session的几个主要方法

       1、save保存数据

       2、delete,删除对象

       3、update,更新对象,如果数据库中没有记录,会出现异常。

       4、get,根据ID查,会立刻访问数据库。

       5、Load,根据ID查,(返回的是代理,不会立即访问数据库)。

       6、saveOrUpdate (根据ID和version的值来确定是save或update

 

 

实例:第一个Hibernate程序

 

User.java

public class User {

       private int id;

       private String name;

       private Date birthday;

       public int getId() {

              return id;

       }

       public void setId(int id) {

              this.id = id;

       }

       public String getName() {

              return name;

       }

       public void setName(String name) {

              this.name = name;

       }

       public Date getBirthday() {

              return birthday;

       }

       public void setBirthday(Date birthday) {

              this.birthday = birthday;

       }

}

 

Hibernate.cfg.xml

<!DOCTYPE hibernate-configuration PUBLIC

       "-//Hibernate/Hibernate Configuration DTD 3.0//EN"

       "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

       <session-factory>

           <property name="connection.driver_class">com.mysql.jdbc.Driver</property>

        <property name="connection.url">jdbc:mysql:///newdb</property>

        <property name="connection.username">root</property>

        <property name="connection.password">root</property>

           <property name="dialect">org.hibernate.dialect.MySQLDialect</property>

              <property name="show_sql">true</property>

              <property name="hbm2ddl.auto">update</property>

              <mapping resource="com/hbsi/domain/User.hbm.xml"/>

       </session-factory>

</hibernate-configuration>

 

User.hbm.xml

<?xml version="1.0"?>

<!DOCTYPE hibernate-mapping PUBLIC

      "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

          "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

 

<hibernate-mapping package="com.hbsi.domain">

    <class name="User" >

        <id name="id">

            <generator class="increment" />

        </id>

        <property name="name" />

        <property name="birthday" />

    </class>

</hibernate-mapping>

 

 

测试类:

public class Demo1 {

       public static void main(String[] args) throws ParseException {

             

              User user = new User();

              user.setName("eeee");

              user.setBirthday(DateFormat.getDateInstance().parse("1980-12-11"));

             

              Configuration cfg = new Configuration().configure();

              //cfg.configure(); //读取hibernate.cfg.xml信息

             

              SessionFactory sessionFactory = cfg.buildSessionFactory();

              Session session = sessionFactory.openSession(); //相当于jdbc中的connection

             

              session.beginTransaction();

              session.save(user);

              session.getTransaction().commit();

              session.close();

       }

}

 

原创粉丝点击