hibernate学习笔记

ORM(Object/Relationship Mapping):对象/关系映射

写SQL语句存在的问题:
(1)不同的数据库使用的SQL语法不同。比如:PL/SQL与T/SQL;
(2)同样的功能在不同的数据库中有不同的实现方式。比如分页SQL;
(3)程序过分依赖SQL对程序的移植和扩展,维护等带来的麻烦。

hibernate就是一种ORM框架技术。
Hibernate对JDBC进行了非常轻量级的对象封装。

用Eclipse开发,先导入插件(Hibernate-tools)
步骤:
(1)创建Hibernate的配置文件(先导入HIbernate必须的jar包、导入MySQL的jdbc驱动、junit包)
(2)创建持久化类
(3)创建对象-关系映射文件
(4)通过Hibernate API编写访问数据库的代码

通过Hibernate API编写访问数据库的代码

Configuration config=new Configuration().configure(); //创建配置对象
ServiceRegistry serviceRegistry=new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();//创建服务注册对象
sessionFactory=config.buildSessionFactory(serviceRegistry); //创建会话工厂对象
session=sessionFactory.openSession();  //打开对话
transaction=session.beginTransaction(); //打开事务

hibernate.cfg.xml常用配置
这里写图片描述
这里写图片描述
Session简介
不建议直接使用jdbc的connection操作数据库,而是通过使用session操作数据库。
session可以理解为操作数据库的对象。
session与connection,是多对一关系,每个session都有一个与之对应的connection,一个connection不同时刻可以供多个session使用。
把对象保存在关系数据库中需要调用session的各种方法,如:save(),update(),delete(),createQuery()等。

transaction简介
hibernate对数据库的操作都是封装在事务当中,并且默认是非自动提交的方式。所以用session保存对象时,如果不开启事务,并且手工提交事务时,对象并不会真正保存在数据库中。
如果想让hibernate像jdbc那样自动提交事务,必须调用session对象的doWork()方法,获得jdbc的connection后,设置其为自动提交事务模式。(注意:通常并不推荐这样做)

session详解
如何获得session对象?
1)openSession
2)getCurrentSession
如果使用getCurrentSession需要在hibernate.cfg.xml文件中进行配置:
如果是本地事务(jdbc事务)
thread
如果是全局事务(jta事务)
jta
openSession与getCurrentSession的区别
1、getCurrentSession在事务提交或者回滚之后会自动关闭,而openSession需要手动关闭。如果使用openSession而没有手动关闭,多次之后会导致连接池溢出。
2、openSession每次创建新的session对象,getCurrentSession使用现有的session对象。

hbn配置文件常用设置

<hibernate-mapping 
         schema="schemaName"
         catalog="catalogName"
         default-cascade="cascade_style"    //级联风格
         default-access="field|property|ClassName"     //访问策略
         default-lazy="true|false"    //加载策略
         package="packagename"
/>
<class
        name="ClassName"
        table="tableName"
        batch-size="N"
        where="condition"
        entity-name="EntityName"
/>
<id                                        //主键
       name="propertyName"
       type="typename"
       column="column_name"
       length="length"
      <generator class="generatorClass"/>    //主键生成策略
</id>

这里写图片描述
基本类型:
这里写图片描述
这里写图片描述
对象类型:
这里写图片描述
MySql不支持标准SQL的CLOB类型,在MySql中,用TEXT,MEDIUMTEXT及LONGTEXT类型来表示长度超过255的长文本数据。

组件属性:
实体类中的某个属性属于用户自定义的类的对象。

  <component name="address" class="Address">
         <property name="postcode" column="POSTCODE"></property>
         <property name="phone"      column="PHONE"></property>
         <property name="address"    colunm="ADDRESS"></property>
</component>  

单表CRUD操作实例:
save
update
delete
get/load (查询单个记录)
get与load的区别:
在不考虑缓存的情况下,get方法会在调用之后立即向数据库发出sql语句,返回持久化对象。
load方法会在调用后返回一个代理对象。该代理对象只保存了实体对象的id,直到使用对象的非主键属性时才会发出sql语句。
查询数据库中不存咋的数据时,get方法返回null,load方法抛出异常org.hibernate.ObjectNotFoundException

总结:
1、什么是ORM?为什么要使用Hibernate?
2、Hibernate开发的基本步骤?
(1)编写配置文档Hibernate.cfg.xml
(2)编写实体类
(3)生成对应实体类的映射文件并添加到配置文档中
(4)调用Hibernate API进行测试
3、什么是session?
类似于jdbc开发使用的conneciton对象,使用hibernate操纵数据库从本质而言就是调用session的各种API函数来实现
4、open Sesssion与getCurrentSession
5、单表操作常用方法有哪些?
6、get与load

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值