- 注:这是笔者在学习时的小小记录,只是为了对自己的知识查缺补漏,有可能有些地方写错,仅供参考
Hibernate的简介
Hibernate是一个开源的对象关系映射框架,底层对JDBC进行了封装,在hibernate出现之前,当我们要对数据库进行访问时,比如插入一条数据,如果插入字段多的话会比较繁琐,Hibernate通过编写配置文件将javabean与数据库的表相互映射,这样我们就可以通过操作对象来实现对数据库的访问。
使用Hibernate所需要的基本包
首先需要hibernate解压缩包下的lib/required目录里的所有jar包
因为Hibernate也能够使用数据库连接池来提高效率,因此这里还可以选择加入c3p0的jar包
因为hibernate是与数据库进行打交道的,此时还需要所使用数据库的连接驱动包(以MySQL为例)
如果需要hibernate记录下相关的日志文件,这里可以使用log4j的相关jar包
hibernate的配置文件
一般需要配置的文件有两个,一个是核心配置文件,一个是对象映射文件,这两个文件都需要手动创建。
对象映射文件
该文件名可以随意起,但是一般定为类名.hbm.xml(如Customer.hbm.xml),一般放在和javabean同包,对象映射文件是配置javabean和数据库的表之间的映射关系,即配置类成员属性与表字段之间的映射关系,hibernate通过这映射文件就可以自动帮我们生成SQL语句和一些其他操作。
- 基本配置
在映射文件中需要配置的有类成员属性与表的主键之间的映射关系,这需要使用到id标签,而其他表字段与成员属性之间的映射使用property标签。
- 配置案例
<?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">
<!-- 配置javabean与数据库表的映射文件 -->
<hibernate-mapping>
<!-- class-java类与表名的映射
name:全类名
table:表名
-->
<class name="com.wzm.entity.Customer" table="cst_customer">
<!-- id-java类中属性与表主键的映射
name:类中的成员属性名
column:表的字段名
-->
<id name="cust_id" column="cust_id">
<!-- generator-定义主键的增长方式
native-相当于AUTO_INCREMENT
-->
<generator class="native"></generator>
</id>
<!-- property-Java类中的属性与表中除主键外的字段映射
name:类属性名
column:表字段名
(必要属性,当name与column的名相同时,column可以省略)
length:定义表字段的长度
non-null:定义表字段为非空
unique:定义表字段唯一
(可选属性,只有在自动创建表时起作用)
-->
<property name="cust_name" column="cust_name"></property>
<property name="cust_source" column="cust_source"></property>
<property name="cust_industry" column="cust_industry"></property>
<property name="cust_level" column="cust_level"></property>
<property name="cust_address" column="cust_address"></property>
<property name="cust_phone" column="cust_phone"></property>
</class>
</hibernate-mapping>
核心配置文件
该文件固定名称为hibernate.cfg.xml,需要将其放在工程的src目录下,在hibernate解压缩包中的project/etc目录下有个hibernate.properties文件,里边放的是核心配置文件所能使用大部分基本配置参数,一般我们可以在其中找到需要的基本配置参数。
- 基本配置
核心配置文件最基本的配置是配置数据库连接的参数,如果使用连接池,也需要配置相应的参数。其他的配置参数可以根据需求进行配置。在核心配置文件中一般会直接加载对象映射文件。
- 配置案例(数据库以MySQL为例)
<?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的核心配置 -->
<hibernate-configuration>
<!-- 配置session工厂,用于生产session
session类似于数据库的connection
此处以MySQL为例
配置参数可在配置文件hibernate-release-5.0.7.Final\project\etc\hibernate.properties中查找
-->
<session-factory>
<!-- 配置MySQL的连接驱动 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- 配置MySQL数据库的连接地址 -->
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate</property>
<!-- 配置连接数据库的用户名 -->
<property name="hibernate.connection.username">root</property>
<!-- 配置连接数据库的密码 -->
<property name="hibernate.connection.password">123456</property>
<!-- 配置连接数据库的方言
相当于告诉hibernate生产的SQL语句要符合MySQL的编写规范
-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 配置让hiebernate使用哪种数据库连接池
此处使用c3p0
-->
<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
<!-- 配置控制台显示生成的SQL语句 -->
<property name="hibernate.show_sql">true</property>
<!-- 配置显示的SQL语句是否格式化
作用:打印好看
-->
<property name="hibernate.format_sql">true</property>
<!-- 配置是否自动创建表
create-drop:没表自动创建,有表删除后创建,最后全删除
create:没表自动创建,有表删除后创建
update:没表自动创建,有表直接使用
validate:默认值,不会自动创建表
-->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 加载java类与表字段的映射文件
resource:映射文件的位置,使用src下全路径
-->
<mapping resource="com/wzm/entity/Customer.hbm.xml"/>
</session-factory>
</hibernate-configuration>
hibernate的API使用
在jar包和配置文件处理好的前提下,使用hibernate提供的API实现对数据库的表进行CRUD操作。
基本使用
- CRUD的API
增加使用save(Object object),删除使用delete(Object object),修改使用update(Object object),以上的Object是要操作的对象,获取可以用get(Class class,Object object)和load(Class class,Object object),这两个API中的object是所要操作对象的主键。
- 编写步骤
1.创建一个Configuration对象,加载核心配置文件
2.使用Configuration获得SessionFactory对象
3.通过session工厂获得session
4.使用session对象开启事务(如果是查询操作不需要)
5.使用session进行CRUD操作
6.提交事务
7.关闭session资源
- 编写案例
/**
* 向表中插入一条数据
*/
@Test
public void test1() {
//加载hibernate的核心配置文件hibernate.cfg.xml,一般只需要创建一次
Configuration configuration = new Configuration();
configuration.configure();
//获取session工厂,管理连接池,一般一个程序也只需要创建一次
SessionFactory sessionFactory = configuration.buildSessionFactory();
//从工厂获得session
Session session = sessionFactory.openSession();
//hibernate在写SQL语句时,不管是多少条SQL语句都需要开启事务(查询SQL语句除外)
Transaction transaction = session.beginTransaction();
//实例化一个对象,使用面向对象来操作
Customer customer = new Customer();
customer.setCust_name("tom");
//保存一个对象到数据库中
session.save(customer);
//提交事务
transaction.commit();
//关闭资源
session.close();
sessionFactory.close();
}
API使用注意点
- 注意点一
在hibernate中,除了查询的SQL语句,其他的增删改的SQL都需要开启事务,无论是执行一条还是多条SQL语句。这在开发中不是很规范,因为hibernate属于Dao层,而事务应该属于service层,因此之后有可能会解决这个问题。
- 注意点二
在进行删除和修改的操作时,要先通过查询获取要操作的对象,避免因为数据覆盖造成数据丢失。
- 注意点三
hibernate的API只能够进行主键做条件的查询,而其他的查询如多表查询等都需要自己手写SQL语句。
- 注意点四
hibernate有两种查询API,分别是get和load,都只能用于主键做条件的查询
两者的区别
get:
1.立即向数据库查询数据
2.get返回的类型是要操作的对象本身
3.当查询不到数据时会返回null
load:
1.延迟查询,只有当使用对象(除操作对象相映射的主键外)时才去查询
2.load返回的类型是代理对象,该代理对象存储着主键映射的属性值
3.当查询不到数据时会抛出ObjectNotFoundException异常
总结
使用hibernate框架可以帮助我们减少SQL语句的编写量,使我们在开发程序时更加高效,在使用API时,发现有一部分代码是固定的,因此可以将其抽取出来,单独做成一个工具类,以后就不需要重复写这些代码。