Fork me on GitHub

Hibernate入门

简单的学习了Hibernate框架,一句话:看起来蛮简单,操作起来各种坑。我就把简单的环境配置搭建一遍,再把自己对Hibernate的理解总结一下。

Hibernate框架的概述

1
2
3
* Hibernate是一个开放源代码的对象关系映射(ORM)框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。
* Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用。
* Hibernate是轻量级JavaEE应用的持久层解决方案,是一个关系数据库ORM框架

环境搭建

hibernate架包的下载hibernate官网

代码编写

我建的是web工程所以直接把架包拷到了lib目录下,如果建的是Java工程新建个文件夹为lib再buildpath下

接下来便是实体类的编写,实体类的编写主要是一些私有属性,再提供set,get方法下面是我创了一个名为User的实体类,

准备工作做好了,接下来便是hibernate中两个重要的配置文件了

两个配置文件

orm的映射配置文件

命名:实体类名.hbm.xml
在编写实体类的包下新建一个xml文件,这个xml文件必须要和实体类在同一个包下,名字就是我上面的格式,我的就是User.hbm.xml
这个配置文件主要使User这个实体类和数据库中的表构成一种映射关系,User对应数据库中的表名,类中的属性对应表中的字段,达成这种关系后我们对实体类进行操作,实际就是对数据库表的操作,前提是User这个对象是持久态的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?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="com.zhou.domain.User" table="T_USER">
<!-- 描述主键
主要指定主键的生成策略有5种一般用native或者UUID
native:本地策略.根据底层的数据库不同,自动选择适用于该种数据库的生成策略
uuid:适用于char,varchar类型的作为主键,使用随机的字符串作为主键
column:对应表中的字段,如果不写默认和实体类中的属性名相同
-->
<id name="id" column="id">
<generator class="native"></generator>
</id>
<!--非主键的表字段-->
<property name="username"/>
<property name="password"/>
</class>
</hibernate-mapping>

hibernate.cfg.xml(核心的配置文件)

核心配置文件放到根路径下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
1. 核心配置文件的两种方式
* 第一种方式是属性文件的形式,即properties的配置文件
* hibernate.properties
* hibernate.connection.driver_class=com.mysql.jdbc.Driver
* 缺点
* 不能加载映射的配置文件,需要手动编写代码去加载
* 第二种方式是XML文件的形式,开发基本都会选择这种方式
* hibernate.cfg.xml
* <property name="hibernate.connection.driver_class" >com.mysql.jdbc.Driver</property>
* 优点
* 格式比较清晰
* 编写有提示
* 可以在该配置文件中加载映射的配置文件(最主要的)
以xml文件为例
<hibernate-configuration>
<session-factory>
//配置关于数据库连接的四个项 driverClass url username password(必须要,连接数据库的基本参数)
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernatetest?useUnicode=true&amp;characterEncoding=UTF-8</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">123</property>
<property name="hibernate.show_sql">true</property> //可以将向数据库发送的sql显示出来
<property name="hibernate.format_sql">true</property> //格式化sql
//hibernate的方言(必须要,hibernate根据不同的数据库底层进行对数据库的操作)
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
//自动创建表,我们可以不用再到数据库中建表,会自动建
<property name="hibernate.hbm2ddl.auto">update</property>
//用于设置事务提交方式
<property name="hibernate.connection.autocommit">false</property>
//配置hibernate的映射文件所在位置(下面就是映射文件的配置)
<mapping resource="com/zhou/domain/User.hbm.xml" />
</session-factory>
</hibernate-configuration>

写完之后,还差一个连接数据库的驱动包mysql

测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@Test
public void f1(){
// 先加载配置文件
Configuration config = new Configuration();
// 默认加载src目录下的配置文件
config.configure();
// 创建SessionFactory对象
SessionFactory factory = config.buildSessionFactory();
// 创建session对象
Session session = factory.openSession();
// 开启事务
Transaction tr = session.beginTransaction();
// 编写保存代码
User user = new User();
user.setUsername("隔壁老王");
user.setPassword("123456");
session.save(user);
//提交事务
tr.commit();
//关闭session
session.close();
}


得意忘形的我又运行一遍omg,既然报错了


-------------本文结束感谢您的阅读-------------