Hibernate框架笔记 web阶段内容回顾: 1.JavaEE三层结构:Web层(SpringMVC,Struts2),Service业务逻辑层(Spring),DAO(mybatis,Hibernate持久层) 2.MVC思想:M模型,V视图,C控制器(一种分层思想,并非java独有)Hibe
web阶段内容回顾: 1.JavaEE三层结构:Web层(SpringMVC,Struts2),Service业务逻辑层(Spring),DAO(mybatis,Hibernate持久层) 2.MVC思想:M模型,V视图,C控制器(一种分层思想,并非java独有) Hibernate框架(冬眠): 1.Hibernate框架是一个dao层次的框架,Hibernate对JDBC进行了封装,不需要sql语句实现 2.Hibernate是开源的轻量级的ORM框架 3.在web阶段学习javabean,在框架中的叫法为实体类 实体类的规范:公共类,一个公共的无参构造方法,属性为私有,但必须为属性提供公共的set,get方法。 4.核心思想:ORM(object relational mapping 对象关系映射) (1) 让实体类和数据库进行一一对应 实体类类名对应数据库表名 实体类属性对应表中的字段 (2) 不需要直接操作数据库表,而操作表对应的实体类 JDBC的步骤: (1) 加载驱动 (2) 获取连接对象Connection (3) 书写SQL语句SQL (4) 获得预编译对象PreparedStatement (5) 执行SQL查询语句获取结果集ResultSet (6) 遍历结果集 (7) 关闭数据库连接 5.搭建Hibernate环境 (1) 导入相关的jar包 (2) 创建实体类(Hibernate要求实体类有一个属性是唯一的,相当于主键) (3) 创建数据库,不需要自己手动创建表,Hibernate会帮你创建 (4) 使用配置文件实现映射关系 配置文件一般创建在实体类的包下,实体类名称.hbm.xml (位置不固定,名称也不固定) (5) 配置核心配置文件:(重点) Hibernate的核心配置文件位置以及名称是固定的 必须位于在src下,名称必须为hibernate.cfg.xml 三部分:(1)配置数据库部分(必须的) (2)配置hibernate信息(可选的) (3)配置映射配置文件(必须的) 为了保证映射配置文件加载,将映射配置文件放到核心配置文件 Hibernate核心API 1 Configuration 代码:Configuration cfg = new Configuration(); cfg.configure(); 到src下面找到名称为hibernate.cfg.xml,创建对象,把配置文件放到对象里面(加载核心配置文件) 2 SessionFactory 使用Configuration对象创建SessionFactory 在创建过程中,根据配置文件的数据库与映射配置,到数据库中创建表 代码:SessionFactory sessionFactory = cfg.buildSessionFactory(); 一般在项目中只创建一个SessionFactory对象(使用静态代码块实现单例) 3 Session(相当于JDBC中的数据库连接) 由SessionFactory创建 代码:Session session = SessionFactory.openSession(); Session对象中有很多对数据库进行crud操作的方法 (1) 添加 save方法 (2) 修改 update方法 (3) 删除 delete方法 (4) 根据Id查询 get方法 session对象(单线程对象) (1) session对象不能共用,只能自己使用 (2) 不能使用单例,使用ThreadLocal对象进行多线程管理 5.Transaction事务对象 代码:Transaction tx = session.beginTransaction(); (1) 事务提交与回滚 tx.commit() tx.rollback() Hibernate中实体类的规范: 1.实体类里面属性私有的 2.私有属性具有公开的set与get方法操作 3.实体类中有属性作为唯一值(一般使用id值,对应表中主键) 1.实体类属性建议不使用基本数据类型,使用基本数据类型对应的包装类 (1)八个基本数据;类型对应的包装类 int--Integer char--Character 其他均为首字母大写,比如:double--Double (2) 包装类有的时候可以比基本数据类型更强大 比如:需要使用null时,基本数据类型无法满足,而包装类型可以赋值为null 具体事例:如果要表示学生的分数,而该学生没有参加考试,这是int型数据无法满足null值,只能取零值,但这样不能准确表示该学生缺考,只能说明是零分。 Hibernate主键生成策略 在配置文件中配置: 在这个class属性中有很多的值可以选择: (1) native 根据使用的数据库来自动选择identity(适用于mysql这种支持自增的数据库)、sequence(适用Oracle这种支持序列的数据库)、hilo三种中的一种 (2) uuid Hibernate采用128位的UUID算法生成唯一标识符,其UUID被编码为长度为32位的十六进制字符串,占用比较大的空间 (3) increment 用于long、short、int类型,由Hibernate自动以递增的方式生成唯一的标识符。 (4) identity 采用低层数据库本身提供的主键生成标识符,条件是数据库支持自动增长类型(Mysql) (5) sequence Hibernate根据低层数据库序列生成标识符,条件是数据库必须支持序列,适用于代理主键(Oracle) (6) assigned 由java程序负责生成标识符,如果不指定id元素的generator属性,则默认使用该主键生成策略,适用于自然主键。 crud操作: session.save() -- 增加 session.delete() -- 删除 session.get() -- 查询 session.update() -- 修改 实体类的状态: (1) 瞬时态:对象里面没有Id值(主键值),对象与Session也没有关联(一般做添加操作) (2) 持久态:对象里面有Id值,对象与Session有关联(如:session.get()查询出来的对象) (3) 托管态:对象有Id值,但是与session没有关联 操作实体类的方法(根据不同的状态): session.saveOrUpdate(Object) (1) 当Object对象是瞬时态时,执行save也就是添加操作。 (2) 当Object对象是托管态时,执行修改操作。 (3) 当Object对象是持久态时,执行修改操作 update与saveOrUpdate的区别: 1、update针对的是已存在的实体对象,数据库中如果没有实体所对应的数据记录(实体类对象为瞬时态时),将会抛出异常; 2、saveOrUpdate()对象存在与否都不会有任何影响(无论实体类对象在什么状态下),有则更新,没则插入。