Hibernate入门

O/R Mapping

什么是O/R Mapping?
    对象-关系映射是一门非常实用的工程技术,它实现了Java应用中的对象到关系数据库中的表的自动的(和透明的)持久化,使用元数据(meta data)描述对象与数据库间的映射。

O/R Mapping的优点
    提高生产率
    可维护性
    更好性能
    

持久层技术比较


展成<


优点

缺点

SQL/

JDBC

成熟,流行,使用DAO模式

代码烦杂,可读性差,维护困难,移植困难

Entity Bean

CMPEJB1.1之后),未来的EJB3

错误的设计。不可移植,依赖性强,不可序列化,不支持多态的关联查询

JDO

简单、透明、标准


不够成熟

Apache OJB

性能、稳定性,属于Apache 基金组织

文档资源太少,支持标准太多成了负担(ODMG 3.0JDO1.0

iBATIS

可以控制更多的数据库操作细节。实用于遗留系统的改造和对既有数据库的

复用。

持久层封装不够彻底,只是一个DBHelper

Hibernate

成熟、流行、功能强大。并逐渐发

应用Hibernate

Hibernate的组成

Hibernate-cfg.xml基础信息配置文件

持久化类的设计

持久化类和关系数据库的映射

应用的开发

Hibernate-cfg.xml

<hibernate-configuration>
<session-factory>
    <property name="dialect">
        org.hibernate.dialect.MySQLDialect
    </property>
    <property name="connection.url">
        jdbc:mysql://localhost:3306/test
    </property>
    <property name="connection.username">root</property>
    <property name="connection.driver_class">
        com.mysql.jdbc.Driver
    </property>
    <property name="myeclipse.connection.profile">
        mysql connection
    </property>
        <mapping resource="com/lovo/po/Stu.hbm.xml" />
</session-factory>
</hibernate-configuration>

持久化Java类必须遵循的原则

为类的持久化字段申明访问方法(get/set)。Hibernate对JavaBeans风格的属性实行持久化。

实现一个默认的构造方法(constructor)。这样的话Hibernate就可以使用Constructor.newInstance()来实例化它们。

如果是集合类型的属性,它的类型必须定义为集合的接口。例如:List、Set。

提供一个标识属性(identifier property)。如果没有该属性,一些功能不起作用,比如:级联更新(Cascaded updates)Session.saveOrUpdate()。

持久化类和关系数据库的映射


*.hbm.xml 文件

<hibernate-mapping>
    <class name="com.lovo.po.Stu" table="stu" catalog="test">
     <cache usage="read-write" />
        <id name="stuId" type="java.lang.Integer" unsaved-value="none">
            <column name="stu_id" />
            <generator class="increment" />
        </id>
        <property name="stuName" type="java.lang.String">
            <column name="stu_name" length="10" />
        </property>
        <property name="stuSec" type="java.lang.String">
            <column name="stu_sec" length="10" />
        </property>
        <property name="stuSco" type="java.lang.Integer">
            <column name="stu_sco" />
        </property>
    </class>
</hibernate-mapping>

Hibernate核心接口

Configuration类

概述:Configuration 类负责管理Hibernate 的配置信息。它包括如下内容:
    - Hibernate运行的底层信息:数据库的URL、用户名、密码、     JDBC驱动类,数据库Dialect,数据库连接池等。
        Hibernate映射文件(*.hbm.xml)。

Hibernate配置的两种方法:
    - 属性文件(hibernate.properties)。
        调用代码:Configuration cfg = new Configuration();
    - Xml文件(hibernate.cfg.xml)。
      调用代码:Configuration cfg = new Configuration().configure();

SessionFactory

概述:应用程序从SessionFactory(会话工厂)里获得Session(会话)实例。它在多个应用线程间进行共享。通常情况下,整个应用只有唯一的一个会话工厂——例如在应用初始化时被创建。然而,如果你使用Hibernate访问多个数据库,你需要对每一个数据库使用一个会话工厂。
     会话工厂缓存了生成的SQL语句和Hibernate在运行时使用的映射元数据。

调用代码:
SessionFactory sessionFactory = cfg.buildSessionFactory();

Session(会话)

概述:
    Session代表与数据库之间的一次操作,它的概念介于Connection和Transaction之间。
     Session也称为持久化管理器,因为它是与持久化有关的操作接口。
     Session通过SessionFactory打开,在所有的工作完成后,需要关闭。
    它与Web层的HttpSession没有任何关系。

调用代码
Session session = sessionFactory.openSession();

Transaction(事务)

概述:
      它将应用代码从底层的事务实现中抽象出来——这可能是一个JDBC事务,一个JTA用户事务或者甚至是一个公共对象请求代理结构(CORBA)——允许应用通过一组一致的API控制事务边界。这有助于保持Hibernate应用在不同类型的执行环境或容器中的可移植性。
调用代码:
    Transaction tx = session.beginTransaction();

注:使用Hibernate进行操作时(增、删、改)必须显示的调用Transaction(默认:autoCommit=false)。

Query

概述:
Query(查询)接口允许你在数据库上执行查询并控制查询如何执行。查询语句使用HQL或者本地数据库的SQL方言编写。

调用代码:
Query query = session.createQuery(“from User”);

实例

持久化类-User.java
public class User {
    private Long id;
    private String name;
    private Date birthday;
    private String email;
    public User(){
    }
    public User(String name,Date birthday,String email){
    .....…Get/Set
}

映射文件-User.hbm.xml
<hibernate-mapping>
<class name="com.test.um.User" table="TBL_USER">
   <id name="id" column="ID">
       <generator class="native"/>
   </id>
   <property name="name" column="NAME"/>
   <property name="birthday" column="BIRTHDAY"/>
   <property name="email" column="EMAIL"/>
</class>
</hibernate-mapping>

应用-UserTest.java

public void testCreate() throws Exception{
        Configuration cfg = new Configuration();        cfg.addURL(UserTest.class.getResource("/com/test/um/User.hbm.xml"));
        SessionFactory sessionFactory = cfg.buildSessionFactory();        
        Session session = sessionFactory.openSession();
        Transaction tx = session.beginTransaction();        
        SimpleDateFormat format = new SimpleDateFormat("yyyy-mm-dd");
        User user = new User("Jack",format.parse("1980-04-                                            12"),"Jack@yahoo.com.cn");        
        session.save(user);
        tx.commit();        
        session.close();
}

应用-UserTest.java

保存用户:session.save(user);
修改用户:session.update(user);
保存或修改用户:session.saveOrUpdate(user);
删除用户:session.delete(user);
删除所有用户:session.delete(“from User ”);

查询用户名为“test”的用户:
Query query = session.createQuery("from User where user.name = :name");
query.setParameter(“name",user.getName());
 User findUser = (User) query.list().get(0);

映射文件中unsaved-value 属性

判断对一个对象的操作是保存还是更新

显式使用session.save()或者session.update()操作对象的时候,用不到unsaved-value

根据ID值判断操作的对象是否是新的内存临时对象

属性值 - none :总是更新 - any: 总是存储 - null : ID为空(null)时存储 - valid: ID为空(null)或者指定值时存储



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值