Hibernate入门(一)
-
O: Object对象,面向对象语言领域,Java中的JavaBean
-
R: 关系数据库领域的Relational(数据库中表的结构)
-
M: 映射Mapping(XML的配置文件)
二、Hibernate入门
1、下载Hibernate环境资源
http://sourceforge.net/projects/hibernate/files/hibernate-orm/5.0.7.Final/hibernate-release-5.0.7.Final.zip/download
2、Hibernate官网
http://hibernate.org/orm/
3、创建java项目,导入jar包
- 数据库驱动包
4、编写数据bean
- User.class
public class User { private Integer uid; private String uname; private int uage; public Integer getUid() { return uid;} public void setUid(Integer uid) {this.uid = uid;} ...... }
注意:
5、配置映射文件
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!-- 导入约束 --> 3 <!DOCTYPE hibernate-mapping PUBLIC 4 "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 5 "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 6 <hibernate-mapping> 7 <!-- 一、class标签用于表示JavaBean和表的映射关系:name是类名(全限定名),table是数据库表的表名 --> 8 <class name="com.pri.bean.User" table="user"> 9 <!-- 1、id用来配置主键:name是JavaBean里的字段名,column是表中的主键列名 --> 10 <id name="uid" column="uid"> 11 <!-- 1.1 generator主键生成策略 --> 12 <generator class="native"></generator> 13 </id> 14 15 <!-- 2.配置普通的字段对应关系 --> 16 <property name="uname" column="uname"/> 17 <property name="uage" column="uage"/> 18 </class> 19 </hibernate-mapping>
1.命名规范问题:hibernate命名以类.hbm.xml方法命名。
2.新建位置规范:通常和java类放到同一个包中。
3.dtd头的导入:在 下的org/hibernate包中有对应的dtd头
4.在配置关系过程中,几乎所有的name属性指向的都是Java类,column和table指向数据库表。
6、配置核心文件hibernate.cfg.xml
在下载的资源包中有模板: hibernate-release-5.0.7.Final/project/etc/hibernate.cfg.xml
同一文件夹中:hibernate.properties文件则为相关属性及属性值说明,在配置相关属性时,可从中查找。
<?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> <!-- 一、必配项 --> <!-- 1.1 数据库的四个基本项 和 数据库方言 --> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql:///test01</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">123456</property> <!-- 二、选配项 --> <!-- 2.1 配置第三方连接池 需要导hibernate-release-5.0.7.Final/lib/optional/c3p0/中的jar包 --> <property name="hibernate.connection.provider_class">org.hibernate.c3p0.internal.C3P0ConnectionProvider</property> <!-- 连接池最大连接数为 10个 -->
<property name="hibernate.c3p0.max_size">10</property>
<!-- 2.1 日志显示sql语句 --> <property name="hibernate.show_sql">true</property> <!-- 2.2 日志格式化sql语句 --> <property name="hibernate.format_sql">true</property> <!-- 2.3 配置是否由Hibernate生成表
create-drop:每次都会创建一个新的表,执行程序结束后删除这个表.
create:每次都会创建一个新的表.
update:有(表, 列)就使用, 没有(表, 列)就创建
validate:只会使用原有的表.对映射关系进行校验.
-->
<property name="hibernate.hbm2ddl.auto">create</property>
<!-- 三、加载映射关系配置 --> <mapping resource="com/pri/bean/User.hbm.xml"/> </session-factory> </hibernate-configuration>
hibernate.cfg.xml放到src目录中,也就是classpath路径(类根路径)
7、编写程序访问数据库
- HibernateDemo.java
1 public class UserDao{ 2 @Test 3 public void addUser(){ 4 //1、创建Configuration对象 5 Configuration configuration = new Configuration(); 6 //2、加载配置 7 configuration.configure(); 8 //3、获得SessionFactory工厂 9 SessionFactory sessionFactory = configuration.buildSessionFactory(); 10 //4、从SessionFactory中打开session 11 Session session = sessionFactory.openSession(); 12 //5、开启事务 13 Transaction transaction = session.beginTransaction(); 14 //6、操作数据库 15 User user = new User(); 16 user.setUname("张三"); 17 user.setUage(18); 18 session.save(user); 19 //7、提交或者回滚事务 20 transaction.commit(); 21 //8、关闭资源 22 session.close(); 23 sessionFactory.close(); 24 } 25 }
三、Hibernate核心java类详解
1、Configuration
Configuration 类的作用是对Hibernate 进行配置,以及对它进行启动。在Hibernate 的启动过程中,Configuration 类的实例首先定位映射文档的位置,读取这些配置,然后创建一个SessionFactory对象。虽然Configuration 类在整个Hibernate 项目中只扮演着一个很小的角色,但它是启动hibernate 时所遇到的第一个对象。
- 作用:
配置对象,用来加载Hibernate的核心配置文件。
Hibernate框架通过该对象来获得对象-关系映射文件中的元数据,以及动态配置Hibernate的属性。
可以创建SessionFactory对象。
- Java代码
Configuration configuration = new Configuration();
configuration.configure();
2、SessionFactory
SessionFactory接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象。这里用到了工厂模式。需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。
- 作用:
获取session
SessionFactory中相当于是连接池,内部获得Session.
SessionFactory并不是一个轻量级对象,内部维护连接池和hibernate的二级缓存(企业很少用,redis).
一个项目一般只需要创建一个SessionFactory.
- 抽取的HibernateUtils
1 public class HibernateUtils { 2 3 private static SessionFactory sessionFactory = null; 4 private static Configuration configuration = null; 5 6 static { 7 //1.创建Configuration对象 8 configuration = new Configuration(); 9 //2.加载配置 10 configuration.configure(); 11 //3.获得SessionFactory工厂 12 sessionFactory = configuration.buildSessionFactory(); 13 } 14 15 private HibernateUtils() { 16 } 17 18 public static Session openSession(){ 19 //4.从SessionFactory中打开session 20 return sessionFactory.openSession(); 21 } 22 }
3、Session
Session接口负责执行被持久化对象的CRUD操作(CRUD的任务是完成与数据库的交流,包含了很多常见的SQL语句)。但需要注意的是Session对象是非线程安全的。同时,Hibernate的session不同于JSP应用中的HttpSession。这里当使用session这个术语时,其实指的是Hibernate中的session,而以后会将HttpSession对象称为用户session。
内部维护Hiberante的一级缓存(优化的手段).
-
- Serializable save(Object obj); --保存数据,返回值是保存数据返回的id
- T get(Class clazz,Serializable id); --根据主键查询对象
- T load(Class clazz,Serializable id); --根据主键查询对象
- void update(Object obj); --更新数据
- void delete(Object obj); --删除数据
-
- get方法的特点
- get方法采用的是立即检索策略(查询):执行到这行的时候,马上发送SQL查询
- get方法查询后返回的是真实对象的本身
- load方法的特点
- load方法采用的是延迟加载(懒加载lazy:什么时候使用,才会去加载)的策略:执行到这行的时候,不会发送 SQL语句,什么时候使用这个对象,才会发送SQL语句。
- load查询后返回的是代理对象
- get方法的特点
4、Transcation
Transaction 接口是一个可选的API,可以选择不使用这个接口,取而代之的是Hibernate 的设计者自己写的底层事务处理代码。 Transaction 接口是对实际事务实现的一个抽象,这些实现包括JDBC的事务、JTA 中的UserTransaction、甚至可以是CORBA 事务。之所以这样设计是能让开发者能够使用一个统一事务的操作界面,使得自己的项目可以在不同的环境和容器之间方便地移植。
-
常用API
commit():提交事务
rollback():回滚事务
-
特点
Hibernate框架默认情况下事务不自动提交.需要手动提交事务
如果没有开启事务,那么每个Session的操作,都相当于一个独立的事务
每段事务操作都是隐含着异常的,需要手动添加try catch
- 测试事物没有自动提交
if(session instanceof SessionImpl){ SessionImpl sessionImpl = (SessionImpl) session; Connection connection = sessionImpl.connection(); System.out.println(connection.getAutoCommit());//false }