JavaEE--SSH--hibernate框架介绍及基本使用

hibernate是一个优秀的持久层ORM框架.

什么是ORM框架:ORM(Object Relational Mapping):对象关系映射.将对象和表建立一种映射关系,从而操作对象就可以操作表.

通俗的讲也就是:自动将对象上携带的数据保存在关系型仓库中,将仓库中的数据自动赋值到对象上.

谈谈hibernate产生背景:

以前我们对数据库的表进行操作可能会使用这两种手段.

JDBC+C3P0

优点:JDBC是Java连接各种关系型数据库的通用接口,容易理解和学习

缺点:步骤繁琐.频繁的拼SQL容易出错.

DBUtils+C3P0

优点:对JDBC进行简单封装,能够简化JDBC应用开发的时间,性能与上面一致.

缺点:依然需要频繁拼写SQL,容易出错.

结论:由于频繁的拼写sql极易出错.我们需要一个框架提供工具类不用拼写那么多的SQL,减少出错的可能.于是出现了hibernate.


hibernate的环境搭建(数据库采用MySql):

1.导包:一般使用我们只需将下载好的hibernate工具包下/lib/required的包导入即可,如果有其它需要可以将其他导入.

JavaEE--SSH--hibernate框架介绍及基本使用


也就是这些包

JavaEE--SSH--hibernate框架介绍及基本使用

2.建立数据库表和相对应的实体类.

在这里我们拿客户表和客户类来举例.

2.1建立客户表:

数据库生成脚本:

