Hibernate学习(一)


Hibernate是一个持久化,ORM框架。
持久化:瞬时状态和持久状态之间的转换机制。

Hibernate 使用步骤

1 导入本地jar包或者使用maven pom下载对应hiberante jar包。
2 封装实体类User(采用正向工程方式 实体类–表)
3 配置实体类映射文件 User.hbm.xml(开头与实体类名称一致)

<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>

    <class name="com.sunsharing.htest.entity.User" table="t_user" schema="htest">
        <id name="userId" column="user_id">
            <generator class="native"></generator>
        </id>
        <property name="userName" column="user_name"/>
        <property name="userPwd" column="user_pwd"/>
    </class>
</hibernate-mapping>

4.配置Hibernate总配置文件


<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">
            <![CDATA[jdbc:mysql://localhost:3306/htest?useUnicode=true&characterEncoding=utf8]]>
        </property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">1234</property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        
        <mapping resource="com/sunsharing/htest/entity/User.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

5.编写测试类

import com.sunsharing.htest.entity.User;
import org.hibernate.SessionFactory;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistryBuilder;

public class Main {
    public static void main(String[] args) {
        //1 初始化配置文件,并读取里面的信息
        Configuration config = new Configuration().configure();
        //2 配置注册器   hibernate3 不需要配置注册器,而hibernate4则需要
        ServiceRegistryBuilder srb = new ServiceRegistryBuilder().applySettings(config.getProperties());
        //3 创建sessionfactory
        SessionFactory sf = config.buildSessionFactory(srb.buildServiceRegistry());
        //4 开启会话
        Session  session = sf.openSession();
        //5 开启事务
        Transaction tran = session.beginTransaction();
        //6进行相关语句操作
        try {
            // User user = new  User();
            // user.setUserName("对对对");
            // user.setUserPwd("111");
            // session.save(user);
            User user = (User)session.get(User.class,1);
            System.out.print(user.getUserName() + "   " + user.getUserPwd());
        } catch (Exception e) {
            //事务回滚
            tran.rollback();
        }
        //7 提交事务
        tran.commit();
        //8 关闭会话
        session.close();
    }
}

对象三种状态:

瞬时状态(new 出来的对象)
持久状态(当前对象和数据库表的一行数据一致,且所在的session没有关闭)
游离(脱管)状态(当前对象和数据库表的一行数据一致,且所在的session关闭)
三种状态切换:
当对象是通过new方式构造出来的,那么此时该对象是瞬时状态对象,当调用save方法时,那么该对象由瞬时状态变成持久状态,当持久状态的对象调用delete方法后,该对象变成瞬时状态。当一个对象是由get或者load等方法获取得到,那么此时该对象就是持久状态的对象,当session关闭时,持久状态的对象都是脱管状态的对象。注意:瞬时状态和脱管状态是没有办法直接转换的。

JDBC和Hibernate区别
相同点:1 都是数据库操作的中间件
2 事务都需要显式提交
3 都需要关闭
不同点:1 JDBC采用sql,Hibernate采用HQL。
2 JDBC操作的是表,Hibernate操作的是实体类
3 JDBC操作的对象都是瞬时的,Hibernate操作的对象都是可持久化的。

持久化持久类需要注意的事项:
1、为类的持久化字段声明访问方法(get/set),Hibernate对JavaBeans风格的属性实行持久化。
2、实现一个默认的构造方法(无参的),这样的话Hibernate就可以使用Constructor.newInstance()方法来实例化对象。
3、如果是集合类型的属性,它的类型必须定义为集合的接口,例如:List、Set(不要定义成ArrayList)
4、提供一个标识属性(主键Identifier property),如果没有该属性,一些功能不起作用,比如:级联更新,session.saveOrUpdate()。

get和load的区别
1 get方法返回的是真实对象,load方法返回的是代理对象
2 当查询的数据id是没有数据对应的情况下,get返回的是空对象,load方法会抛出异常。

HQL特点
它是完全面向对象的查询语句,查询功能非常强大,具备继承、多态和关联等特性

HQL用面向对象的方式生成SQL

  • 以类和属性来代替表和数据列
  • 支持多态
  • 支持各种关联
  • 减少了SQL的冗余

HQL支持所有的关系数据库操作

  • 连接(joins,包括Inner/outer/full joins),笛卡尔积(cartesian products)
  • 投影
  • 聚合和分组
  • 排序
  • 子查询
  • SQL函数

主键生成器
1 native 本地化,意味着无论底层是哪种数据库,hibernate会自动选择最合适的方式实现主键的自增。任何数据库都能使用。
2 increment 在插入数据之前,先查询当前表的最大id,在+1后作为插入数据的主键,任何数据库都能使用。
3 Identity 要求底层数据库必须支持主键自增,比如Mysql和SQL Server数据库
4 sequence 要求底层数据库要支持采用序列方式生成id,比如Oracle和DB2 数据库
5 assigned 要求主键id必须是String类型的值,且该id的值由程序员自己录入。
6 uuid-hex 由计算机生成的128bit的字符串id。采用该主键自增策略的优点:保证多并发环境下id值都是唯一的,且有利于数据库的合并。

关系关联映射

多对一:
在实体类,多的一方的属性要有一的方法的类对象;
在多的实体类映射文件中配置many-to-one节点

<!-- 在该节点配置外键对象 -->
 <many-to-one name="person_role" cascade="all" lazy="false" ></many-to-one>

需要通过提交多的一方进而影响一的方法,得通过配置cascade=all来实现。如果需要通过查询多的一方,顺便取出一的方法,得通过配置lazy=false来实现(如果是默认懒加载方式,那么会出现no session问题)

一对多:
在实体类,一的一方编写set集合存储多的一方
在一的实体类映射文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值