Hibernate(1)

Hibernate的优势:

屏蔽了应用程序与数据库之间的联系,让应用程序操作数据库更加简单。

当底层数据库变换后,应用程序不需要改变,方便。

1.Hibernate JavaBean编写条件:

(1)尽量使用包装类型

(2)建议实现序列化接口

(3)一定要有无参构造方法

2.创建xml映射文件(框架的配置文件要先引入约束)

文件命名规范:实体类名.hbm.xml

<hibernate-mapping>
    <!--
        name属性:指定实体类的全路径名
        table属性:指定对应表的名字,如果类名与表名一致,可以省略table属性
    -->
    <class name="xxx" table="xxx">
        <!--
            id标签:指定实体类中哪个属性是与表中的主键列对应
            name属性:指定实体类中属性的名字
            column属性:指定表中对应列的名字,如果属性与列名一致,可以省略
            generator标签:指定主键的生成策略
            class属性:指定具体的生成策略,native表示根据底层的数据库来选择,mysql就自增长,Oracle就采用序列来维护主键
        -->
        <id name="xxx" column="cust_id">
            <generator class="native">
            </generator>
        </id>
            <!--
                property标签,指定出了主键属性以外的其他属性
                name属性:指定属性名
                column属性:指定表中对应得列名,如果属性名与列名一致,可以省略
            -->
        <property name="xxx" column="xxx"></property>
    </class>
</hibernate-mapping>

3.编写核心配置文件

文件命名规范:hibernate.cfg.xml

<hibernate-configuration>
	<session-factory>
		<!-- 配置数据库连接信息 -->
		<!-- 配置数据库驱动类名 -->
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<!-- 配置数据库连接地址 -->
		<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/xxxx</property>
		<!-- 数据库用户名 -->
		<property name="hibernate.connection.username">xxxx</property>
		<!-- 数据库密码 -->
		<property name="hibernate.connection.password">xxxx</property>
		<!-- 配置数据库方言 -->
		<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
		<!-- 打印sql语句 -->
		<property name="hibernate.show_sql">true</property>
		<!-- 格式化sql语句 -->
		<property name="hibernate.format_sql">true</property>
		<!-- 指定映射文件路径 -->
		<mapping resource="xxxx.hbm.xml"/>
	</session-factory>
</hibernate-configuration>

测试: 1. 实例化configuration的对象

           2. 读取核心配置文件(调用configure方法)

           3. 构造SessionFactory(调用buildSessionFactory)

           4. 获取session(调用openSession)

           5. 开启事务(调用beginTransaction)

           6. 保存

           7. 提交事务

           8.释放资源

4.API

4.1 Configuration类:加载hibernate的核心配置文件,可以获取SessionFactory对象

常用方法:

默认构造函数:
		它只能加载类的根路径下,名称为hibernate.properties的配置文件。不能加载xml
configure():
		它用于加载类的根路径下,名称为hibernate.cfg.xml的配置文件。
buildSessionFactory():
		根据配置文件,构建SessionFactory
addResource(String url);
		指定映射文件的位置
addClass(Class clazz);
		指定实体类的字节码。

4.2 SessionFactory接口:hibernate核心接口,一般应用一个SessionFactory,最好是应用启动时就完成初始化。

常用方法:

openSession(); 每次都是生成一个新的Session
getCurrentSession();获取前线程的Session

Hibernate工具类:

private static final SessionFactory sf;
	
	static{
		sf = new Configuration().configure().buildSessionFactory();
	}
	
	/**
	 * 获取Session的工具方法
	 * @return
	 */
	public static Session openSession(){
		return sf.openSession();
	}

配置连接池:

<!-- 指定采用c3p0数据库连接池 -->
<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
<!-- 在数据库连接池中可用的数据库连接最小数目 -->
<property name="hibernate.c3p0.min_size">5</property>
<!-- 在数据库连接池中可用的数据库连接最大数目 -->
<property name="hibernate.c3p0.max_size">20</property>
<!-- 数据库连接的过期时间,超过该时间则清除,单位为秒 -->
<property name="hibernate.c3p0.timeout">5000</property>
<!-- 每多少秒检查所有连接池中的空闲连接 -->
<property name="hibernate.c3p0.idle_test_period">3000</property>

4.3 Session接口:

4.3.1 概述

a. session实在hibernate中使用最频繁的接口. 也被称之为持久化管理器. 他提供了和持久化有关的操作,比如:添加、修改、删除、加载和查询实体对象

b. session是应用程序与数据库之间交互操作的一个单线程对象, 是hibernate运作的中心

c. session是线程不安全的

d. 所有持久化对象必须在session的管理下才可以进行持久化操作

e. session对象有一个一级缓存, 显示执行flush之前, 所有的持久化操作的数据都缓存在session对象处

f. 持久化类与session关联起来后就具有了持久化的能力

4.3.2 特点

a. 不是线程安全的, 应避免多个线程使用同一个session实例

b. session是轻量级的, 它的创建和销毁不会消耗太多资源. 应每次为客户请求分配独立的session实例

c. session有一个缓存, 被称之为hibernate的一级缓存. 每个session实例都有自己的缓存

4.3.3 常用方法

save(Object entity);  :保存一个实体到数据库
update(Object entity);:更新一个实体
delete(Object entity);:删除一个实体
get(Class clazz,Serializable id);:根据id查询一个实体。参数的含义:Class表示要查询的实体类字节码。Serializable就是查询的条件。
beginTransaction();:开启事务,并返回事务对象
load(Class clazz,Serializable id):根据id查询一个实体。参数的含义:Class表示要查询的实体类字节码。Serializable就是查询的条件。

4.4 Transaction接口:主要用于管理事务,是hibernate的数据库事务接口

常用方法:
commit() 提交事务
rollback() 回滚事务

5 get 和 load 的区别 

(1)查询的时机不一样

    get方法任何时候都是立即加载,只要一调用get马上发起数据库查询

    load默认延迟加载,真正用到对象的非OID字段数据才发起查询

    load方法可以通过配置的方式改为立即加载

<class name="Customer" table="cst_customer" lazy="false">

(2)返回的结果不一样

    get方法永远返回查询的实体类对象

    load方法当是延迟加载时,发挥的是实体类的代理对象

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值