hibernate学习之简单核心概念

一、hibernate

1. hibernate是什么?
hibernate是一个开放源代码的对象关系映射框架(ORM),它是当今主流的Java持久层框架之一。
(1)hibernate框架应用在JavaEE三层架构中的dao层框架。
(2)在dao层对数据库进行crud操作,hibernate底层代码就是jdbc,hibernate对jdbc进行封装,好处为:不需要写复杂的jdbc代码了,不需要写SQL语句的实现了。
(3)hibernate是开源的轻量级的框架。轻量级是指不需要依赖于其他东西,可以直接使用。
(4)hibernate版本
     Hibernate3.*
     Hibernate4.*(过渡版本,一般没人使用)
     Hibernate5.*(学这个就可以了)
(5)hibernate-release-5.2.12.Final.zip,final是指最终版本,目录下的lib文件夹下是相关jar包。

2. 什么事ORM思想
(1)hibernate使用ORM思想对数据库进行操作。
(2)ORM:object relational mapping 对象关系映射
(3)文字描述
--实体类和数据库表进行一一对应
--实体类中的属性和数据库表字段一一对应
--不需要操作数据库表,直接操作表对应的实体类对象

二、 hibernate配置文件详解

1. hibernate映射配置文件
(1)映射配置文件名和位置没有固定要求
(2)映射配置文件中,标签属性值写实体类的相关内容
  --class标签:name属性:实体类全路径
      table属性:数据库表名称
  --id标签和property标签name属性值 实体类属性名称
  --id标签和property标签column属性可以省略的(不写值->数据库表字段名和name属性值一样) 
  --property标签type属性,设置生成表字段的类型,hibernate会自动对应类型

(3)代码User.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	<!-- 1. 配置类和表 
		class标签:name属性:实体类全路径
			   table属性:数据库表名称
	-->
	<class name="com.zzc.hibernate.entity.User" table="user">
		<!-- 2.配置实体类id和表id对应
			hibernate要求实体类有一个属性唯一值
			hibernate要求表有字段作为唯一值
		 -->
		<id name="uId" column="uId">
			<!-- 3. 设置数据库表id增长策略(自动增长:native)-->
			<generator class="native"></generator>
		</id>
		<!-- 设置其他属性和表字段类型 -->
		<property name="userName" column="userName"></property>
		<property name="password" column="password"></property>
		<property name="address" column="address"></property>
	</class>
</hibernate-mapping>

2. hibernate核心配置文件
(1)配置写位置要求,必须在<hibernate-configuration><session-factory>内;
(2)配置三部分要求
        --第一部分:配置数据库信息(必须的)
        --第二部分:配置hibernate信息(可选的)
        --第三部分:配置映射文件信息(必须的)
(3)核心配置文件名称和位置固定的
        --位置:src下面
        --名称:hibernate.cfg.xml
(4)代码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>
		<!-- 第一部分:配置数据库信息 -->
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate?characterEncoding=utf-8</property>
		<property name="hibernate.connection.username">root</property>
		<property name="hibernate.connection.password">123</property>
		<!-- 第二部分:配置hibernate信息 -->
		<!-- 输出底层SQL语句 -->
		<property name="hibernate.show_sql">true</property>
		<!-- 输出底层SQL语句 格式 -->
		<property name="hibernate.format_sql">true</property>
		<!-- hibernate创建表(需要配置)
			update:如果有表->更新,如果没有->创建
		 -->
		 <property name="hibernate.hbm2ddl.auto">update</property>
		<!-- 配置数据库方言:让hibernate框架识别不同数据库特有的语句
			在MySQL中实现分页:使用limit关键字(只能在mysql中使用),
			在oracle中实现分页:使用rownum
		 -->
		 <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
		<!-- 第三部分:把映射文件放到核心配置文件中 必须的 -->
		<mapping resource="com/zzc/hibernate/entity/User.hbm.xml"/>
	</session-factory>
</hibernate-configuration>

三、Configuration

1. Configuration对象会到src目录下寻找hibernate.cfg.xml,创建对象,然后将hibernate.cfg.xml放到对象里面(加载核心配置文件)。

Configuration cfg = new Configuration();
cfg.configure();

Configuration cfg = new Configuration().configure();

2. 其他方式使用:

(1)指定位置查找核心配置文件,如src目录下的config包下的hibernate.cfg.xml。

Configuration cfg = new Configuration().configure("/config/hibernate.cfg.xml")

(2)加载映射文件,当然也可在核心配置文件中使用mapping标签。

Configuration cfg = new Configuration().configure("XML文件位置");
cfg.addResource("com/zzc/hibernate/entity/User.hbm.xml");

四、SessionFactory(重点)

1. 使用Configuration对象创建SessionFactory对象。
  --在创建过程中,会根据核心配置文件中数据库相关配置,有映射文件部分,根据映射关系在数据库中把表创建。
  --核心配置文件中的配置:

<property name="hibernate.hbm2ddl.auto">update</property>

2. 由于每次都要创建SessionFactory,然后每次都要访问核心配置文件,判断是否需要创建表,然后更新......,十分浪费资源,性能低。解决办法:在hibernate操作过程中,建议一个项目一般创建SessionFactory对象--->写工具类(Utils),使用静态代码块实现(静态代码块在类加载的时候执行,只会执行一次)。

3. 工具类的实现(可使用静态方法返回SessionFactory对象,也可直接放回Session对象,下面返回的是SessionFactory对象

import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtils {

	private static final Configuration cfg;
	private static final SessionFactory sessionFactory;
	//静态代码块实现
	static {
		cfg = new Configuration().configure();
		sessionFactory =cfg.buildSessionFactory(); 
	}
	//使用静态方法返回SessionFactory对象
	public static SessionFactory getSessionFactory() {
		return sessionFactory;
	}
}

五、Session(重点)

1. Session类似于jdbc中的连接Connection。

2. 调用Session中的方法实现crud(增删查改)的操作

       save(添加)、update(修改)、delete(删除)、get和load(根据主键查询)、createQuery和createSQLQuery(用于数据库操作对象)、createCriteria(条件查询)......

3. Session对象是单线程对象,意味着Session对象不能共用,只能自己使用。

六、Transaction

1.  事务对象

//开启事务
Transaction ts = session.beginTransaction();

2. 事务提交和回滚方法

ts.commit();
ts.rollback();
3. 事务四个特性:原子性,一致性,隔离性,持久性

七、解决配置文件没有提示的问题

第一种:可以上网,它会自动提示,因为dtd约束是http协议。

第二种:没有网络环境,解决办法:将dtd约束文件引入到eclipse中去。

         第一步:打开eclipse->Windows->Preferences。

         第二步:在搜索框输入:xml c,下面就会自动出现 XML Catalog,点击进入。

        第三步:(1)将xml文件中的dtd约束复制,如:http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd;注:要带http的约束。

                        (2)点击 XML Catalog中的Add,选择Catalog Entry,将key type 改为URL,将dtd的http约束复制到Key:中去,Location:->点击File System,将本地的dtd文件导入到Location中去,点击OK。

        第四步:查看xml文件中是否有提示,没有提示,重启eclipse。

猜你喜欢

转载自blog.csdn.net/SkyFire1121/article/details/79159481