ORM(Object Relationship Mapping 对象关系映射)
写SQL的不便之处:
1.不同的数据库使用的SQL语句不同,如PL/SQL和T/SQL
2.同样的功能在不同的数据库中有不同的实现方式,如分页。
3.程序过分依赖SQL将对程序的移植、拓展和维护带来极大的不便
Hibernate对JDBC进行了非常轻量化的封装
在Eclipse上安装Hibernate Tools插件
使用Hibernate步骤
1.创建Hibernate配置文档(Hibernate.cfg.xml)
2.创建持久化类
3.创建对象-关系映射文件
4.通过Hibernate API编写访问数据库代码
(准备工作导入Hibernate相关jar包和mysql的jdbc相关jar包)
Hibernate.cfg.xml常用配置
1.hibernate.show_sql是否把Hibernate运行时的sql语句输出到控制台
2.hibernate.format_sql输出到控制台的sql是否排版,建议设为true
3.hbm2ddl.auto可以帮助由java代码生成数据库脚本,进而生成具体的表结构。create | update | create-drop | validate
//谨慎使用create,因为会删除原有表
4.hibernate.default_scheme默认的数据库
5.hibernate.dialect方言
Session简介
因为Hibernate不建议直接使用jdbc的connection操作数据库,而是通过使用session来操作数据库
session可以理解为操作数据库的对象
session与connection是多对一的关系,每个session都有一个与之对应的connection对象,一个connection不同时刻可以供多个session使用
操作数据库就需要调用session的各种方法,如save() update() delete() createQuery()等
Transaction(事务)简介
hibernate对数据库的操作都是封装在事务当中的,并且是默认是非自动提交的方式。所以用Session保存对象时,如果不开启事务,数据是不会写到数据库中的
,所以要执行transaction.commit();
Session详解
如何获得Session对象?
1.openSession();
2.getCurrentSession();
如果使用的是getCurrentSession需要在hibernate.cfg.xml文件中进行配置:
如果是本地事务(jdbc事务)
<property name = "hibernate.current_session_context_class">thread</property>
如果是全局事务(jta事务)
<property name = "hibernate.current_session_context_class">jta</property>
openSession()与getCurrentSession()的区别:
1.getCurrentSession()在事务提交或回滚之后会自动关闭,openSession()需要手工关闭,如果不关闭,多次连接之后会导致连接池溢出
2.getCurrentSession()使用现有的session对象(单例模式),而openSession()每次创建新的session
hbm配置文件常用设置
单一主键
1.assigned 由java应用程序负责生成,即手工赋值
2.native由底层数据库自动生成标识符,如果是Mysql就是increment,如果是oracle就是sequence,等等
基本类型
对象类型
组件属性
单表操作:save delete update get/load
get/load 的区别:
1.在不考虑缓存的情况下,get方法是立即发送sql语句,返回持久化对象;load方法返回的是代理对象,该代理对象只保存了实体对象的id
,在使用对象的非主键属性时才会发sql语句
2.get方法在查询到数据库不存在的对象时,返回的是null;而load返回的是orh.hibernate.ObjectNotFoundException
单向一对多映射:
1.在一方定义一个多方的集合;
2.创建了相应的类之后,还要创建相应的关系映射文件:XXX.hbm.xml
3.在映射文件中配置各个属性,以及配置一对多关联关系。例如一个班级对多个学生:
<set name="students" table="student">
<!--指定关联的外键列-->
<key column="gid"></key>
<one-to-many class="XXX.XXX.XXX.Student"></one-to-many>
</set>
4.在hibernate核心配置文件Hibernate.cfg.xml当中指定映射文件的路径
<mapping resourse="XXX.XXX.XXX.Grade.hbm.xml">
<mapping resourse="XXX.XXX.XXX.Student.hbm.xml">
5.进行一对多操作时,就相当于对集合操作
单向多对一映射
1.在多方定义一个一方引用;
2.在映射文件中配置多对一关联关系,如多个学生对一个班级:
<many-to-one name="grade" class="XXX.XXX.XXX.Grade" column="gid"></many-to-one>
3.使用时就在多方中使用一方的引用
双向多对一映射
1.在一方映射文件中配置一对多关联关系:
<set name="students" table="student">
<!--指定关联的外键列-->
<key column="gid"></key>
<one-to-many class="XXX.XXX.XXX.Student"></one-to-many>
</set>
与此同时在多方映射文件中配置多对一关联关系:<many-to-one name="grade" class="XXX.XXX.XXX.Grade" column="gid"></many-to-one>
2.在代码中操作时,也要同时一方通过集合设置多方,多方通过引用设置一方
3.为了性能考虑设置inverse属性
<set>节点的inverse指定关联关系的控制方向,默认为由one方来维护
关联关系中,inverse = “false”为主动方,由主动方负责维护关联关系
在一对多关联中,只能把one方的inverse设置为true,则由many方为主动方
4.如不想在代码操作时即操作一方又操作多方,则可在<many-to-one> 或 <one-to-many>
设置cascade属性,此时系统会自动判断,如:如果给学生关联班级,没有该学生,则会自动添加学生
上述学习来自慕课网及网上学习感想。