核心API
Configuration
描述的是一个封装所有配置信息的对象
1.加载hibernate.properties(非主流,早期)
Configuration conf = new Configuration();
conf.addResource("cn/itcast/h3/helloworld/vo/UserModel.hbm.xml");
2.加载hibernate.cfg.xml(主流)
Configuration conf = new Configuration().configure();
SessionFactory
描述的是创建Session对象的工厂类,它需要通过Configuration对象创建得到
SessionFactory sf = conf.buildSessionFactory();
线程安全的
Session
描述的是一次应用程序与数据库间进行数据交换的对象
Session对象描述的是一次操作过程,因此多次操作,应该使用不同的Session对象
Session对象需要依赖SessionFactory对象每次开启全新的对象
Session s = sf.openSession();
线程不安全的
Session是一个数据仓库(临时)
操作:
增删改:Session对象获取到要操作的数据,和操作的种类后,自动根据操作方法生成SQL语句
做数据变更操作,一定要基于事务
查询:查询操作也是临时操作
做数据查询操作,可以不使用事务(通常开启事务)
Session使用完毕,关闭Session对象
s.close();
开发一个工具类
HibernateUtil.java
public class HibernateUtil {
private static Configuration conf = null;
//静态的SessionFactory
private static SessionFactory sf = null;
static{
conf = new Configuration().configure();
sf = conf.buildSessionFactory();
}
public static SessionFactory getSf(){
return sf;
}
/**
* 获取Session对象
* @return 全新的Session对象
*/
public static Session getSession(){
return sf.openSession();
}
}
Transaction
对象描述Hibernate执行过程中事务对象
Transaction对象需要依赖Session对象开启
开启事务
Transaction t = s.beginTransaction();
提交事务
t.commit();
回滚事务
t.rollback();
Query
描述的是Hibernate中进行查询的对象
1.Query对象的获取
获取Query对象,需要依赖1.Session对象,2.HQL
String hql = "from UserModel"; //HQL语句必须按照规则来写,所以操作以对象为基础
Query q = s.createQuery(hql);
2.获取查询结果方式
2.1使用list方法,得到一个集合List
基于查询的内容不同,可以得到两种信息
1.对象模型
如果查询的是所有数据,得到的是封装好的对象
如果查询的只是一个属性,得到是该属性对应的数据类型数据
2.对象数组Object[]
如果查询的数据超过一个,此时范围的是对象数组Object[]
投影(不推荐使用):将查询的多个散的数据,包装成一个数据模型,需要提供对应的构造方法
注意:
1.一定要提供默认无参的构造方法
2.添加的构造方法根据使用需求来添加,尽量不要使用该形式
2.2使用uniqueResult方法,得到一个对象
注意:
1.集合函数count返回的是Long型数据
2.如果使用该操作,查询的结果返回了超过1条数据,报错
3.查询结果可以是单个数据,也可以是多个数据,规则与list相同
3.分页查询
操作,设置要查询的第一条数据,和数据总量
规定查询的结果是从第几条开始
q.setFirstResult(1);
规定查询的结果一共多少条
q.setMaxResults(10);
4.条件查询
固定值查询(略)
传入可变参数查询
1.HQL:from UserModel where *** = ? and **** = ?
赋值是对Query对象添加参数
q.setParameter(索引,数据);
q.setParameter(0,"aa"); //为第一个参数赋值为字符串的"aa"
q.setParameter(4,33); //为第五个参数赋值为int型的33
弊端:索引传递参数,必须位置全完匹配,如果不匹配,错误
2.HQL:from UserModel where age >= :aa and userName like :userName
赋值是对Query对象添加参数,以变量的格式进行添加
q.setParameter(变量名,数据); //变量名一定是在HQL中前面有个冒号的名称
q.setParameter("age","aa"); //为名称为age的参数赋值为字符串的"aa"
q.setParameter("name",33); //为名称为name的参数赋值为int型的33
弊端:由于当前传递的参数是没有类型限定的,因此需要开发者传递参数时明确数据类型
3.HQL:from UserModel where age >= ? and userName like ?
赋值是对Query对象添加参数,以索引的格式进行添加,并且规定了参数的数据类型
q.set数据类型(索引,数据);
q.setInteger(0,123);
q.setString(4,"aaa");
q.setDouble(5,3.5);
4.(推荐格式)HQL:from UserModel where age >= :aa and userName like :userName
赋值是对Query对象添加参数,以变量的格式进行添加,并且规定了参数的数据类型
q.set数据类型(变量名,数据);
q.setInteger("aa",123);
q.setString("bb","aaa");
q.setDouble("cc",3.5);
Criteria
描述的是Hibernate中按条件查询的对象
Criteria对象通过Session对象创建出来的
描述查询条件时,按照Java面向对象的方式添加条件,每种不同的条件被封装成了一个对应的方法
Criteria对象查询支持分页
Criteria对象查询支持投影
Criteria对象支持list和uniqueResult查询结果
-----------------------------------------------------------
系统配置文件(cfg.xml)
数据库连接的配置
hibernate.connection.driver_class
JDBC驱动类类名
hibernate.connection.url
JDBC连接字符串
hibernate.connection.username
JDBC连接用户名
hibernate.connection.password
JDBC连接用户名对应的密码
连接池的配置
1.Hibernate有一个默认的连接池,可以对其修改连接池连接数量
hibernate.connection.pool_size = 10
更改连接的数量
2.可以使用外部技术开启连接池(c3p0)
2.1首先导入c3p0连接池jar包 lib/optional/c3p0/*.jar
2.2在cfg.xml中配置下列配置属性
<property name="hibernate.c3p0.min_size">10</property>
<property name="hibernate.c3p0.max_size">1000</property>
<property name="hibernate.c3p0.timeout">181</property>
可选配置
1.(必选)方言
SQL语句基于不同的数据库,写出来,格式,关键字,都不一定完全相同
配置方言,可以让H3生成对应数据库使用的SQL语句
dialect 配置对应的数据库方言(到文档中查找)
2.控制SQL语句的显示与分行显示
show_sql true/false
format_sql true/false
资源注册
H3只能控制在配置文件中声明的资源文件对应的类
<mapping resource="cn/itcast/h3/helloworld/vo/UserModel.hbm.xml"/>
映射关系中的Object制作规范
1.提供公共无参的构造方法(可使用自动生成的)
注意:如果使用投影技术,一定要显式声明公共无参的构造方法
2.提供一个标识属性,作为对象的主键,映射数据库表主键
通常使用uuid作为主键
3.对所有其他属性进行私有化声明,并进行标准封装
注意:属性声明时使用封装类模型,避免使用基本数据类型
4.不要使用final修饰符(否则将无法生成代理对象进行优化)
OID
是H3用于区分对象的,不同的对象OID一定不同,相同的对象OID一定相同
自然主键:具有业务含义
代理主键:不具有业务含义
OID选择应尽量避免使用自然主键,改用代理主键(uuid)
属性的数据类型选择问题
基本数据类型 long,int
封装类类型 Long,Integer
封装类类型可以区分出数据是否输入了
基本数据类型的默认值是无法确认是用户输入的还是自动添加的
优先使用封装类
映射配置文件(hbm.xml)
类与表的映射class
name:模型类的全路径名格式
table:数据库表名
schema:数据库名
主键的映射id
H3使用OID,这里配置的主键映射就是OID
name:数据模型中的OID,通常使用uuid属性(必须)
column:数据库表的主键,通常使用uuid字段(可选)
如省略column配置,则默认column值与name值相同
type:标识属性或字段的类型(兼容Java、DB、Hibernate类型)
length:标识数据库字段的长度
主键生成策略generator
手工控制
assigned(不限制类型)
必须手工提供OID
自动生成
uuid(字符串类型)
长度必须是大于等于32位,生成策略是由JVM完成
increment(整型数值类型)(不常用)
数据库端与模型必须都制作成整型,数据库端不需要做自增策略
每次使用时获取当前的最大值,然后+1,给当前使用(具有风险性)
identity (整型数值类型)(安全)
数据库端需要做【自增策略】,数据库端与模型必须都制作成整型
MySQL可用
sequence (整型数值类型)
序列完成,基于数据库
Oracle可用
native(整型数值类型)
根据配置的数据库类型不同,选择对应的自增生成策略
MySQL:整型,自增策略
双主键,多主键(了解)
<composite-id>
<key-property name="uuid"/>
<key-property name="userName"/>
</composite-id>
属性与字段的映射
配置Java模型中属性与数据库表中字段间的关系
常用属性
name:数据模型中的属性名,也就是Java字段名(必须)
column:数据库表的字段名(可选)
如省略column配置,则默认column值与name值相同
其他属性
type:标识属性或字段的类型(兼容Java、DB、Hibernate类型)
length:标识数据库字段的长度
not-null:是否为空
unique:是否唯一
配置格式:3种
<property name="userName" column="name" type="java.lang.String" length="30"/>
<property name="age" column="age" type="int" length="3"></property>
<property name="address">
<column name="address" sql-type="string" length="30"/>
</property>
<property name="userName"/>(常用)
自动生成表结构
写在cfg.xml中,属于可选配置
<property name="hbm2ddl.auto">create</property>
自动提交事务
写在cfg.xml中,属于可选配置
<property name="connection.autocommit">true</property>
问题:任意一个Session中,执行任意操作,将对应一个事务
s.save(um);
s.delete(um);
s.update(um);
---------------------------------------------------------
总结:
H3简介
ORM
H3HelloWorld(重点)
1.环境搭建
2.ORM制作
3.cfg制作
4.客户端
完成
H3基本操作 (重点)
核心API
6个对象
Query (重点)
配置
cfg.xml
hbm.xml
模型