Hibernate框架(一)文件配置、核心API、对象状态详解
来源:互联网 发布:示剑网络马大伟 编辑:程序博客网 时间:2024/05/16 11:50
Hibernate框架 (一)
hibernate结构
hibernate :
1. 数据访问层框架,操作数据库
2. 在Dao层操作数据,使用JDBC|DBUTILS时,我们都需要进行面向对象到面向关系型数据库的转换操作.
3. hibernate能够让我们以面向对象的方式操作数据库.
ORM:对象关系映射,通过配置文件来映射对象与关系型数据库之间的关系,最终能够做到以面向对象的方式来操作数据库.
Hibernate是一个数据持久化层的ORM框架.
Object:对象,java对象,此处特指JavaBean
Relational:关系,二维表,数据库中的表。
Mapping:映射|映射元数据,对象中属性,与表的字段,存在对应关系。
hibernate 配置详解
配置映射文件
与实体同一目录,与实体同名(大小写相同)
<?xml version="1.0" encoding="UTF-8"?><!-- 映射文件 --><!-- 导入dtt约束 --><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><!-- pageage属性:填写包名,后续配置中默认类所在包即为package属性所填写的包 --><hibernate-mapping package="cn.it.domain"> <!-- 类与表的映射 ,name填写完整类名,table写表名--> <class name="cn.it.domain.Customer" table="cst_customer"> <!-- id元素:映射类中的主键属性(OID)与表中的主键列对应--> <id name="cust_id" column="cust_id"> <!-- generator属性,主键生成策略 :决定对象在执行保存时,主键值如何获得 --> <generator class="native"></generator> </id> <!--property元素:映射普通列 --> <property name="cust_name" column="cust_name"></property> <property name="cust_source" column="cust_source"></property> <property name="cust_industry" column="cust_industry"></property> <property name="cust_level" column="cust_level"></property> <property name="cust_phone" column="cust_phone"></property> <property name="cust_mobile" column="cust_mobile"></property> </class></hibernate-mapping>
package属性:
填写一个包名,后续配置中默认类所在包即为package属性填写的包
class属性:
映射表与类的对应,name属性:填写完整的类名,table属性(可选):库中表名,默认使用类名作为表名.
id元素:映射类中的主键属性与表中的主键列对应,
name属性:类中主键属性名,
column属性:表中主键列名,
length属性(可选):配置当前列的长度,默认值:数据库对应类型最大长度,
type属性(可选):指定当前列(属性)的类型,默认值:启动检测属性类型,自动根据检测配置,
id元素:
映射类中的主键属性(OID)与表中的主键列对应
name属性:类中主键属性名.
column属性(可选):表中的主键列名.默认列名就是属性名
length属性(可选):配置当前列的长度.默认值:数据库对应类型最大长度.
type属性(可选):指定当前列(属性)的类型.默认值:自动检测属性类型.自动根据检测配置.
generator元素:
主键生成策略.决定对象在执行保存时,主键值如何获得
代理主键:
表达业务之外的字段.没有业务意义.
increment: 先查询表中的id最大值.加1作为新的主键值.有线程安全问题.测试时使用
*identity:依赖于数据库中的主键自增.
*sequence:使用Oracle中的序列来生成id值.
hilo(用不到):hibernate通过高低位算法来实现主键自增效果.
*native:自动三选一.identity|sequence|hilo
uuid:字符串类型主键.生成随机字符串作为主键.注意长度应超过32位.
自然主键:包含业务意义.
*assigned:手动指定id值.
property元素:
映射普通列
id元素:映射类中的主键属性与表中的主键列对应,
name属性:类中主键属性名,
column属性(可选):表中主键列名,
length属性(可选):配置当前列的长度,默认值:数据库对应类型最大长度,
type属性(可选):指定当前列(属性)的类型,默认值:启动检测属性类型,自动根据检测配置,
主配置文件
<?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> <!-- 必选配置 (5个)--> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql:///hibernate</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">123</property> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property><!-- hibernate方言配置 --> <!-- 可选配置(3个) --> <!-- 打印生成sql到控制台 --> <property name="hibernate.show_sql">true</property> <!-- 对生成的sql进行格式化 --> <property name="hibernate.format_sql">true </property> <!-- ## auto schema export 自动建表 --> <property name="hibernate.hbm2ddl.auto">update</property> <!-- 引入映射文件 --> <mapping resource="cn/it/domain/Customer.hbm.xml"></mapping> </session-factory></hibernate-configuration>
必选配置(5个)
前4项数据库参数设置
第5项时hibernate 方言配置,不属于SQL99标准,不同数据库在sql99标准基础上发展了各自的差异化的语句,这些语法就是数据库方言.
注意:务必选择最短方言配置.
可选配置(3个)
1、打印生成sql到控制台
2、对生成的sql进行格式化
3、auto schema export 自动建表
#
hibernate.hbm2ddl.auto create 自动建表,每次启动hibernate都会自动建表,即使表已经存在,仍会删除重新建表
#
hibernate.hbm2ddl.auto create-drop 自动建表,每次hibernate都会自动建表,每次运行完成会将表删除,
#
hibernate.hbm2ddl.auto update 自动建表,如果有表就不再重新创建,如果配置改变,自动更改表结构
#
hibernate.hbm2ddl.auto validate 不会自动创建表结构,只负责在启用时校验表结构,检出问题后会抛出异常
引入映射文件
引入映射文件的位置,路径从src开始
API详解
confinguration对象详解
功能:用于读取配置文件的对象,根据读取到的文件创建SessionFactory
- 创建配置读取对象 ,调用空参构造即可创建
调用配置读取对象的读取配置文件方法,读取配置文件,空参configure方法读取src/hibernate.cfg.xml
import org.hibernate.cfg.Configuration;import org.junit.Test;/** * Configuration详解 * 读取配置文件的对象 * @author Administrator */public class Demo01 { @Test public void test1(){ //1.创建配置读取对象,调用空参构造即可创建 Configuration conf = new Configuration(); //2.调用配置读取对象的读取配置文件的方法,读取配置文件 conf.configure(); //以上两步合二为一 Configuration configure = new Configuration().configure(); } @Test public void test2(){ //1.创建配置读取对象,读取配置文件 Configuration conf = new Configuration().configure(); //2.根据配置创建SessionFactory conf.buildSessionFactory(); }}
SessionFactory对象详解
功能:根据配置信息创建session对象
注意:1.SessionFactory需要消耗相对较多的内存资源(保存了所有配置)
2.SessionFactory是线程安全的设计
结论:在一个web项目中要确保只有一个SessionFactory对象存在
Configuration conf = new Configuration.configure();
//根据配置创建SessionFactory
SessionFactory sf = conf.buildSessionFactory();
创建session方式1:返回一个全新的session对象
Session session1 = sf.openSession();
创建session方式2:获得与线程绑定的session对象
Session session2 = sf.getCurrentSession();
import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;import org.junit.Test;/** * SessionFactory详解 * 根据配置文件创建session对象 * @author Administrator */public class Demo02 { @Test public void test1(){ //1.创建配置读取对象,读取配置文件 Configuration conf = new Configuration().configure(); //2.根据配置创建SessionFactory SessionFactory sf = conf.buildSessionFactory(); //创建session方式一:返回一个全新的session对象 Session session = sf.openSession(); //创建session方式二:获得与线程绑定的session对象 Session session2 = sf.getCurrentSession(); }}
Session对象详解
功能:hibernate中操作数据库的核心对象
1.增删改查所有操作
2.获得事务操作对象
import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.cfg.Configuration;import org.junit.Test;import cn.it.domain.Customer;import cn.it.utils.HibernateUtils;/** * Session详解 * hibernate操作数据库核心对象, * 1.实现增删改查操作 * 2.获取事务操作对象 * @author Administrator * */public class Demo03 { @Test public void test1(){ //1.创建配置读取对象,读取配置文件 Configuration conf = new Configuration().configure(); //2.根据配置创建SessionFactory SessionFactory sf = conf.buildSessionFactory(); //3.创建session方式一:返回一个全新的session对象 Session session = sf.openSession(); //4.获得事务操作对象 Transaction tx = session.getTransaction(); //5.开启事务 tx.begin(); //获取事务操作对象与开启事务合并 Transaction tx2 = session.beginTransaction(); //6.提交事务 tx2.commit(); //7.回滚事务 tx2.rollback(); } /** * 往数据库中添加 */ @Test public void test2(){ //1.获取session对象 Session session = HibernateUtils.openSesseion(); //2.获得事务操作对象,开启事务 Transaction tx = session.beginTransaction(); //3.操作 Customer customer = new Customer(); customer.setCust_name("张三"); session.save(customer); //4.提交事务 tx.commit(); //5.关闭资源 session.close(); } /** * 根据id查询数据库中数据 */ @Test public void test3(){ //1.获取session对象 Session session = HibernateUtils.openSesseion(); //2.获得事务操作对象,开启事务 Transaction tx = session.beginTransaction(); //3.操作 //根据oid查询 Customer customer = session.get(Customer.class, 1L); System.out.println(customer.getCust_name()); //4.提交事务 tx.commit(); //5.关闭资源 session.close(); } /** * 修改数据库(先查询后修改,没有修改的属性不变)(推荐) */ @Test public void test4_1(){ //1.获取session对象 Session session = HibernateUtils.openSesseion(); //2.获得事务操作对象,开启事务 Transaction tx = session.beginTransaction(); //3.操作 //根据oid查询 Customer customer = session.get(Customer.class, 1L); //修改属性 customer.setCust_name("李四");// session.update(customer); //4.提交事务 tx.commit(); //5.关闭资源 session.close(); } /** * 修改数据库,只修改修改属性,其他项置为null */ @Test public void test4_2(){ //1.获取session对象 Session session = HibernateUtils.openSesseion(); //2.获得事务操作对象,开启事务 Transaction tx = session.beginTransaction(); //3.操作 Customer customer = new Customer(); customer.setCust_id(2L); //修改属性 customer.setCust_name("王五"); session.update(customer); //4.提交事务 tx.commit(); //5.关闭资源 session.close(); } /** * 删除数据库中数据(先查询,再删除) */ @Test public void test5_1(){ //1.获取session对象 Session session = HibernateUtils.openSesseion(); //2.获得事务操作对象,开启事务 Transaction tx = session.beginTransaction(); //3.操作 Customer customer = session.get(Customer.class, 1L); //删除属性 session.delete(customer); //4.提交事务 tx.commit(); //5.关闭资源 session.close(); } /** * 删除数据库中数据(根据id删除属性)(推荐) */ @Test public void test5_2(){ //1.获取session对象 Session session = HibernateUtils.openSesseion(); //2.获得事务操作对象,开启事务 Transaction tx = session.beginTransaction(); //3.操作 Customer customer = new Customer(); customer.setCust_id(2L); //删除属性 session.delete(customer); //4.提交事务 tx.commit(); //5.关闭资源 session.close(); } }
Transaction对象
功能:用于操作事务的方法
import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.cfg.Configuration;import org.junit.Test;/** * Transaction对象详解 * 用于操作事务的方法 * 获得增删改查操作 * @author Administrator * */public class Demo04 { @Test public void test1(){ //1.创建配置读取对象,读取配置文件 Configuration conf = new Configuration().configure(); //2.根据配置创建SessionFactory SessionFactory sf = conf.buildSessionFactory(); //3.创建session方式一:返回一个全新的session对象 Session session = sf.openSession(); //4.获得事务操作对象 Transaction tx = session.getTransaction(); //5.开启事务 tx.begin(); //将4和5两部合并,获取事务操作对象并开启事务 Transaction tx2 = session.beginTransaction(); //6.提交事务 tx2.commit(); //7.回滚事务 tx2.rollback(); }}
实体对象
书写规则
- 提供一个无参public访问控制符的构造器
- 提供一个标识属性,映射数据表主键字段
- 所有属性提供public访问控制阀的set/get方法
- 属性尽量使用基本数据类型的包装类型
- 不要用final修饰class
- 实现java.io.Serializable接口(建议,不是hibernate要求规范)
主键生成策略
决定对象在执行保存时,主键如何获得
代理主键:表达业务之外的字段,没有业务意义
increment:先查询表中id最大值,加1作为新的主键值,有线程安全问题,测试时使用
identity:依赖于数据库中的主键自增
sequence:使用Oracle中序列来生成id值
hilo:(用不到),hibernate高地位算法来实现主键自增效果
native:自动三选一,identity|sequence|hilo
uuid:字符串类型主键,生成随机字符串作为主键,注意长度应超过32位,
自然主键:包含业务含义
assigned:用于自然主键,手动指定id值
hibernate中的对象状态
瞬时状态
- 对象没有oid值
- 对象没有与session关联
持久化状态
- 对象有oid值
- 对象与session有关联
特点:持久化状态的对象,会在事务提交时自动与事务同步
游离|托管状态
- 对象有oid值
- 对象没有与session关联
对象状态的转换
- Hibernate框架(一)文件配置、核心API、对象状态详解
- Struts2框架(一)架构、文件配置、核心API详解
- JAVAWEB开发之Hibernate详解(一)——Hibernate的框架概述、开发流程、CURD操作和核心配置与API以及Hibernate日志的使用
- JAVAWEB开发之Hibernate详解(一)——Hibernate的框架概述、开发流程、CURD操作和核心配置与API以及Hibernate日志的使用
- Hibernate核心API详解
- hibernate教程--常用配置和核心API详解
- 框架 day31 Hibernate入门(log4j简介,核心配置,映射配置,核心api,OID映射)
- Hibernate核心API的详解
- EXT核心API详解(一)
- EXT核心API详解(一)
- configuration对象详解----Hibernate-API
- SessionFactory对象详解----Hibernate-API
- Hibernate 初相识(一)Hibernate API 详解,配置文件,映射文件详解。
- EXT核心API详解(一)-Ext
- EXT核心API详解(一)-Ext
- [转载]EXT核心API详解(一)-Ext
- EXT核心API详解(一)-Ext
- EXT核心API详解(一)-Ext
- ProtostuffUtil—快速序列化和反序列化对象工具
- 数据类型Number类型
- 2016年在美帝找实习总结
- 数据类型String类型
- Unity中关于Device Filter的选择问题
- Hibernate框架(一)文件配置、核心API、对象状态详解
- 数据类型Object类型
- 循环语句if(){}else{}、if(){}else if(){}...else{}、do{}while()、for(){}、with(){}break/continue语句
- 函数function
- Oracle 存储过程的学习
- Linux 中无法使用 root 用户通过 SSH 远程登录解决方法
- android_35_adb
- 欢迎使用CSDN-markdown编辑器
- android_36_多线程断点续传