定义
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装。
Hibernate可以应用在任何使用JDBC的场合。
Hibernate的核心接口一共有6个,分别为:Session、SessionFactory、Transaction、Query、Criteria和Configuration。
优点:
简化繁琐的JDBC代码
对面向对象特性支持良好
可移植性好
开源免费,可以在需要时改写源代码,进行功能定制
缺点:
不适合以数据为中心的大量使用存储过程的应用
不适合大规模的批量数据处理
(例如:添加语句,需要判断具体数据库,很多if语句,性能低下)
与Mybatis的比较
全自动orm,提供了对象状态管理,级联操作
完全面向对象,与数据库无关、数据库移植性好
但是由于直接操作sql,mybatis的自由度高
与Mybatis的比较
Hibernate环境搭建
1、部署jar文件
2、添加hibernate.cfg.xml配置文件
3,创建数据库表对应的实体类
4,创建表的映射 ***.hbm.xml
2、添加hibernate.cfg.xml配置文件
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory name="foo"><!--name指的是JDNI名字-->
<!--配置数据库的驱动程序-->
<property name="connection.driver_class">com.mysql.jdbc.Driver </property>
<!--设置数据库的连接url:jdbc:mysql://localhost/hibernate,其中localhost表示mysql服务器名称,此处为本机, hibernate是数据库名-->
<property name="connection.url">jdbc:mysql://localhost/city</property>
<!--连接数据库是用户名-->
<property name="connection.username">root </property>
<!--连接数据库是密码-->
<property name="connection.password">001128 </property>
<!--是否在后台显示Hibernate用到的SQL语句-->
<property name="show_sql">true </property>
<!--在控制台输出格式化后的sql语句-->
<property name="format_sql">true</property>
<property name="current_session_context_class">thread</property>
<!-- 指定对应数据库的方言,hibernate为了更好适配各种关系数据库,针对每种数据库都指定了一个方言dialect -->
<property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
<!-- 映射文件 -->
<mapping resource="test.hbm.xml"/>
</session-factory>
</hibernate-configuration>
//包括数据库连接相关
connection.driver_class:表示数据库驱动
connection.url:表示数据库url
connection.username:表示数据库用户名
connection.password:表示数据库密码
//辅助参数
dialect:指定对应数据库的方言,hibernate为了更好适配各种关系数据库
show_sql:是否在后台显示Hibernate用到的SQL语句
format_sql:是否在控制台输出格式化后的sql语句
current_session_context_class:指定得到的sessin由谁来跟踪管理
//映射文件
mapping resource=“test.hbm.xml”/>
3、创建数据库表对应的实体类
/持久化类(实体类):
public
提供无参构造
实现序列化Serializable接口
提供get/set方法
4、创建表的映射 ***.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="pojo">
<!--
class元素: 配置实体与表的对应关系的
name: 完整类名
table:数据库表名
-->
<class name="pojo.Cityarea" table="Cityarea" >
<!-- id元素:配置主键映射的属性
name: 填写主键对应属性名
column(可选): 填写表中的主键列名.默认值:列名会默认使用属性名
type(可选):填写列(属性)的类型.hibernate会自动检测实体的属性类型.
每个类型有三种填法: java类型|hibernate类型|数据库类型
not-null(可选):配置该属性(列)是否不能为空. 默认值:false
length(可选):配置数据库中列的长度. 默认值:使用数据库类型的最大长度
-->
<id name="id" >
<!-- generator:主键生成策略,就是每条记录录入时,主键的生成规则
identify:主键自增,由数据库来维护主键值,录入时不需要指定主键
increment(了解):主键自增,由hibernate来维护,每次插入钱会先查询表中id最大值+1作为新主键值
hilo(了解):高低位算法,主键自增,由hibernate来维护开发式不使用
native:自动三选一策略
sequence:Oracle中的主键生成策略
-->
<generator class="native"></generator>
</id>
<!-- property元素:除id之外的普通属性映射
name: 填写属性名
column(可选): 填写列名(数据库表中)
type(可选):填写列(属性)的类型.hibernate会自动检测实体的属性类型.
每个类型有三种填法: java类型|hibernate类型|数据库类型
not-null(可选):配置该属性(列)是否不能为空. 默认值:false
length(可选):配置数据库中列的长度. 默认值:使用数据库类型的最大长度
-->
<property name="name" column="name"/>
</class>
</hibernate-mapping>
常用的Hibernate的主键生成策略
assigned
:自己输入主键,新增数据记得加入
increment
increment策略是指,不使用数据库本地的自增长策略,而是由程序(Hibernate框架)产生一个自增长的ID值,赋予数据库.
每次插入前都会去查询表中id最大的值,然后+1作为新主键
(绝对不推荐,如果多人同时操作数据,可能引发数据不安全)
idenity
identity策略,指定使用数据库里面的ID自增长策略. 只能用于支持ID自增长功能的数据库,如:MySQL,SQLServer… 不支持没有ID自增长策略的数据库,如Oracle,DB2…
native
使用数据库本地的策略,就是数据库里面使用怎么样的策略就用什么策略,HIbernate不做任何的判断
sequence
使用序列的实现ID生成策略,主要用于有序列的数据库.如:Oracle,DB2,如果不支持序列的数据库(如:MYSQL),该策略会使用一个表模拟序列。