Hibernate体系结构
PO:persistent Object 持久对象,javabean + hbm.xml,习惯称为:PO类
CURD操作
- 添加:save()
- 更新:update
- 删除:delete()
- 通过id查询:get(class,id)
- 查询所有:session.createQuery("from User").list()
- 分页:
query.setFirstResult() 开始索引号
query.setMaxResults() 每页显示个数
@Test
public void demo01(){
//更新
User user = new User();
user.setUserId(3);
user.setUsername("abc");
user.setPassword("qwert");
Configuration config = new Configuration().configure();
SessionFactory factory = config.buildSessionFactory();
Session session = factory.openSession();
session.beginTransaction();
session.update(user); //通过id更新所有的数据
session.getTransaction().commit();
session.close();
factory.close();
}
@Test
public void demo02(){
//删除
User user = new User();
user.setUserId(3);
//4步 配置对象,工厂,session、事务
Configuration config = new Configuration().configure();
SessionFactory factory = config.buildSessionFactory();
Session session = factory.openSession();
Transaction transaction = session.beginTransaction();
//操作
session.delete(user);
//3步 提交,关闭
transaction.commit();
session.close();
factory.close();
}
@Test
public void demo03(){
//通过id查询
Configuration config = new Configuration().configure();
SessionFactory factory = config.buildSessionFactory();
Session session = factory.openSession();
Transaction transaction =session.beginTransaction();
User user = (User)session.get(User.class, 2);
System.out.println(user);
transaction.commit();
session.close();
}
@Test
public void demo04(){
//查询所有
Configuration config = new Configuration().configure();
SessionFactory factory = config.buildSessionFactory();
Session session = factory.openSession();
Transaction transaction = session.beginTransaction();
//需要通过HQL语句查询所有,HQL:表示hibernate查询语句,面向对象的查询语句,类似sql语句。 注意:必须使用对象
//session.createQuery("from cn.itcast.a_hello.User");
Query query = session.createQuery("from User");
List<User> allUser = query.list();
for (User user : allUser) {
System.out.println(user);
}
transaction.commit();
session.close();
factory.close();
}
@Test
public void demo05(){
//分页
Configuration config = new Configuration().configure();
SessionFactory factory = config.buildSessionFactory();
Session session = factory.openSession();
Transaction transaction = session.beginTransaction();
Query query = session.createQuery("from User");
// * 确定分页数据, 回顾mysql分页: select .... limit startIndex,pageSize;
// #1 确定开始所有 startIndex
query.setFirstResult(0);
// #2 确定页面显示个数 pageSize
query.setMaxResults(2);
//第二页
// query.setFirstResult(2);
// query.setMaxResults(2);
List<User> allUser = query.list();
for (User user : allUser) {
System.out.println(user);
}
transaction.commit();
session.close();
factory.close();
}
Configuration讲解
- Configuration hibernate提供用于存放所有配置信息对象。
- 构造方法:new Configuration() , 加载配置文件,hibernate.properties文件,但一般情况不用编写。
参考配置文件:%h%/project/etc/hibernate.properties - api:
config.configure(), 加载src下hibernate.cfg.xml 文件。使用hibernate.cfg.xml 取代 hibernate.properties
config.configure(String) , 指定核心配置文件位置
例如:configure("/cn/itcast/abc.cfg.xml") - 加载映射文件 :通常将映射文件配置hibernate.cfg.xml <mapping resource="cn/itcast/.../User.hbm.xml">
config.addClass(Class) 将在class对象同级目录下,同名的hbm.xml文件
例如:config.addClass(Book.class) , 加载Book类,所在的包下面的Book.hbm.xml 文件
config.addResource(String) 将指定映射文件xml加载内存,此时文件名称任意,不建议任意。
SessionFactory讲解
SessionFactory,用于提供session,相当于连接池,通过Configuration加载hibernate.cfg.xml创建对象。
<hibernate-configuration>
<!-- 相当于连接池 -->
<session-factory>
<!-- #1 基本4项,注意:必须手动创建数据库 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/h_day01_db</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">1234</property>
...
获得对象:config.buildSessionFactory()
SessionFactory 是线程安全,每一个线程获得的session都是不同的。不存在线程并发问题。
session获得:
- 创建一个新的session:factory.openSession();
- 将session绑定本地线程,在一个线程共享session:factory.getCurrentSession();
工具类
public class H3Utils {
//方式1:
// private static SessionFactory factory2 = new Configuration().configure().buildSessionFactory();
//方式2:
//创建一个工厂
private static Configuration config;
private static SessionFactory factory;
static{
config = new Configuration().configure();
factory = config.buildSessionFactory();
}
/**
* 从工厂获得一个新session (new)
* @return
*/
public static Session openSession(){
return factory.openSession();
}
}
session讲解
1.java web session 和 hibernate的 session 关系? 没有任何关系
java web session:浏览器与服务器一次回话,在一次回话中共享数据。
hibernate session:等效JDBC Connection,服务器与数据库之间连接,也是回话
2. session:服务器 与 数据库之间会话,相当于Connection
session单线程,存在线程并发问题,线程不安全。
常用方法 :
- save()/persist() 、update() 、saveOrUpdate() 增加和修改对象
- delete() 删除对象
- get()/load() 根据主键查询
- createQuery() / createSQLQuery() 数据库操作对象
- createCriteria() 条件查询,QBC,纯面向对象语句
注意:session必须关闭,session.close();
transaction讲解
功能方法:
- 开启事务:session.beginTransaction()
- 提交事务:session.getTransaction().commit();
- 回顾事务:session.getTranssaction.rollback();
@Test
public void demo01(){
//1 获得session
Session session = H3Utils.openSession();
Transaction transaction = null;
try {
//#1 开启事务
transaction = session.beginTransaction();
//操作:。。。。
//#2 提交
transaction.commit();
} catch (Exception e) {
if(transaction != null){
//#3 回滚
transaction.rollback();
}
} finally{
session.close();
}
}
cfg.xml详解
<!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>
<!-- #1 基本4项
property.name 取值如果以“hibernate.”开头,可以省略
及“hibernate.connection.driver_class” 与 “connection.driver_class” 相同
-->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/h_day01_db</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">1234</property>
<!-- #2 方言 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
<!-- #3 sql -->
<!-- 是否显示sql语句 -->
<property name="hibernate.show_sql">true</property>
<!-- 是否格式化,如果不格式化显示一行 -->
<property name="hibernate.format_sql">true</property>
<!-- 是否显示注释,提供当前sql语句操作对象 -->
<property name="hibernate.use_sql_comments">true</property>
<!-- #4 如何创建表(不重要)
create:每一次加载cfg.xml文件都将创建表,程序关闭时,表不进行删除。[初始化,测试]
如果表已经存在,先删除,后创建。
create-drop:每一次加载cfg.xml文件都将创建表,程序关闭时(factory.close()),表进行删除。
必须执行factory.close()才删除表。
update:如果表不存在,将创建。如果表已经存在,检查映射文件和表是否匹配,如果不匹配将更新表结构(只添加,不删除)。【】
validate:加载cfg.xml进行校验,映射文件和数据是否匹配,如果匹配正常操作,如果不匹配抛异常。
### 现实开发中,先有的表,再有的映射文件。
* 表由DBA创建。
-->
<property name="hibernate.hbm2ddl.auto">create</property>
<!-- #5 取消bean校验 -->
<property name="javax.persistence.validation.mode">none</property>
</session-factory>
</hibernate-configuration>
hbm.xml详解
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cn.itcast.a_hbm">
<!--
<class> 标签:配置 对象与表 之间关系
* name:默认情况,确定对象全限定类名
如果在<hibernate-mapping>配置package,确定javabean所在的包,可以只简单类名
* table:数据库的表名
* catalog:使用的数据库名称,默认值:hibernate.cfg.xml配置 url设置的数据库名称
url # jdbc:mysql://localhost:3306/h_day01_db
<id> 标签 配置主键,要求每一个表都应该存在主键。
* name : 确定javabean那个属性作为主键
<property> 标签用于配置javabean普通属性的
* name:确定属性名称
* type: 确定属性类型
1 java类型:type="java.lang.String"
2 hibernate类型:type="string"
timestamp:时间戳,数据更改,当前字段内容将自动使用系统时间。
time:时间
date:日期
binary:二进制,大数据类型
3 数据库类型:使用子标签<column>
name:列名
sql-type:数据库类型。例如:varchar(50)
* column: 数据库列名,默认值与name的取值相同
* length :确定列的大小
* unique:唯一(添加唯一约束)
* not-null:不为空
-->
<class name="Person" table="t_person" >
<id name="pId">
<!-- 主键生成策略:固定值 -->
<generator class="native"></generator>
</id>
<property name="pname">
<column name="pname" sql-type="varchar(50)"></column>
</property>
<property name="age" type="integer" column="xage"></property>
<property name="birthday" type="date"></property>
<property name="photo" type="binary" length="350000"></property>
<property name="gender"></property>
<property name="desc" column="`desc`"></property>
</class>
</hibernate-mapping>
主键生成策略
通过配置,使hibernate为主键使用不同策略。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="cn.itcast.b_generator.Student" table="t_student">
<id name="sid">
<!--
主键生成策略
* 整形:int/short/long
1.increment,hibernate自动维护表中的主键,先进行查询max(id),然后最大值+1,执行insert语句。
存在并发问题,不建议使用。
2.identity, hibernate采用数据库底层的自动增长。例如:mysql ## auto_increment修饰主键
数据库的表结构中存在 “AUTO_INCREMENT=5”进行记录
3.sequence,hibernate采用数据库底层的序列。例如:oracle
oracle不支持自动增强,但支持序列
4.hilo,hibernate将采用高低位算法。(high/low) 适用于不支持自动增长和序列的数据。(了解)
思想:采用另一张表记录累加数据
<generator class="hilo">
<param name="table">hi_value</param> 另一张表的表名
<param name="column">next_value</param> 另一张表的列名
<param name="max_lo">100</param> 一次操作支持的最大并发数。
</generator>
批量第一个值: max_lo * next_value + next_value
100 * 5 + 5
5.native:从identity、sequence、hilo 三选一,根据数据库决定【】
### 以上的类型都是整形
6.UUID,类型必须字符串
### 以上策略:hibernate自动生成:代理主键
7.assigned : 自然主键,程序自己设置。
-->
<generator class="native"></generator>
</id>
<property name="sname"></property>
</class>
</hibernate-mapping>