一、基础部分
jdbc缺点
1、编程的时候很繁琐,用的try和catch比较多
2、jdbc没有做数据的缓存
3、没有做到面向对象编程
4、sql语句的跨平台性很差
jdbc的优点
效率比较高
hibernate的优点
1、完全的面向对象编程
2、hibernate的缓存很牛的,一级缓存,二级缓存,查询缓存 重点
3、编程的时候就比较简单了
4、跨平台性很强
5、使用场合就是企业内部的系统
hibernate的缺点
1、效率比较低
2、表中的数据如果在千万级别,则hibernate不适合
3、如果表与表之间的关系特别复杂,则hibernate也不适合
二、利用hibernate实现crud的操作
步骤
1、创建一个工程
2、导入jar包
说明:
javassist包是用来创建代理对象的
代理对象的三种创建方式:
1、jdkproxy
2、cglib
3、javassist
jta: Java Transaction API,是sun公司给分布式事务处理出来的规范
3、hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory name="foo">
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">332117</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate</property>
<!-- 显示hibernate给自动生成的sql语句 -->
<property name="show_sql">true</property>
<!-- 格式化显示hibernate给自动生成的sql语句 -->
<property name="format_sql">true</property>
<!-- 会自动创建数据库表 根据持续化类生成表的策略
validate 通过映射文件检查持久化类与表的匹配
update 每次hibernate启动的时候,检查表是否存在,如果不存在则创建,如果存在则什么都不做
create 每一次hibernate启动的时候,根据持久化类和映射文件生成表
create-drop
-->
<!-- 方言:告诉hibernate使用什么样的数据库,hibernate就会在底层拼接什么样的sql语句 -->
<property name="dialect">
org.hibernate.dialect.MYSQLDialect
</property>
<property name="hbm2ddl.auto">update</property>
<!-- 自动提交事务 -->
<property name="hibernate.connection.autocommit">true</property>
<property name="hibernate.current_session_context_class">thread</property>
<!-- 对象和数据库中表的映射
建立从表到类的映射
建立从表的字段的名称到类的属性的名称的映射
建立从表的字段的类型到类的属性的类型的映射
-->
<mapping resource="com/lzh/domain/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
主要的用途:
告诉hibernate连接数据库的信息,用的什么样的数据库(方言)
根据持久化类和映射文件生成表的策略
4、持久化类和映射文件
5、生成表
6、客户端
说明
hibernate.cfg.xml文件的加载
可以指定配置文件的路径,配置文件可以随意放
sessionFactory
1、hibernate中的配置文件、映射文件、持久化类的信息都在sessionFactory中
2、sessionFactory中存放的信息都是共享的信息
3、sessionFactory本身就是线程安全的
4、一个hibernate框架sessionFactory只有一个
5、sessionFactory是一个重量级别的类
session
1、得到了一个session,相当于打开了一次数据库的连接
2、在hibernate中,对数据的crud操作都是由session来完成的
transaction
hibernate中的事务默认不是自动提交的
设置了connection的setAutoCommit为false
只有产生了连接,才能进行事务的操作。所以只有有了session以后,才能有transaction