Hibernate学习----Hibernate体系结构详解

73 篇文章 0 订阅
52 篇文章 0 订阅

Hibernate体系结构

      

PO:persistent Object 持久对象,javabean + hbm.xml,习惯称为:PO类

CURD操作 

  • 添加:save()
  • 更新:update
  • 删除:delete()
  • 通过id查询:get(class,id)
  • 查询所有:session.createQuery("from User").list()
  • 分页:
           query.setFirstResult() 开始索引号
           query.setMaxResults()  每页显示个数
    @Test
	public void demo01(){
		//更新
		User user = new User();
		user.setUserId(3);
		user.setUsername("abc");
		user.setPassword("qwert");		
		
		Configuration config = new Configuration().configure();
		SessionFactory factory = config.buildSessionFactory();
		Session session = factory.openSession();
		session.beginTransaction();
		
		session.update(user);	//通过id更新所有的数据
		
		session.getTransaction().commit();
		session.close();
		factory.close();
		
	}

	@Test
	public void demo02(){
		//删除
		User user = new User();
		user.setUserId(3);		
		
		//4步 配置对象,工厂,session、事务
		Configuration config = new Configuration().configure();
		SessionFactory factory = config.buildSessionFactory();
		Session session = factory.openSession();
		Transaction transaction = session.beginTransaction();
		
		//操作
		session.delete(user);
		
		//3步 提交,关闭
		transaction.commit();
		session.close();
		factory.close();		
		
	}
	
	@Test
	public void demo03(){
		//通过id查询
		
		Configuration config = new Configuration().configure();
		SessionFactory factory = config.buildSessionFactory();
		Session session = factory.openSession();
		Transaction transaction =session.beginTransaction();
		
		User user = (User)session.get(User.class, 2);
		System.out.println(user);
		
		transaction.commit();
		session.close();					
	}
	
	@Test
	public void demo04(){
		//查询所有	
		Configuration config = new Configuration().configure();
		SessionFactory factory = config.buildSessionFactory();
		Session session = factory.openSession();
		Transaction transaction = session.beginTransaction();
		
		//需要通过HQL语句查询所有,HQL:表示hibernate查询语句,面向对象的查询语句,类似sql语句。 注意:必须使用对象
		//session.createQuery("from cn.itcast.a_hello.User");
		Query query = session.createQuery("from User");
		List<User> allUser = query.list();
		for (User user : allUser) {
			System.out.println(user);
		}
		
		transaction.commit();
		session.close();
		factory.close();
					
	}	
	@Test
	public void demo05(){
		//分页		
		Configuration config = new Configuration().configure();
		SessionFactory factory = config.buildSessionFactory();
		Session session = factory.openSession();
		Transaction transaction = session.beginTransaction();		
		Query query = session.createQuery("from User");
		// * 确定分页数据, 回顾mysql分页: select .... limit startIndex,pageSize;
		// #1 确定开始所有 startIndex
		query.setFirstResult(0);
		// #2 确定页面显示个数 pageSize
		query.setMaxResults(2);
		
		//第二页
//		query.setFirstResult(2);
//		query.setMaxResults(2);
		
		List<User> allUser = query.list();
		for (User user : allUser) {
			System.out.println(user);
		}	
		transaction.commit();
		session.close();
		factory.close();		
	}

Configuration讲解 

  1. Configuration hibernate提供用于存放所有配置信息对象。
  2. 构造方法:new Configuration() , 加载配置文件,hibernate.properties文件,但一般情况不用编写。
                  参考配置文件:%h%/project/etc/hibernate.properties
  3. api:
         config.configure(), 加载src下hibernate.cfg.xml 文件。使用hibernate.cfg.xml 取代 hibernate.properties
         
    config.configure(String) , 指定核心配置文件位置
                          例如:configure("/cn/itcast/abc.cfg.xml")
  4. 加载映射文件 :通常将映射文件配置hibernate.cfg.xml <mapping resource="cn/itcast/.../User.hbm.xml">  
         config.addClass(Class) 将在class对象同级目录下,同名的hbm.xml文件
                 例如:config.addClass(Book.class) , 加载Book类,所在的包下面的Book.hbm.xml 文件
         config.addResource(String) 将指定映射文件xml加载内存,此时文件名称任意,不建议任意。

SessionFactory讲解

               SessionFactory,用于提供session,相当于连接池,通过Configuration加载hibernate.cfg.xml创建对象。

