Hibernate框架早在2001年就诞生了,至今已经是一个相对成熟的框架。网上的关于Hibernate的文章也不少,我写这篇文章的目的只是想留给若干年后的自己看看。如果顺便能给你带来一点好处就更好了。
前言
Hibernate是一个ORM框架,ORM就是Object Relationship Mapping(对象关系映射)。也就是说Hibernate是一个对象关系映射的框架。其中Object(对象)就是java bean,Relationship(关系)就是指关系型数据库的二维表(二维表有另外一个名字就是“关系”)。这样就不难理解了,Hibernate的作用就是将关系型数据库中的表转换成Java Bean对象,如下图所示:
Hibernate是对JDBC的一个封装,封装之后的一个比较突出的好处就是在代码中将数据库相关的代码进行解耦,这样便于后期的维护。比如,我之前在公司开发的一个项目,开发阶段使用的oracle,在发布的时候,因为服务器的原因,需要将数据库换成MySql。这样我们只需要修改一个Hibernate的配置文件就行。而不需要改动任何代码。
接下来,介绍一下Hibernate的基本配置和使用。
一、准备
1、安装Mysql,地址:http://www.mysql.com/downloads/
2、下载mysql的JDBC驱动,地址:http://dev.mysql.com/downloads/connector/j/3.1.html
3、下载Hibernate的Jar文件,地址:http://hibernate.org/orm/
二、开发环境
JDK1.8、windows10、Eclipse
三、配置
1、创建一个Web Project。
2、将下载的Hibernate压缩文件解压之后,找到lib\required文件夹,将文件夹中的所有Jar文件全部导入web工程中。
3、将下载的mysql-connector.jar文件也导入web工程中。
如下图:
4、创建hibernate.cfg.xml文件并配置
hibernate.cfg.xml文件是hibernate的核心配置文件,主要用于配置数据库的连接URL和驱动,以及用户名和密码等。Hibernate在初始化的时候,首先加载此文件,读取其中的配置信息。具体配置如下:
在src根目录下创建hibernate.cfg.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.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/bookmanager</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">123456</property>
<property name="hibernate.connection.pool.size">20</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<mapping resource="com/androidxx/hibernatedemo/dto/user.hbm.xml"/>
</session-factory>
</hibernate-configuration>
其中DOCTYPE这一段在hibernate-core包下的org.hibernate目录中的hibernate-cfg-3.0.dtd文件中可以找到。
pool.size表示的是连接池的大小,dialect是hibernate的方言,MySQLDialect表示Hibernate将采用更适合mysql的方式进行数据库的操作。其他的配置就不多解释了,基本看一眼就明白了,跟JDBC中的写法一样。其中<mapping>这一句可以先不要,继续往下看,就会明白这句的含义。
以上就是Hibernate开始使用前的基本配置,接下来的配置和操作就是介绍怎么使用Hibernate了。
5、创建表和JavaObject
a、在Mysql数据库中创建一张表,取名tb_user。创建表的语句如下:
create table bookmanager.tb_user(
user_id int primary key auto_increment,
user_name varchar(10),
user_password varchar(10),
user_create_time datetime default NOW()
);
b、在web项目中创建一个类,取名UserDTO。代码如下:
package com.androidxx.hibernatedemo.dto;
import java.sql.Date;
public class UserDTO {
private Long userId;
private String userName;
private String password;
private Date createTime;
public UserDTO() {
super();
// TODO Auto-generated constructor stub
}
public Long getUserId() {
return userId;
}
public void setUserId(Long userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
}
6、配置表和对象的映射
接下来就是通过配置文件将tb_user和UserDTO关联起来。
在UserDTO所在的包下创建文件user.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>
<class name="com.androidxx.hibernatedemo.dto.UserDTO" table="tb_user">
<id name="userId" type="java.lang.Long" column="user_id">
<generator class="identity"/>
</id>
<property name="userName" type="java.lang.String" column="user_name"></property>
<property name="password" type="java.lang.String" column="user_password"></property>
<property name="createTime" type="java.sql.Date" column="user_create_time"></property>
</class>
</hibernate-mapping>
其中DOCTYPE这一段在hibernate-core包下的org.hibernate目录中的hibernate-hbm-3.0.dtd文件中可以找到。
class中的name就是java对象UserDTO。table就是tb_user,这就表示UserDTO和tb_user建立了关联关系,下面的id和property就是建立表字段和对象属性间的关联关系
7、开始执行
接下来在tb_user中通过hibernate添加一条数据,操作的代码如下:
package com.androidxx.hibernatedemo;
import java.sql.Date;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.query.Query;
import com.androidxx.hibernatedemo.dto.UserDTO;
public class Test {
public static void main(String[] args) {
//加载hibernate.cfg.xml配置文件
Configuration cfg = new Configuration().configure();
//读取user.hbm.xml文件,并创建session工厂
SessionFactory sessionFactory = cfg.buildSessionFactory();
//获取session对象,相当于jdbc的connection对象。可以通过session完成CURD操作
Session session = sessionFactory.openSession();
//新增数据
Transaction transaction = session.beginTransaction();
UserDTO userDto = new UserDTO();
userDto.setUserName("lisi");
userDto.setPassword("123456");
userDto.setCreateTime(new Date(System.currentTimeMillis()));
session.save(userDto);
transaction.commit();
//查询数据
Query query = session.createQuery("from UserDTO");
List<UserDTO> users = query.getResultList();
for (int i = 0; i < users.size(); i++) {
System.out.println("--" + users.get(i).getUserName());
}
session.close();
sessionFactory.close();
}
}
最后
以上就是Hibernate的基本使用。任何东西都有他的好处,同时也有坏处,Hibernate同样如此。我个人认为一些小的项目直接使用JDBC的效率要比使用Hibernate高。所以也不是说使用了hibernate就是好,使用了jdbc就是不好;其实JDBC在执行效率上来说是觉得比Hibernate要快的。在程序开发里,没有绝对的好与坏;适合的就是好。
最后多啰嗦的这一句,希望能让你去了解一下jdbc和hibernate的好与坏,这样我们才能在开发中游刃有余。