前言:
JavaEE软件开发体系架构中三层架构自上而下将系统分为表示层、逻辑层、持久层。Servlet+Jsp+JavaBean+JDBC开发市面上所有应用,企业中一般不会使用以上的架构去开发,而是使用架构SSH(Struts2+Spring+Hibernate)或者是使用SSM(SpringMVC+Spring+Mybatis)。其中Hibernate就是SSH中的H。
一:Hibernate概述:
什么是Hibernate:
Hibernate框架是Java持久层框架之一,是一个开放源代码的ORM(Object Relational Mapping)框架,它对JDBC进行了轻量级的对象封装,是的Java开发人员可以使用面向对象的编程思想来操作数据库。
优势:
1)Hibernate对JDBC访问数据库的代码做了轻量级封装,大大简化了数据访问层繁琐的重复性代码,并且减少了内存消耗,加快了运行效率。
2)Hibernate是一个基于JDBC的持久化框架,是一个优秀的ORM实现,它很大程度的简化了DAO层编码工作。
3)Hibernate的性能很好,映射灵活想很出色。它支持很多关系型数据库,从一对一到多不多的各种关系。
4)可扩展性强,由于源代码的开源以及API的开放,当本身功能不够用时,可以自行编码进行扩展。
二:Hibernate入门:
1、下载Hibernate5:
https://sourceforge.net/projects/hibernate/files/hibernate-orm/5.2.13.Final/
Hibernate的版本可以自行选择,解压完整目录结构如下:
目录简单介绍:
1)documentation文件夹:存放Hibernate的相关文档,包括参考文档的API文档。
2)lib文件夹:存放Hibernate编译和运行所依赖的JAR包。其中required子目录下包含了运行Hibernate5项目所必须的jar包。
3)project文件夹:存放Hibernate各种昂相关的源代码。
在lib/required子目录下,包含的jar包:
2、创建数据库和表:
这一步暂时不用做,只需要建立一个空数据库hibernate01即可。
/*
Navicat MySQL Data Transfer
Source Server : localhost
Source Server Version : 50624
Source Host : localhost:3306
Source Database : hibernate01
Target Server Type : MYSQL
Target Server Version : 50624
File Encoding : 65001
Date: 2018-02-26 15:07:22
*/
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for cst_customer
-- ----------------------------
DROP TABLE IF EXISTS `cst_customer`;
CREATE TABLE `cst_customer` (
`cust_id` bigint(20) NOT NULL AUTO_INCREMENT,
`cust_name` varchar(255) DEFAULT NULL,
`cust_source` varchar(255) DEFAULT NULL,
`cust_industry` varchar(255) DEFAULT NULL,
`cust_level` varchar(255) DEFAULT NULL,
`cust_linkman` varchar(255) DEFAULT NULL,
`cust_phone` varchar(255) DEFAULT NULL,
`cust_mobile` varchar(255) DEFAULT NULL,
PRIMARY KEY (`cust_id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
3、引入Hibernate的开发包
4、创建实体(持久化类)
持久化类是应用程序中的业务实体类,这里的持久化是指类的对象能够被持久化保存到数据库中。Hibernate使用普通Java对象,即POJO的编程模式来进行持久化。POJO类中包含的是与数据库表相对应的各个属性,这些属性通过getter和setter方法来访问,对外部隐藏了内部的实现细节。
在项目src目录下,创建cn.ytm.domian包,并在包中创建实体类Customer(和数据库表cst_customer对应),Customer类包含cst_customer数据表字段对应的属性,以及对应的get、set方法。(get/set方法部分省略)
package cn.ytm.domain;
public class Customer {
private Long cust_id;
private String cust_name;
private String cust_source;
private String cust_industry;
private String cust_level;
private String cust_linkman;
private String cust_phone;
private String cust_mobile;
public Long getCust_id() {
return cust_id;
}
public void setCust_id(Long cust_id) {
this.cust_id = cust_id;
}
......
}
5、创建映射文件:
实体类Customer目前还不具备持久化操作的能力,而Hibernate需要知道实体类Customer映射到数据库Hibernate中的哪个表,以及类中的哪个属性对应数据库表中的那个字段,这些都要在配置文件中配置。
在实体类Customer所在的包中,创建一个名称为Customer.hbm.xml的映射文件,在该文件中定义了实体类Customer的属性是如何映射到cst_customer表的列上的。(不理解映射文件的可以重点看注释)
<?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属性:用来建立类和表的映射
table属性:表明(如果类名和表名一致,那么table属性客户省略)
catalog属性:数据库名称,可省略
-->
<class name="cn.ytm.domain.Customer" table="cst_customer">
<!-- 建立类中的属性与表中的主键的映射 -->
<!--
id标签:
name属性:类中的属性名
column属性:表中字段名(如果类中的属性名和表中的字段名一致,那么省略column)
length属性:字段的长度
type属性:类型。写Java数据类型,hibernate数据类型(默认),sql类型
-->
<id name="cust_id" column="cust_id">
<!-- 主键生成策略 -->
<generator class="native"/>
</id>
<!-- 建立类中的普通属性与表中的字段的映射 -->
<!--
property标签:用来建立类中的普通属性与表中的字段对应
name属性:类中的属性名
column属性:表中字段名(如果类中的属性名和表中的字段名一致,可以省略column)
length属性:字段的长度
type属性:类型。写Java数据类型,hibernate数据类型(默认),sql类型
-->
<property name="cust_name" column="cust_name"/>
<property name="cust_source" column="cust_source"/>
<property name="cust_industry" column="cust_industry"/>
<property name="cust_level" column="cust_level"/>
<property name="cust_linkman" column="cust_linkman"/>
<property name="cust_phone" column="cust_phone"/>
<property name="cust_mobile" column="cust_mobile"/>
</class>
</hibernate-mapping>
6、创建Hibernate的核心配置文件:
Hibernate的映射文件反应了持久化类和数据库表的映射信息,而hibernate的配置文件则只要来配置数据库连接以及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:///hibernate01</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">1234</property>
<!-- hibernate的属性 -->
<!-- hibernate的方言:作用是根据配置的方言生成相应的sql语句 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- hibernate显示sql语句 -->
<property name="hibernate.show_sql">true</property>
<!-- hibernate格式化sql语句 -->
<property name="hibernate.format_sql">true</property>
<!-- hibernate的hbm2ddl属性 -->
<!--
hbm2ddl.auto的取值
none:不用hibernate自动生成表
create:每次都会创建一个新的表(测试)。
create-drop:每次都会创建一个新的表,执行程序结束后删除这个表(测试)。
update:如果数据库中有表 ,使用原来的表,如果没有表,创建一个新表,可以更新表结构。
validate:只会使用原有的表,对映射关系金西行教验。
-->
<property name="hibernate.hbm2ddl.auto">update</property>
<mapping resource="cn/ytm/domain/Customer.hbm.xml" />
</session-factory>
</hibernate-configuration>
7、编写测试代码:
在项目中新建包cn.ytm.test,并在包中建立测试类HibernateDemo。
package cn.ytm.test;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;
import cn.ytm.domain.Customer;
public class HibernateDemo {
@Test
public void demo1() {
// 1 创建,调用空参构造,加载配置文件
Configuration cfg = new Configuration().configure();
// 2 创建一个sessionFactory
SessionFactory sessionFactory = cfg.buildSessionFactory();
// 3 创建session对象,类似于connection
Session session = sessionFactory.openSession();
// 4 开启事务
Transaction tx = session.beginTransaction();
// 5 执行相关操作
Customer customer = new Customer();
customer.setCust_name("小缘");
customer.setCust_source("推广");
session.save(customer);
// 6 提交事务
tx.commit();
// 7 释放资源
session.close();
}
}
运行结果:
console中:
因为在配置文件中配置了hibernate显示格式化的sql语句,所有运行测试类后console显示的结果如下:
mysql数据库:
运行测试方法前:
运行测试方法后:
hibernate的hbm2ddl属性中配置了update属性值,数据库中没有表,所以运行测试类后hibernate自动为数据库创建了一个新表。并且插入了测试方法中设置的数据。