<hibernate-configuration>
	<!-- 相当于连接池 -->
	<session-factory>
		<!-- #1 基本4项,注意:必须手动创建数据库 -->
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/h_day01_db</property>
		<property name="hibernate.connection.username">root</property>
		<property name="hibernate.connection.password">1234</property>
		...

                获得对象:config.buildSessionFactory()

               SessionFactory 是线程安全,每一个线程获得的session都是不同的。不存在线程并发问题。

               session获得:

  •        创建一个新的session:factory.openSession();
  •        将session绑定本地线程,在一个线程共享session:factory.getCurrentSession();  

             工具类

public class H3Utils {
	//方式1:
//	private static SessionFactory factory2 = new Configuration().configure().buildSessionFactory();	
	//方式2:
	//创建一个工厂
	private static Configuration config;
	private static SessionFactory factory;	
	static{
		config = new Configuration().configure();
		factory = config.buildSessionFactory();
	}	
	/**
	 * 从工厂获得一个新session  (new)
	 * @return
	 */
	public static Session openSession(){
		return factory.openSession();
	}
}

 

session讲解

           1.java web session 和 hibernate的 session 关系?             没有任何关系             

java web session:浏览器与服务器一次回话,在一次回话中共享数据。
hibernate session:等效JDBC Connection,服务器与数据库之间连接,也是回话

           2. session:服务器 与 数据库之间会话,相当于Connection

               session单线程,存在线程并发问题,线程不安全

               常用方法 :

  • save()/persist() update() saveOrUpdate() 增加和修改对象
  • delete()  删除对象
  • get()/load()  根据主键查询
  • createQuery() / createSQLQuery() 数据库操作对象
  • createCriteria()  条件查询,QBC,纯面向对象语句

               注意:session必须关闭,session.close();

transaction讲解

             功能方法:

  • 开启事务:session.beginTransaction()
  • 提交事务:session.getTransaction().commit();
  • 回顾事务:session.getTranssaction.rollback();
@Test
	public void demo01(){
		//1 获得session
		Session session = H3Utils.openSession();
		Transaction transaction = null;
		try {
			//#1 开启事务
			transaction = session.beginTransaction();
			
			//操作:。。。。
					
			//#2 提交
			transaction.commit();
		} catch (Exception e) {
			if(transaction != null){
				//#3 回滚
				transaction.rollback();
			}
		} finally{
			session.close();
		}
	}

cfg.xml详解

<!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 基本4项 
			property.name 取值如果以“hibernate.”开头,可以省略
			及“hibernate.connection.driver_class” 与 “connection.driver_class” 相同
		-->
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/h_day01_db</property>
		<property name="hibernate.connection.username">root</property>
		<property name="hibernate.connection.password">1234</property>
		
		<!-- #2 方言 -->
		<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
		
		<!-- #3 sql -->
		<!-- 是否显示sql语句 -->
		<property name="hibernate.show_sql">true</property>
		<!-- 是否格式化,如果不格式化显示一行 -->
		<property name="hibernate.format_sql">true</property>
		<!-- 是否显示注释,提供当前sql语句操作对象 -->
		<property name="hibernate.use_sql_comments">true</property>
		
		<!-- #4 如何创建表(不重要)
			create:每一次加载cfg.xml文件都将创建表,程序关闭时,表不进行删除。[初始化,测试]
				如果表已经存在,先删除,后创建。
			create-drop:每一次加载cfg.xml文件都将创建表,程序关闭时(factory.close()),表进行删除。
				必须执行factory.close()才删除表。
			update:如果表不存在,将创建。如果表已经存在,检查映射文件和表是否匹配,如果不匹配将更新表结构(只添加,不删除)。【】
			validate:加载cfg.xml进行校验,映射文件和数据是否匹配,如果匹配正常操作,如果不匹配抛异常。
			### 现实开发中,先有的表,再有的映射文件。
				* 表由DBA创建。
		-->
		<property name="hibernate.hbm2ddl.auto">create</property>
		
		<!-- #5 取消bean校验 -->
		<property name="javax.persistence.validation.mode">none</property>
	</session-factory>
</hibernate-configuration>

 hbm.xml详解

