Hibernate.cfg.xml 连接数据库用的 设置数据库方言(dialect) 设置数据库驱动 可设置展示sql以日志形式展示(show_sql) 并且格式化输出sql(format_sql) 更直观可读性高 设置会话的管理方式(和线程进行绑定)指定当前session范围和上下文由谁来跟踪管理
Hibernate中的实体类我觉得很有必要实现Serializable接口 保证数据在传输时能够对其实例正确执行序列化操作
创建完实体还要建立和数据库之间的映射,使用class标签 标签里面有 name 它指的是创建类的全限定名,table指的是与之对应的数据库中表,calss里面还有id标签和 property标签 id标签和property标签内容差不多一样,像name指的就是实体中的字段名称,column指的是数据库中的表字段,只不过id是数据库中的主键,id里面还有一个配置主键生成策略的叫做generator mysql使用identity 生成自动增长主键 Oracle使用sequence
Hibernate内部也是使用jdbc来访问数据库的
拓展:
jdbc访问数据库步骤:加载驱动 提供jdbc url 进行数据库连接 创建一个Statement 执行sql语句 返回数据 关闭数据库连接
=======================hibernate执行流程后台====================
Hibernate:
- 读取并解析配置文件以及映射文件(使用Configuration创建对象并点出调用configure()方法
- 依据配置文件和映射文件中的的信息创建SlsessionFactory对象一旦 sqlsessionFactory创建完毕,Configuration()对象的任何变更都不会影响创建好的SqlsessionFactory,如果配置文件发生了改变,那么就需要基于改动后的Configuration对象创建一个新的SessionFactory,通过Configuration.buildSessionFactory()赋值给SessionFactory
- 打开Session (通过创建的SqlssessionFactory点出getCurrentSession()此方法可以避免多个线程拿到同一个会话造成线程并发的问题 而且这个方法调用之后不需要手动的关闭session 还可以使用 opeansession
- Session是Hibernate的持久化管理的核心,Session提供了众多的方法save(),delete(),update(),get(),load(),通过这样的方法可以透明的执行增删改。
- 开始一个事务
- 使用Transaction 创建一个事务
- 数据库操作:session.save();
- 结束事务
==========================================HQL中使用的方法=====================================
- 会使用hiobernate的HQL面向对象的查询语言:其中我觉得里面有一个参数绑定不错
- 一种是使用占位符? 通过下表进行绑定(query.setString(0, ”张雪为“)下标初始是0
- 第二种是使用命名的方式使用 :形式(query.setString(“name”,”张雪为“))
===========================================================
- bernate还有两种缓存的方式:
- 一级缓存:他是和数据库的一条sql绑定的执行完生命就结束了,在某个时间的点session会将缓存中变化的数据更新到数据库中保证数据一致,当事务提交之后,使用session.clear()可以清除hibernate的存
- 二级缓存:sessionFactory默认应该是开启得
==========================多表的查询========================
- 多对一:通过配置<many-to-one> 里面设置name=另一张表的字段(对象) columm 配置他们相关联的主外键关系。这个是在class标签中
- 配置多对多使用<many-to- many > 在set标签中添加关联表的名称
-
- 二级缓存,默认是开开的
Hibernate还有一个反向工程,可以自动生成实体类和映射关系的xm’l,我们还可以设置配置文件,这个文件应该是需要事先创建好
==========================================JPA================================================
@Entity 生明一个持久化类
@Table 持久化类对应的表
以上两个是放在类的上面
@Id 相当于数据库中的主键
@GeneratedValue 设置主键生成策略
@Cloumn 指的是数据库的表字段
@UniqueConstraint 定义表的唯一约束
@Transient 可以忽略的属性 不用持久化到数据库中
==========================================拓展===================================================
1、getCurrentSession()会避免不同的线程拿到同一个会话,导致线程并发的问题
getCurrentSession()是通过 配置文件中的name=current_session_context_class的property配置(当前会话管理的方式是和线程进行绑定)
2、如果他要是在重新调用会话的时候,getCurrentSession()会先检查是否已经有了此会话,如果有就让他用之间的会话,没有再给他创建新的。
3、除此之外,当我们对数据库一次事务操作之后,他会帮我们自动关闭会话。