CREATE TABLE `tb_customer` (
  `cust_id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '客户编号(主键)',
  `cust_name` varchar(32) NOT NULL COMMENT '客户名称(公司名称)',
  `cust_source` varchar(32) DEFAULT NULL COMMENT '客户信息来源',
  `cust_industry` varchar(32) DEFAULT NULL COMMENT '客户所属行业',
  `cust_level` varchar(32) DEFAULT NULL COMMENT '客户级别',
  `cust_address` varchar(128) DEFAULT NULL COMMENT '客户联系地址',
  `cust_phone` varchar(64) DEFAULT NULL COMMENT '客户联系电话',
  PRIMARY KEY (`cust_id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8

建表之后效果:

JavaEE--SSH--hibernate框架介绍及基本使用


2.2根据数据库表建立客户的实体类JavaBean.

package cn.asiainfo.hibernate.domain;
//`cust_id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '客户编号(主键)',
//`cust_name` varchar(32) NOT NULL COMMENT '客户名称(公司名称)',
//`cust_source` varchar(32) DEFAULT NULL COMMENT '客户信息来源',
//`cust_industry` varchar(32) DEFAULT NULL COMMENT '客户所属行业',
//`cust_level` varchar(32) DEFAULT NULL COMMENT '客户级别',
//`cust_address` varchar(128) DEFAULT NULL COMMENT '客户联系地址',
//`cust_phone` varchar(64) DEFAULT NULL COMMENT '客户联系电话',

import java.io.Serializable;
public class Customer implements Serializable {
private Long cust_id;
private String cust_name;
private String cust_source;
private String cust_industry;
private String cust_level;
private String cust_address;
private String cust_phone;
@Override
public String toString() {
return "Customer [cust_id=" + cust_id + ", cust_name=" + cust_name + ", cust_source=" + cust_source
+ ", cust_industry=" + cust_industry + ", cust_level=" + cust_level + ", cust_address=" + cust_address
+ ", cust_phone=" + cust_phone + "]";
}
public Long getCust_id() {
return cust_id;
}
public String getCust_name() {
return cust_name;
}
public String getCust_source() {
return cust_source;
}
public String getCust_industry() {
return cust_industry;
}
public String getCust_level() {
return cust_level;
}
public String getCust_address() {
return cust_address;
}
public String getCust_phone() {
return cust_phone;
}
public void setCust_id(Long cust_id) {
this.cust_id = cust_id;
}
public void setCust_name(String cust_name) {
this.cust_name = cust_name;
}
public void setCust_source(String cust_source) {
this.cust_source = cust_source;
}
public void setCust_industry(String cust_industry) {
this.cust_industry = cust_industry;
}
public void setCust_level(String cust_level) {
this.cust_level = cust_level;
}
public void setCust_address(String cust_address) {
this.cust_address = cust_address;
}
public void setCust_phone(String cust_phone) {
this.cust_phone = cust_phone;
}
}

3.编写实体类的映射文件(实体类与表的关联)

在实体类的包下新建一个xml文件.名称为Customer.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">
<!-- 导入约束:dtd约束 位置:在Hibernate的核心jar包中名称为hibernate-mapping-3.0.dtd 明确该文件中的内容: 
实体类和表的对应关系 实体类中属性和表的字段的对应关系 -->
<hibernate-mapping package="cn.asiainfo.hibernate.domain">
<!-- class标签 作用:建立实体类和表的对应关系 属性: name:指定实体类的名称 table:指定数据库表的名称 -->
<class name="Customer" table="tb_customer">
<!-- id标签 作用:用于映射主键 属性: name:指定的是属性名称。也就是get/set方法后面的部分,并且首字母要转小写。 column:指定的是数据库表的字段名称,如果与name相同可以不写 -->
<id name="cust_id" column="cust_id">
<!-- generator标签: 作用:配置主键的生成策略。 属性: class:指定生成方式的取值。 取值之一:native。使用本地数据库的自动增长能力。 
mysql数据库的自动增长能力是让某一列自动+1。但是不是所有数据库都支持这种方式。 -->
<generator class="native"></generator>
</id>
<!-- property标签: 作用:映射其他字段 属性: name:指定属性的名称。和id标签的name属性含义一致 column:指定数据库表的字段名称 -->
<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>

4.编写hibernate的核心配置文件

在src目录下新建一个xml.起名为hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- 导入dtd约束:
位置:在核心jar包中的名称为hibernate-configuration-3.0.dtd中
-->
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
<!-- 配置SessionFactory 
SessionFactory就是一个工厂,用于生产Session对象的。
Session就是我们使用hibernate操作数据库的核心对象了。
明确:
它和我们Web阶段的HttpSession没一点关系。
此配置文件中的内容不需要背,很多配置都是可以在开发包中找到的。
但是要求必须知道:
创建SessionFactory由三部分组成,缺一不可。要知道是哪三部分
1、连接数据库的基本信息
2、hibernate的基本配置
3、映射文件的位置
找配置文件的key都是在hibernate的开发包中project文件夹下的etc目录中的hibernate.properties
-->
<session-factory>
<!-- 1、连接数据库的基本信息 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/day01_hibernate</property>
<!-- 2、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>
<!-- 是否让hibernate根据表结构的变化来生成DDL语句
DDL:数据定义语言
hibernate可以根据映射文件来为我们生成数据库的表结构。
但是他不能生成数据库。
hbm2ddl.auto的取值
* none:不用Hibernate自动生成表.
* create:每次都会创建一个新的表.(测试)
* create-drop:每次都会创建一个新的表,执行程序结束后删除这个表.(测试)
* update:如果数据库中有表,使用原来的表,如果没有表,创建一个新表.可以更新表结构。
* validate:只会使用原有的表.对映射关系进行校验.-->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 3、映射文件的位置 -->
<mapping resource="cn/asiainfo/hibernate/domain/Customer.hbm.xml"/>
</session-factory>
</hibernate-configuration>

5.编写测试类

package cn.asiainfo.hibernate.test;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;
import cn.asiainfo.hibernate.domain.Customer;
public class HibernateDemo01 {
@Test
public void test1() {
//定义用户
Customer customer = new Customer();
customer.setCust_name("Perfume");
customer.setCust_address("日本");
customer.setCust_source("歌手");
// 1.加载主配置文件
Configuration cfg = new Configuration();
cfg.configure();
// 2.根据主配置文件中的配置构建SessionFactory
SessionFactory factory = cfg.buildSessionFactory();
// 3.使用工厂生产一个Session对象
Session session = factory.openSession();
// 4.开启事务
Transaction transaction = session.beginTransaction();
// 5. 执行保存客户操作
session.save(customer);
// 6.提交事务
transaction.commit();
// 7.释放资源
session.close();
factory.close();
}

}

6.测试:

测试结果如图:

JavaEE--SSH--hibernate框架介绍及基本使用

JavaEE--SSH--hibernate框架介绍及基本使用

这就是hibernate的基本使用.

如果想进行增删改查可以用下面的API:

增:session.save(customer);//创建实体类之后,将实体类存入数据库

查:session.get(Customer.class, new Long(1L));//1L代表第一个

改:session.update(customer);//先查到数据赋值给实体类,修改实体类属性后执行update操作

删:session.delete(c);//先查到再删