<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cn.itcast.a_hbm">
	<!-- 
		<class> 标签:配置 对象与表 之间关系
			* name:默认情况,确定对象全限定类名
				如果在<hibernate-mapping>配置package,确定javabean所在的包,可以只简单类名
			* table:数据库的表名
			* catalog:使用的数据库名称,默认值:hibernate.cfg.xml配置 url设置的数据库名称
				url # jdbc:mysql://localhost:3306/h_day01_db
		<id> 标签 配置主键,要求每一个表都应该存在主键。
			* name : 确定javabean那个属性作为主键
		<property> 标签用于配置javabean普通属性的
			* name:确定属性名称
			* type: 确定属性类型
				1 java类型:type="java.lang.String"
				2 hibernate类型:type="string"
					timestamp:时间戳,数据更改,当前字段内容将自动使用系统时间。
					time:时间
					date:日期
					binary:二进制,大数据类型
				3 数据库类型:使用子标签<column>
					name:列名
					sql-type:数据库类型。例如:varchar(50)
			* column: 数据库列名,默认值与name的取值相同
			* length :确定列的大小
			* unique:唯一(添加唯一约束)
			* not-null:不为空
	
	-->
	<class name="Person" table="t_person" >
		<id name="pId">
			<!-- 主键生成策略:固定值 -->
			<generator class="native"></generator>
		</id>
		
		<property name="pname">
			<column name="pname" sql-type="varchar(50)"></column>
		</property>
		<property name="age" type="integer" column="xage"></property>
		<property name="birthday" type="date"></property>
		<property name="photo" type="binary" length="350000"></property>
		<property name="gender"></property>
		<property name="desc" column="`desc`"></property>
	</class>

</hibernate-mapping>

主键生成策略

             通过配置,使hibernate为主键使用不同策略。

 

<?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>
	<class name="cn.itcast.b_generator.Student" table="t_student">
		<id name="sid">
			<!-- 
				主键生成策略
				* 整形:int/short/long
				1.increment,hibernate自动维护表中的主键,先进行查询max(id),然后最大值+1,执行insert语句。
					存在并发问题,不建议使用。
				2.identity, hibernate采用数据库底层的自动增长。例如:mysql ## auto_increment修饰主键
					数据库的表结构中存在 “AUTO_INCREMENT=5”进行记录
				3.sequence,hibernate采用数据库底层的序列。例如:oracle 
					oracle不支持自动增强,但支持序列
				4.hilo,hibernate将采用高低位算法。(high/low) 适用于不支持自动增长和序列的数据。(了解)
					思想:采用另一张表记录累加数据
					<generator class="hilo">
		                <param name="table">hi_value</param>	另一张表的表名
		                <param name="column">next_value</param>	另一张表的列名
		                <param name="max_lo">100</param>		一次操作支持的最大并发数。
		        	</generator>
		        	批量第一个值: max_lo * next_value + next_value
		        				100  *  5   + 5
		        5.native:从identity、sequence、hilo 三选一,根据数据库决定【】
		        ### 以上的类型都是整形
		        6.UUID,类型必须字符串
		        ### 以上策略:hibernate自动生成:代理主键
		        7.assigned : 自然主键,程序自己设置。
			
			-->
			<generator class="native"></generator>
		</id>
		<property name="sname"></property>
	</class>
</hibernate-mapping>

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
   [Hibernate体系结构的概要图] Hibernate体系结构的概要图 Hibernate的核心接口一共有6个,分别为:Session、SessionFactory、Transaction、Query、Criteria和Configuration。这6个核心接口在任何开发中都会用到。通过这些接口,不仅可以对持久化对象进行存取,还能够进行事务控制。下面对这6个核心接口分别加以介绍。    Session接口 Session接口负责执行被持久化对象的CRUD操作(CRUD的任务是完成与数据库的交流,包含了很多常见的SQL语句。)。但需要注意的是Session对象是非线程安全的。同时,Hibernate的session不同于JSP应用中的HttpSession。这里当使用session这个术语时,其实指的是Hibernate中的session,而以后会将HttpSession对象称为用户session。   SessionFactory接口 SessionFactory接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象。这里用到了工厂模式。需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。   Configuration接口 Configuration接口负责配置并启动Hibernate,创建SessionFactory对象。在Hibernate的启动的过程中,Configuration类的实例首先定位映射文档位置、读取配置,然后创建SessionFactory对象。 Transaction接口   Transaction接口负责事务相关的操作。它是可选的,开发人员也可以设计编写自己的底层事务处理代码。 Query和Criteria接口   Query和Criteria接口负责执行各种数据库查询。它可以使用HQL语言或SQL语句两种表达方式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值