hibernate总结

1.配置文件 xxx.cfg.xml内容

必须语句之一 数据库连接语句
需要注意的是在mysql8.0往上版本加载驱动的语句有所不同
com.mysql.cj.jdbc.Driver 多了个cj
还有数据库连接url也有些许改动,这里的&amp是/的意思嗷。
jdbc:mysql://localhost:3306/hibernate?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC

<!--SessionFactory是Hibernate中的一个类,这个类主要负责保存Hibernate的配置信息,以及对session的操作-->   
 <session-factory>
    <!--hibernate.dialect 只是Hibernate使用的数据库方言,就是要用Hibernate连接那种类型的数据库服务器。-->
  <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
   <!--配置数据库的驱动程序,Hibernate在连接数据库时,需要用到数据库的驱动程序-->     
  <property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property>
   <!--设置数据库的连接url:jdbc:mysql://localhost:3306/dbname,其中localhost表示mysql服务器名称,此处为本机,    dbname是数据库名-->      
  <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate?useUnicode=true&amp;characterEncoding=UTF-8&amp;useSSL=false&amp;serverTimezone=UTC</property>
  <!-- 连接数据库时数据的传输字符集编码方式 -->
  <property name="hibernate.connection.characterEncoding">UTF-8</property>
  <!--连接数据库时的用户名-->    
  <property name="hibernate.connection.username">root</property>
   <!--连接数据库时的密码-->     
  <property name="hibernate.connection.password">123456</property>

2).映射设置

 <!--指定映射文件,可映射多个映射文件--> 
  <!--  <mapping class="com.test.entity.Product" />   -->
  <mapping resource="com/test/entity/Product.hbm.xml"/> 

2.映射文件配置

1).property 方法用于指明投影对象的某个属性。
中有 name 有了column
其中name是要mapping的列,必须保证和类里面的变量名一致
column则是 你在数据库里的别名 可选项
2). 延迟加载策略,:DTD没设置默认值,推理默认值为true
3).表示一个主键的生成机制,常用的三种机制看代码块有解释。

<hibernate-mapping package="com.test.entity">
	<class name="Product" table="products" lazy="true">
		<id name="id" column="id" >
			<generator class="identity">
			<!--
			“increment”  
  主键按数值顺序递增。此方式的实现机制为在当前应用实例中维持一个变量,
  以保存着当前的最大值,之后每次需要生成主键的时候将此值加1作为主键。
  这种方式可能产生的问题是:不能在集群下使用。  
   
 			 “identity”  
  采用数据库提供的主键生成机制。如DB2、SQL   Server、MySQL   中的主键生成机制。
  			 “assigned”  
  主键由外部程序负责生成,在   save()   之前指定一个。
   -->
				
			</generator>
		</id>
		
	
		<property name="name" column="name" >
		<!-- <column name="" sql-type=""></column> -->
		</property>
        <property name="price" column="price"></property>
        <property name="description" column="description" ></property>
		
	 
	</class>
</hibernate-mapping>

3.hibernateAPI操作流程

在这里插入图片描述

4.工具类

/**
 * 3.27
 * 初始化Hibernate过程
 * Configuration、SessionFactory、Session对象
 */
public class HibernateUtil {

	public HibernateUtil() {
		// TODO Auto-generated constructor stub
	}
	
	   // SessionFactory实例(会话工厂)
    private static SessionFactory sessionFactory = null;
    //Configuration configuration = new Configuration();  
    
    /**
     * 静态初始化 Hibernate 
     */
    static {
        // 1 创建 StandardServiceRegistry 实例(标准注册服务)
        // 1.1 创建 StandardServiceRegistryBuilder 实例(标准注册服务生成器)
        // 1.2 从 hibernate.cfg.xml 配置文件中读取配置信息
        // 1.3 构建 StandardServiceRegistry实例(标准注册服务)
    	
        StandardServiceRegistry registry = new StandardServiceRegistryBuilder().configure().build();

        try {
            // 2 创建 SessionFactory 实例(会话工厂)
            // 2.1 根据标准注册服务创建一个  MetadataSources 实例(元数据资源集)
            // 2.2 构建元数据
            // 2.3 生成应用一般唯一的 SessionFactory 实例(会话工厂)
            sessionFactory = new MetadataSources(registry).buildMetadata().buildSessionFactory();
        } catch (Exception e) {
            // 2.4 创建失败手动释放 StandardServiceRegistry 实例
            StandardServiceRegistryBuilder.destroy(registry);
            e.printStackTrace();
        }
    }

