一、基础部分
1、JDBC和Hibernate优缺点介绍:
jdbc的缺点:1、编程的时候很繁琐,用的try和catch比较多2、jdbc没有做数据的缓存 、3没有做到面向对象编程 4、sql语句的跨平台性很差
jdbc的优点:效率比较高。
hibernate的缺点:1、效率比较低2、表中的数据如果在千万级别,则hibernate不适合 3、如果表与表之间的关系特别复杂,则hibernate也不适合
Hibernate优点:1).完全面向对象编程 2).hibernate的缓存很牛的,一级缓存,二级缓存,查询缓存 3).跨平台性强 4).使用场合多应用于企业内部的系统
2、ORM学习Hibernate,首先要先了解ORM(Object/Relation Mapping),对象关系映射,主要思想是:将关系数据库中表中的记录映射成为对象,以对象的形式展现,程序员可以把对数据库的操作转化为对对象的操作
二、Hibernate开发步骤
1、导入相关包
2、配置hibernate.cfg.xml与xxx.hbm.xml
<hibernate-configuration>
<!--
一个sessionFactory代表数据库的一个连接
-->
<session-factory>
<!-- 链接数据库的用户名 -->
<property name="connection.username">root</property>
<!-- 链接数据库的密码 -->
<property name="connection.password">root</property>
<!-- 链接数据库的驱动 -->
<property name="connection.driver_class">
com.mysql.jdbc.Driver
</property>
<!-- 链接数据库的url -->
<property name="connection.url">
jdbc:mysql://localhost:3306/mysql
</property>
<!--
方言
告诉hibernate使用什么样的数据库,hibernate就会在底层拼接什么样的sql语句
-->
<property name="dialect">
org.hibernate.dialect.MySQLDialect
</property>
<!--
根据持久化类生成表的策略
validate 通过映射文件检查持久化类与表的匹配
update 每次hibernate启动的时候,检查表是否存在,如果不存在,则创建,如果存在,则什么都不做了
create 每一次hibernate启动的时候,根据持久化类和映射文件生成表
create-drop
-->
<property name="hbm2ddl.auto">update</property>
<property name="show_sql">true</property>
<mapping
resource="com/itheima12/hibernate/domain/Person.hbm.xml" />
<mapping
resource="com/itheima12/hibernate/utils/Person.hbm.xml" />
</session-factory>
</hibernate-configuration>
<hibernate-mapping>
<!--
class用来描述一个类
name 类的全名
table 该持久化类对应的表名 可以不写,默认值为类名
catalog 数据库的名称
-->
<class name="com.itheima12.hibernate.domain.Person" table="person">
<!--
用来描述主键
name 属性的名称
column 属性的名称对应的表的字段 可以不写 默认值就是属性的名称
length 属性的名称对应的表的字段的长度 如果不写,默认是最大的长度
-->
<id name="pid" column="pid" length="5">
<generator class="increment"></generator><span style="color:#ff00;"><span style="font-family:KaiTi_GB2312;"><span style="color:#ff00;"> </span>//</span></span> 主键的产生器
</id>
<property name="name" length="20" type="string"></property>
<property name="description" length="50" type="java.lang.String"></property>
</class>
</hibernate-mapping>
3
、hibernate.cfg.xml的加载 (创建表)
public class CreateTable {
@Test
public void testCreateTable(){
Configuration configuration = new Configuration();
configuration.configure();//new Configuration().configure(xxx)可以指定配置文件的路径,配置文件可以随意放
configuration.buildSessionFactory();
}
}
要点理解:
类型映射关系:
在hibernate内部,有一张类型对应表,这张表中有如下的映射关系:
故书写Java类型的方式效率比较高,hibernate类型的书写方式比较简单
hibernate.cfg.xml文件的加载
sessionFactory:
1、hibernate中的配置文件、映射文件、持久化类的信息都在sessionFactory中
2、sessionFactory中存放的信息都是共享的信息
3、sessionFactory本身就是线程安全的
4、一个hibernate框架sessionFactory只有一个
5、sessionFactory是一个重量级别的类
session:
Session是应用程序与数据库之间交互操作的一个单线程对象,是Hibernate运作的中心,所有持久化对象必须在session的管理下才可以进行持久化操作。此对象的生命周期很短。Session对象有一个一级缓存,显式执行flush
1).得到了一个session,相当于打开了一次数据库的连接
2).在hibernate中,对数据的crud操作都是由session来完成的
Transaction(事务)
代表一次原子操作,它具有数据库事务的概念。所有持久层都应该在事务管理下进行,且hibernate中的事务默认不是自动提交的
设置了connection的setAutoCommit为false, 只有产生了连接,才能进行事务的操作。所以只有有了session以后,才能有transaction。
事物流程:
根据表生成持久化类和映射文件