hibernate框架学习第二天:核心API、工具类、事务、查询、方言、主键生成策略等
核心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、工具类、事务、查询、方言、主键生成策略等的更多相关文章
- hibernate框架学习笔记4:主键生成策略、对象状态
创建一个实体类: package domain; public class Customer { private Long cust_id; private String cust_name; pri ...
- Hibernate(4)——主键生成策略、CRUD 基础API区别的总结 和 注解的使用
俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及的知识点总结如下: hibernate的主键生成策略 UUID 配置的补充:hbm2ddl.auto属性用法 注解还是配置文件 h ...
- java框架之Hibernate(2)-持久化类&主键生成策略&缓存&事务&查询
持久化类 概述 持久化:将内存中的对象持久化到数据库中的过程就是持久化.Hibernate 就是用来进行持久化的框架. 持久化类:一个 Java 对象与数据库的表建立了映射关系,那么这个类在 Hibe ...
- Hibernate框架笔记02_主键生成策略_一级缓存_事务管理
目录 0. 结构图 1. 持久化类的编写规则 1.1 持久化和持久化类 1.2 持久化类的编写规则 2. 主键生成策略 2.1 主键的分类 2.2 主键生成策略 3. 持久化类的三种状态[了解] 3. ...
- 三大框架 之 Hibernate生成策略与缓存策略(主键生成策略、持久化、持久化类划分、一级缓存、事物管理)
目录 Hibernate生成策略与缓存策略 主键生成策略 主键分类 主键的生成策略 持久化 什么是持久化 什么是持久化类 持久化类编写规则 持久化类的划分 三种状态区分 持久态对象特征 一级缓存 什么 ...
- Hibernate学习笔记(三)Hibernate生成表单ID主键生成策略
一. Xml方式 <id>标签必须配置在<class>标签内第一个位置.由一个字段构成主键,如果是复杂主键<composite-id>标签 被映射的类必须定义对应数 ...
- java框架篇---hibernate主键生成策略
Hibernate主键生成策略 1.自动增长identity 适用于MySQL.DB2.MS SQL Server,采用数据库生成的主键,用于为long.short.int类型生成唯一标识 使用SQL ...
- Hibernate框架的主键生成策略
在Hibernate中,id元素的<generator>子元素用于生成持久化类的对象的唯一标识符,也就是主键.Hibernate框架中定义了许多主键生成策略类,也叫生成器类.所有的生成器类 ...
- hibernate框架(4)---主键生成策略
主键生成策略 常见的生成策略分为六种 1.increment 由Hibernate从数据库中取出主键的最大值(每个session只取1次),以该值为基础,每次增量为1,在内存中生成主键,不依赖于底层的 ...
随机推荐
- elasticsearch 通过HTTP RESTful API 操作数据
1.索引样例数据 下载样例数据集链接 下载后解压到ES的bin目录,然后加载到elasticsearch集群 curl -XPOST 127.0.0.1:9200/bank/account/_bulk ...
- Java高并发秒杀API之web层
第1章 设计Restful接口 1.1前端交互流程设计 1.2 学习Restful接口设计 什么是Restful?它就是一种优雅的URI表述方式,用来设计我们资源的访问URL.通过这个URL的设计,我 ...
- HDU - 5073 Galaxy(数学)
题目 题意:n个点,运行移动k个点到任何位置,允许多个点在同一位置上.求移动k个点后,所有点到整体中心的距离的平方和最小. 分析:这题题目真的有点迷...一开始看不懂.得知最后是选取一个中心,于是看出 ...
- MySQL学习笔记(二)性能优化的笔记(转)
今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我们程序员需要去关注的事情.当我们去设计数据库表结构,对操作数据 ...
- 前端下拉框选择和动态生成调用div
进入到一个项目期中,一边做项目,一边学习其中用到的知识.这些知识都是零碎的,有数据库,有html,有js,还有django.趁周末时间,整理前面遇到过的前端相关的知识点. 下拉框选择 <html ...
- Docker-02 无人值守安装 docker
#!/bin/bash # # 无人值守安装 docker # # # .关闭SELinux # setenforce sed -i 's/SELINUX=enforcinf/SELINUX=disa ...
- python实现单向循环链表
单向循环链表 单链表的一个变形是单向循环链表,链表中最后一个节点的next域不再为None,而是指向链表的头节点. 实现 class Node(object): """节 ...
- jsp查询修改
也是只帖代码....不讲解. 1.search.jsp <%@ page language="java" import="java.util.*" pag ...
- js动态修改Easyui元素不生效,EasyUI动态渲染解析解决方案
easyui的渲染是在在网页加载完成后,相当于在$(document).ready()事件中,对整个网页进行了一次扫描,发现某个input标签含有easyui的属性,就在相应的地方进行ui的修改.因此 ...
- WebSocket起航 JavaScript客户端和Server通信
Message =>JSON => Move 客户端发给服务器总是Move server.send(JSON.stringify({row: row, column: column} ...