    /**
     * 打开一个 Session 会话
     * @return Session
     */
    public static Session openSession() {
        return sessionFactory.openSession();
    }

}

5.在测试类中具体操作

private static void find() {
		// TODO Auto-generated method stub

		// TODO Auto-generated method stub
		Session session = null; //创建session
		Transaction tran = null; //开启事务
		Product p =null;
		try {
			session = HibernateUtil.getCurrentSession();
			tran = session.beginTransaction();
			// ---------------------------------

			// 查找Product对象
			p= session.load(Product.class, 2);
			System.out.println(p.getDescription());
			p.setName("苹果");
			// ---------------------------------
			tran.commit();//与数据库数据同步
		} catch (Exception e) {
			e.printStackTrace();
			tran.rollback();//事务回滚,返回到原来的状态
		} finally {
			if (null != session) {
				session.close();
			}
		}
		
	}

5.hibernate的session介绍

Session 具有一个缓存, 位于缓存中的对象称为持久化对象, 它和数据库中的相关记录对应。Session 能够在某些时间点, 按照缓存中对象的变化来执行相关的 SQL 语句, 来同步更新数据库, 这一过程被称为刷新缓存(flush)。也叫一级缓存。
在 Session 接口的实现中包含一系列的 Java 集合, 这些 Java 集合构成了 Session 缓存。 只要 Session 实例没有结束生命周期, 且没有清理缓存,则存放在它缓存中的对象也不会结束生命周期。Session 缓存可减少 Hibernate 应用程序访问数据库的频率。

session缓存的示例:

@Test
    public void getUser(){
        User user=session.get(User.class,1);
        User user2=session.get(User.class,1);
        System.out.println(user);
        System.out.println(user2);//查询出来的两条记录完全一样
    }

在这里插入图片描述
(1)flush方法:session会按照缓存中对象属性的变化来更新数据库中的记录,使数据库中记录和缓存中的对象保持一致,默认情况下,在以下时间点会刷新缓存:
  ①:当应用程序调用Transaction.commit()方法时,该方法会先调用flush()方法,然后提交事物

②:显示的调用flush()方法时

③:当应用程序执行一些查询(HQL, Criteria)操作时,如果缓存中持久化对象的属性已经发生了变化,会先 flush 缓存,以保证查询结果能够反映持久化对象的最新状态

flush 缓存的例外情况:

如果对象使用 native 生成器生成 OID, 那么当调用 Session 的 save() 方法保存对象时, 会立即执行向数据库插入该实体的 insert 语句.

flush()和commit()方法的区别:

flush()方法会执行一系列的sql语句,但是不会提交事物;commit()在提交事物前,会先调用flush()方法,然后i在提交事物,提交事物以为这将数据库的操作永久的保存下来

(2)refresh:
  refresh会强制发送select语句, 以使数据库中的记录和缓存中的对象保持一致;如果在调用refresh方法前,手动的修改数据库中的记录,查询出来的结果还不是最新的,这跟数据库的数据的隔离级别是相关的,可以在配置文件中显示的修改事物的隔离级别,每一个隔离级别都对应一个整数;

<property name="hibernate.connection.isolation">2</property>

6、持久化对象的状态

持久化对象状态分为四种状态:持久化状态, 临时状态, 游离状态, 删除状态。Session 的特定方法能使对象从一个状态转换到另一个状态;
在这里插入图片描述
(1)update方法:
  ①:若更新一个持久化对象,不必显示的调用update()方法,因为在嗲用Transaction的commit()方法时,会调用session的flush()

②:更新一个游离对象,需要显示的调用update()方法,可以将一个游离对象转换为持久化对象

③:当 update() 方法关联一个游离对象时, 如果在 Session 的缓存中已经存在相同 OID 的持久化对象, 会抛出异常

④:当 update() 方法关联一个游离对象时, 如果在数据库中不存在相应的记录, 也会抛出异常.

(2)saveOrUpdate:
  如果user是临时对象,则调用save()方法,如果user是游离对象,则调用update()方法

判断对象是不是临时对象:

①:Java 对象的 OID 为 null

