ORM:
对象-关系映射(Object Relational Mapping)
把对象模型表示的对象映射到基于SQL的关系模型数据结构中
操作实体对象的时候,不需要和复杂的sql语句打交道,只需要简单的操作实体对象的属性和方法
javaBean:
符合三点要求:
1 属性私有
2 提供共有的getter和setter方法
3 公共无参构造
ORM只是一种行为规范
主流的ORM框架是Hibernate,iBatis,JPA...
ORM中基本上都有缓存:一级缓存和二级缓存
缺点:
对象之间的关系更加复杂
自动生成的SQL效率可能不会太高
Hibernate:
官网链接:http://hibernate.org/
易百教程:http://www.yiibai.com/hibernate/
参考博客:http://blog.csdn.net/dawanganban/article/details/13748235
Hbernate是一个开放源代码的对象关系映射框架(ORM)
对JDBC进行了非常轻量级的对象封装(消耗资源少)
将pojo与数据库表建立映射关系,是一个全自动的ORM框架
Hibernate可以自动生成SQL语句,自动执行
Hibernate可以应用在任何使用JDBC的场合,即可以在Java的客户端程序使用,也可以在Servlet/Jsp的Web应用中使用
具有数据库兼容性(通过dialog)
MyBatis映射的是Dao层,映射文件只写SQL语句即可
Hibernate映射的是pojo层,直接将表映射成对象
Hibernate框架体系结构:
1 映射类文件:pojo
2 主配置文件:
用于描述数据库连接信息,数据库方言,关联映射文件
命名规则:Hibernate.cfg.xml 或者 hibernate.properties
位置:源码目录的根目录(Maven项目放在resources目录下)(配置文件的头部可以参考jar包)
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
3 映射描述文件:
用于描述映射类及属性与DB表的字段之间的对应关系
命名规则:实体类名.hbm.xml
位置:和实体类在同一目录下(配置文件的头部可以参考jar包)
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
4 主要API
Configration:主要用于加载主配置文件,获取数据库连接
SessionFactory:用于创建session对象,封装了映射信息以及预定义的SQL
Session:用于对象操作,完成CRUD操作
Transaction:用于事务的处理,进行CRUD时要注意,因为Hibernate自动提交事务是关闭的
Query:用于执行HQL查询语句(HQL属于面向对象的查询,语句中没有表名和字段名)
Hibernate持久化类的编写规则:
1 必须提供无参的构造方法(Hibernate底层需要使用反射生成类的实例)
2 持久化类的属性需要私有,并且提供公有的getter和setter(Hibernate底层会将查询到的数据进行封装)
3 持久化类的属性尽量使用包装类类型(包装类类型和基本类型默认值不同)
4 持久化类要有一个唯一标识OID与表的主键对应
Hibernate需要通过OID区分在内存中是否是同一个持久类,在Java中通过地址区分是否是同一个对象
Hibernate不允许内存中出现两个OID相同的持久化对象
5 持久化类尽量不要用final进行修饰
Hibernate有延迟加载机制,会产生代理对象
代理对象是hibernate使用字节码增强技术完成的,其实就是产生了当前类的一个子类对象
剐使用了final,就不能产生子类,从而不会产生代理对象
在Maven项目中需要引入的jar包:
<dependencies> <!-- hibernate --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>5.2.10.Final</version> </dependency> <!-- MySql --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.32</version> </dependency> </dependencies>
Hibernate主要API:
Configration:主要用于加载主配置文件,获取数据库连接
在hibernate的启动过程中,configuration类的实例首先定位映射文档的位置,读取这些配置
创建sessionFactory对象
单例的
//读取hibernate.cfg.xml文件
Configuration cfg = new Configuration();
cfg.configure();
SessionFactory:用于创建session对象,封装了映射信息以及预定义的SQL
sessionFactory接口负责初始化hibernate
单例的,如果一个应用程序中连接了多个数据库,那么需要创建多个sessionFactory对象
//创建SessionFactory工厂
SessionFactory sessionFactory = cfg.buildSessionFactory();
Session:用于对象操作,完成CRUD操作
session在hibernate中的设计是线程不安全的,所以每个线程创建一个session对象
hibernate中的session不同于JSP中的HttpSession
//创建session
Session session = sessionFactory.openSession();
Transaction:用于事务的处理,进行CRUD时要注意,因为Hibernate自动提交事务是关闭的
//开启事务
Transaction tx = session.beginTransaction();
//执行添加操作
//提交事务
tx.commit();
Query:对数据库及持久对象进行查询,有两种方式:
用于执行HQL查询语句(HQL属于面向对象的查询,语句中没有表名和字段名)
本地数据库SQL语句
Criteria:与Query接口类似
允许创建并执行面型对象的标准化查询
不能在session之外使用
在hibernate.cfg.xml中配置的顺序问题:
必须将property标签放在mapping节点前:<原因未知,,,欢迎补充>
<!-- 可选配置 -->
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- mapping文件 -->
<mapping resource="com/roxy/hibernate/pojo/Customer.hbm.xml"/>