核心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
模型

hibernate框架学习第二天:核心API、工具类、事务、查询、方言、主键生成策略等的更多相关文章

  1. hibernate框架学习笔记4:主键生成策略、对象状态

    创建一个实体类: package domain; public class Customer { private Long cust_id; private String cust_name; pri ...

  2. Hibernate(4)——主键生成策略、CRUD 基础API区别的总结 和 注解的使用

    俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及的知识点总结如下: hibernate的主键生成策略 UUID 配置的补充:hbm2ddl.auto属性用法 注解还是配置文件 h ...

  3. java框架之Hibernate(2)-持久化类&主键生成策略&缓存&事务&查询

    持久化类 概述 持久化:将内存中的对象持久化到数据库中的过程就是持久化.Hibernate 就是用来进行持久化的框架. 持久化类:一个 Java 对象与数据库的表建立了映射关系,那么这个类在 Hibe ...

  4. Hibernate框架笔记02_主键生成策略_一级缓存_事务管理

    目录 0. 结构图 1. 持久化类的编写规则 1.1 持久化和持久化类 1.2 持久化类的编写规则 2. 主键生成策略 2.1 主键的分类 2.2 主键生成策略 3. 持久化类的三种状态[了解] 3. ...

  5. 三大框架 之 Hibernate生成策略与缓存策略(主键生成策略、持久化、持久化类划分、一级缓存、事物管理)

    目录 Hibernate生成策略与缓存策略 主键生成策略 主键分类 主键的生成策略 持久化 什么是持久化 什么是持久化类 持久化类编写规则 持久化类的划分 三种状态区分 持久态对象特征 一级缓存 什么 ...

  6. Hibernate学习笔记(三)Hibernate生成表单ID主键生成策略

    一. Xml方式 <id>标签必须配置在<class>标签内第一个位置.由一个字段构成主键,如果是复杂主键<composite-id>标签 被映射的类必须定义对应数 ...

  7. java框架篇---hibernate主键生成策略

    Hibernate主键生成策略 1.自动增长identity 适用于MySQL.DB2.MS SQL Server,采用数据库生成的主键,用于为long.short.int类型生成唯一标识 使用SQL ...

  8. Hibernate框架的主键生成策略

    在Hibernate中,id元素的<generator>子元素用于生成持久化类的对象的唯一标识符,也就是主键.Hibernate框架中定义了许多主键生成策略类,也叫生成器类.所有的生成器类 ...

  9. hibernate框架(4)---主键生成策略

    主键生成策略 常见的生成策略分为六种 1.increment 由Hibernate从数据库中取出主键的最大值(每个session只取1次),以该值为基础,每次增量为1,在内存中生成主键,不依赖于底层的 ...

随机推荐

  1. Sublime Text3中 less 自动编译成 css 的方法

    使用sublime text的less2css插件 步骤: 1.安装node.js,这个到官网下载即可 2.安装less,方法:命令行输入: npm install -g less 3.sublime ...

  2. Linux记录-配置sudoers无密登录和环境变量

    su root vim /etc/sudoers.d/sfapp sfapp ALL=(ALL) ALLsfapp ALL=(ALL) NOPASSWD: ALL Defaults !env_rese ...

  3. winddow10下 virtualBox Ubuntu网络设置

    1. virtualbox 全局设置 2. 虚拟机网络设置 3.虚拟机中设置 4. 宿主机 设置 5. 最后 在虚拟机中 ping www.baidu.com

  4. linux部署Web项目总结

    本文用的是CentOS7系统,不是虚拟机. 1.什么是Xshell? xshell连接上linux之后,就等同于linux本身的终端命令窗口. xshell不是必需品,但是它能更好的辅助我们学习lin ...

  5. 【leetcode70】【动态规划】 爬楼梯

    (1 pass 一维动态规划) 爬楼梯(easy) 假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数 ...

  6. 【不懂】spring bean生命周期

    完整的生命周期(牢记): 1.spring容器准备 2.实例化bean 3.注入依赖关系 4.初始化bean 5.使用bean 6.销毁bean Bean的完整生命週期可以認為是從容器建立初始化Bea ...

  7. IP简介(一)

    1. OSI模型 TCP是TCP/IP的第三层传输层,对应OSI的第四层传输层: IP是TCP/IP的第二层互联层,对应OSI的第三层网络层. TCP属于OSI中的运输层它是面向连接的协议: IP属于 ...

  8. Android面试基础(一)IOC(DI)框架(ViewUtils)讲解_反射和自定义注解类

    1. Android中的IOC(DI)框架 1.1 ViewUtils简介(xUtils中的四大部分之一) IOC: Inverse of Controller 控制反转. DI: Dependenc ...

  9. openstack ovs实现vlan组网

    本文是配置文档,非说明文档,只讲配置,不讲原理. controller节点: 网卡信息:ens160 外网网卡 : ens192 数据网卡 /etc/neutron/plugins/ml2/ml2_c ...

  10. python模块之hashlib

    摘要算法 1. 摘要算法又称为哈希算法.散列算法,是通过函数将任意长度的数据转化成固定长度的数据串(通常用16进制的字符串表示). 2. 摘要算法将通过摘要函数f()将数据转化成固定长度的摘要(dig ...