Hibernate的学习1
Hibernate是什么
Hibernate是一个对象关系映射(ORM : Object Relational Mapping,指的是将一个Java中的对象与关系型数据库中的表建立一种映射关系,从而操作对象就可以操作数据库中的表)的框架(框架就是一个半成品软件,已经有部分功能),对JDBC做了轻量级的对象封装,可以通过映射关系自动生成SQL语句执行对数据库的操作等,是一个持久层的框架.
为什么要学习Hibernate(优势)
Hibernate的使用
1. Hibernate的包结构
documentation 一些Hibernate的api文档
lib 使用的库
required : Hibernate开发的必须的依赖包
optional : Hibernate开发的可选的jar包
project : Hibernate提供的项目
2 配置文件
映射配置文件
因为Hibernate是一个ORM框架,所以我们必须在配置文件中配置javabean对象与关系型数据库中的table的映射,一般映射配置文件的命名规则为 javabean的名字.hbm.xml
例子:
<?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>
<!-- name为对象的名称,table为数据库中与之对应的表的名称 -->
<class name="com.test.hibernate.demo1.Customer" table="cst_customer">
<!-- 主键 -->
<id name="cust_id" column="cust_id">
<generator class="native"></generator>
</id>
<!-- 其他列 -->
<!-- 其中type属性的写法有很多种,一般使用java的属性 -->
<!-- 类中的属性名和表中的字段名如果一致,column可以省略 -->
<property name="cust_name" column="cust_name"></property>
<property name="cust_source" column="cust_source" type="java.lang.String" length="32"></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>
核心配置文件
此配置文件包含了必须的数据库的连接配置,数据库的方言,映射文件的导入.以及可选的使用第三方连接池(如c3p0)的配置,显示以及格式化sql语句的配置,以及自动建表的配置等.
此配置文件可以使用.properties的格式,也可以用XML来配置,但是通常都会使用XML来配置,因为使用.properties需要我们写代码来读取映射文件. 命名规则为:hibernate.properties 以及XML的hibernate.cfg.xml(在Hibernate包中的Project文件夹中的etc下有相关的配置实例).
以xml配置的实例:
<?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>
<!-- 必须配置 -->
<!-- 连接数据库的基本参数 -->
<property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_test1?useSSL=false</property>
<property name="hibernate.connection.username">数据库登录账号</property>
<property name="hibernate.connection.password">密码</property>
<!-- 设置hibernate方言,也就是告诉hibernate使用哪种数据库的语法 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 可选的配置 -->
<!-- 在控制台上打印出sql语句 -->
<property name="hibernate.show_sql">true</property>
<!-- 格式化sql语句,没这个就是一行输出全部 -->
<property name="hibernate.format_sql">true</property>
<!--
是否自动依据映射关系自动建表
none :不使用hibernate的自动建表
create :如果数据库中已经有表,删除原有表,重新创建,如果没有表,新建表。(项目测试用)
create-drop :如果数据库中已经有表,删除原有表,执行操作,删除这个表。如果没有表,新建一个,使用完了删除该表.(项目测试用)
update :如果数据库中有表,使用原有表,如果没有表,创建新表(更新表结构)
validate :如果没有表,不会创建表。只会使用数据库中原有的表。(校验映射和表结构)。
-->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 可以选择使用其他连接池,如c3p0 -->
<property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
<!--在连接池中可用的数据库连接的最少数目 -->
<property name="c3p0.min_size">5</property>
<!--在连接池中所有数据库连接的最大数目 -->
<property name="c3p0.max_size">20</property>
<!--设定数据库连接的过期时间,以秒为单位,
如果连接池中的某个数据库连接处于空闲状态的时间超过了timeout时间,就会从连接池中清除 -->
<property name="c3p0.timeout">120</property>
<!--每3000秒检查所有连接池中的空闲连接 以秒为单位-->
<property name="c3p0.idle_test_period">3000</property>
<!-- 添加映射文件 -->
<mapping resource="com/test/hibernate/demo1/Customer.hbm.xml"/>
</session-factory>
</hibernate-configuration>
如果以hibernate.properties的方式,加载映射文件的示例:
Configuration cfg = new Configuration();
cfg.addResource("com/test/hibernate/demo1/Customer.hbm.xml"); //加载映射文件
3 需要用到的接口或者类
- SessionFactory
SessionFactory负责初始化Hibernate,数据存储源的代理,负责创建Session对象.SessionFactory并不是轻量级的,所以通常一个项目有一个SessionFactory即可(通过封装).同时SessionFactory是线程安全的.
简单的封装示例:
package com.test.hibernate.demo1;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtils {
private static final Configuration configuration;
private static final SessionFactory factory;
static {
configuration = new Configuration().configure();
factory = configuration.buildSessionFactory();
}
public static Session getSession() {
return factory.openSession();
}
}
- Session
一个类似JDBC中Connection的对象,负责执行被持久化对象的CRUD操作.同时Session是非线程安全的,所以只能做局部变量.
- session中常用的api
Serializable save(Object object) //insert
<T> T get(Class<T> entityType, Serializable id) //查询
<T> T load(Class<T> theClass, Serializable id) //查询
get和load查询的区别
- get查询是立即加载,执行到get的使用就会发送sql语句去查询; 而load则是懒加载,只有使用到该对象的未知属 性时候才会去发送sql语句。
- get查询返回的对象是真实对象本身;load则返回的是代理对象.
- get查询找不到数据的时候返回null; 而load则抛出ObjectNotFoundException的异常.
void update(Object object) //修改
void delete(Object object) //删除
void saveOrUpdate(Object object) //保存或者更新
//以上三个方法都建议先查询出对象然后在执行相关操作
- Transaction
事务对象
void commit(); //提交
void rollback(); //回滚