②:映射文件中为 设置了 unsaved-value 属性, 并且 Java 对象的 OID 取值与这个 unsaved-value 属性值匹配

(3)delete
  删除操作,如果OID和数据库中的一条记录保持一致,则执行删除操作,,把对象从 Session 缓存中删除, 该对象进入删除状态,若OID在数据库中没有对应的记录,则抛出异常,Hibernate 的 cfg.xml 配置文件中有一个 hibernate.use_identifier_rollback 属性, 其默认值为 false, 若把它设为 true, 将改变 delete() 方法的运行行为: delete() 方法会把持久化对象或游离对象的 OID 设置为 null, 使它们变为临时对象

  1. load方法认为该数据在数据库中一定存在,可以放心的使用代理来延迟加载,如果在使用过程中发现了问题,只能抛异常(ObjectNotFoundException)load方法加载实体对象的时候,根据映射文件上类级别的lazy属性的配置(默认为true)
    为true,则首先在session中查找,如果不存在,使用延迟加载,返回实体的代理类对象(该代理类为实体类的子类,由CGLIB动态生成)等到具体使用该对象(除获取OID以外)的时候,再查找二级缓存和数据库,如果没找到,则会抛出一个ObjectNotFoundException
    若为false,就跟Hibernate get方法查找顺序一样,只是最终若没发现符合条件的记录,则会抛出一个ObjectNotFoundException。

  2. 而对于get方法,hibernate一定要获取到真实的数据,否则返回null,首先在session缓存中查找,然后去二级缓存中查找,再到数据库查找。

11.4 hibernate生命周期
持久化状态对象会影响数据库里面的内容,可以不通过session来影响数据库内容。
结论:持久化状态的对象会影响或改变数据库中的内容

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ava实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),可运行高分资源 Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现
C语言是一种广泛使用的编程语言,它具有高效、灵活、可移植性强等特点,被广泛应用于操作系统、嵌入式系统、数据库、编译器等领域的开发。C语言的基本语法包括变量、数据类型、运算符、控制结构(如if语句、循环语句等)、函数、指针等。下面详细介绍C语言的基本概念和语法。 1. 变量和数据类型 在C语言中,变量用于存储数据,数据类型用于定义变量的类型和范围。C语言支持多种数据类型,包括基本数据类型(如int、float、char等)和复合数据类型(如结构体、联合等)。 2. 运算符 C语言中常用的运算符包括算术运算符(如+、、、/等)、关系运算符(如==、!=、、=、<、<=等)、逻辑运算符(如&&、||、!等)。此外,还有位运算符(如&、|、^等)和指针运算符(如、等)。 3. 控制结构 C语言中常用的控制结构包括if语句、循环语句(如for、while等)和switch语句。通过这些控制结构,可以实现程序的分支、循环和多路选择等功能。 4. 函数 函数是C语言中用于封装代码的单元,可以实现代码的复用和模块化。C语言中定义函数使用关键字“void”或返回值类型(如int、float等),并通过“{”和“}”括起来的代码块来实现函数的功能。 5. 指针 指针是C语言中用于存储变量地址的变量。通过指针,可以实现对内存的间接访问和修改。C语言中定义指针使用星号()符号,指向数组、字符串和结构体等数据结构时,还需要注意数组名和字符串常量的特殊性质。 6. 数组和字符串 数组是C语言中用于存储同类型数据的结构,可以通过索引访问和修改数组中的元素。字符串是C语言中用于存储文本数据的特殊类型,通常以字符串常量的形式出现,用双引号("...")括起来,末尾自动添加'\0'字符。 7. 结构体和联合 结构体和联合是C语言中用于存储不同类型数据的复合数据类型。结构体由多个成员组成,每个成员可以是不同的数据类型;联合由多个变量组成,它们共用同一块内存空间。通过结构体和联合,可以实现数据的封装和抽象。 8. 文件操作 C语言中通过文件操作函数(如fopen、fclose、fread、fwrite等)实现对文件的读写操作。文件操作函数通常返回文件指针,用于表示打开的文件。通过文件指针,可以进行文件的定位、读写等操作。 总之,C语言是一种功能强大、灵活高效的编程语言,广泛应用于各种领域。掌握C语言的基本语法和数据结构,可以为编程学习和实践打下坚实的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值