在上一篇博客中已经配置好了Hibernate的开发环境,今天直接基于上一篇的开发环境操作。ibernate 是一个开放源代码的 ORM 框架,它对 JDBC 进行了轻量级的对象封装,使得 Java 开发人员可以使用面向对象的编程思想来操作数据库
创建数据库和实体类
持久化类是应用程序中的业务实体类,这里的持久化是指类的对象能够被持久化保存到数据库中。Hibernate 使用普通 Java 对象(Plain Old Java Object),即 POJO 的编程模式来进行持久化。POJO类中包含的是与数据库表相对应的各个属性,这些属性通过 getter 和 setter 方法来访问,对外部隐藏了内部的实现细节。下面就来编写 Customer 持久化类。
在项目 src 目录下,创建 com.gaowei.entity 包,并在包中创建实体类 Customer(对应数据库表tab_customer),Customer 类包含与 table_customer 数据表字段对应的属性,以及相应的 getXxx ()和setXxx ()方法。
/*创建客户表*/
CREATE TABLE `tab_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=1 DEFAULT CHARSET=utf8;
package com.gaowei.entity;
import java.io.Serializable;
/**
* 客户实体类
* @author gaoweiFu
*
*/
public class Customer implements Serializable {
private Long custId; //编号
private String cudtName;//姓名
private String custSource;//来源
private String custIndustry;//行业
private String custLevel;//级别
private String custAddress;//地址
private String custPhone;//手机号码
public Long getCustId() {
return custId;
}
public void setCustId(Long custId) {
this.custId = custId;
}
public String getCudtName() {
return cudtName;
}
public void setCudtName(String cudtName) {
this.cudtName = cudtName;
}
public String getCustSource() {
return custSource;
}
public void setCustSource(String custSource) {
this.custSource = custSource;
}
public String getCustIndustry() {
return custIndustry;
}
public void setCustIndustry(String custIndustry) {
this.custIndustry = custIndustry;
}
public String getCustLevel() {
return custLevel;
}
public void setCustLevel(String custLevel) {
this.custLevel = custLevel;
}
public String getCustAddress() {
return custAddress;
}
public void setCustAddress(String custAddress) {
this.custAddress = custAddress;
}
public String getCustPhone() {
return custPhone;
}
public void setCustPhone(String custPhone) {
this.custPhone = custPhone;
}
@Override
public String toString() {
return "Customer [custId=" + custId + ", cudtName=" + cudtName + ", custSource=" + custSource
+ ", custIndustry=" + custIndustry + ", custLevel=" + custLevel + ", custAddress=" + custAddress
+ ", custPhone=" + custPhone + "]";
}
}
编写映射文件(*.hbm.xml)
实体类Customer 目前还不具备持久化操作的能力,而 Hibernate 需要知道实体类 Customer 映射到数据库 Hibernate 中的哪个表,以及类中的哪个属性对应数据库表中的哪个字段,这些都需要在映射文件中配置。在实体类Customer所在的包中,创建一个名称为Customer.hbm.xml的映射文件,在该文件中定义了实体类 Customer 的属性是如何映射到 tab_customer 表的列上的。<?xml version="1.0" encoding="UTF-8"?>
<!-- 导入约束:dtd约束
位置:在 Hibernate 的核心 jar 包中名称为 hibernate-mapping-3.0.dtd
Hibernate-core-5.0.7Final.jar下的org.hibernate下的hibernate-mapping-3.0.dtd文件中
明确该文件中的内容:
1:实体类和表的对应关系
2:实体类中属性和表的字段的对应关系
-->
<!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:指定数据库表的名称
-->
<class name="com.gaowei.entity.Customer" table="tab_customer">
<!-- id 标签
作用:用于映射主键
属性:
name:指定的是属性名称。也就是 get/set 方法后面的部分,并且首字母要转小写。
column:指定的是数据库表的字段名称
-->
<id name="custId" column="cust_id">
<!-- generator 标签:
作用:配置主键的生成策略。
属性:
class:指定生成方式的取值。
取值之一:native。使用本地数据库的自动增长能力。
mysql 数据库的自动增长能力是让某一列自动+1。但是不是所有数据库都支持这种方
式。
-->
<generator class="native"></generator>
</id>
<!-- property 标签:
作用:映射其他字段
属性:
name:指定属性的名称。和 id 标签的 name 属性含义一致
column:指定数据库表的字段名称
-->
<property name="custName" column="cust_name"></property>
<property name="custLevel" column="cust_level"></property>
<property name="custSource" column="cust_source"></property>
<property name="custIndustry" column="cust_industry"></property>
<property name="custAddress" column="cust_address"></property>
<property name="custPhone" column="cust_phone"></property>
</class>
</hibernate-mapping>
编写Hibernate主配置文件
Hibernate 的映射文件反映了持久化类和数据库表的映射信息,而 Hibernate 的配置文件则主要用来配置数据库连接以及 Hibernate 运行时所需要的各个属性的值。在项目的 src 下创建一个名称为hibernate.cfg.xml 的文件.
?xml version="1.0" encoding="UTF-8"?>
<!-- 导入约束:去核心包中找:/org/hibernate/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的 ,这个session工厂就是为了创建Session的
1、链接数据库的信息
2、Hibernate的基本配置信息
3、映射文件的位置
这三部分信息都能在这个文件中找到:xxx\hibernate-release-5.0.7.Final\project\etc\hibernate.properties
这个文件:是key和value的结构,只是用的是空格分隔
-->
<session-factory>
<!-- 1、数据库的链接信息 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_day01</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">passw0rd</property>
<!-- 方言 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 2、Hibernate的基本配置 -->
<!-- 显示sql语句 -->
<property name="hibernate.show_sql">true</property>
<!-- 格式化sql语句 -->
<property name="hibernate.format_sql">true</property>
<!-- 配置Hibernate的DDL语句:让hibernate帮我们自动维护表结构:
只需要知道update就可以了,其他的可以看讲义
有表就维护表
没有表就创建表
-->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 3、映射文件的位置 -->
<mapping resource="com/gaowei/entity/Customer.hbm.xml"/>
</session-factory>
</hibernate-configuration>
测试
在项目中新建一个名称为 com.gaowei.test 的包,然后在包中建立一个名为 HibernateDemo1.java 的文件,该文件是用来测试的类文件。
/**
* hibernate 的入门案例:
* 需求:把一个客户保存到数据库中
* @author gaoweiFu
*
*/
public class HibernateDemo1 {
/**
* 步骤分析:
* 1、加载主配置文件
* 2、根据主配置文件中的配置构建 SessionFactory
* 3、使用工厂生产一个 Session 对象
* 4、使用 Session 对象开启事务
* 5、执行保存客户操作
* 6、提交事务
* 7、释放资源
*/
@Test
public void test1(){
Customer c = new Customer();
c.setCustName("纯情电脑公司");
//1.加载主配置文件
Configuration cfg = new Configuration();
cfg.configure();
//2.构建 SessionFactory
SessionFactory factory = cfg.buildSessionFactory();
//3.使用 SessionFactory 生产一个 Session
Session session = factory.openSession();//打开一个新的 Session
//4.开启事务
Transaction tx = session.beginTransaction();
//5.保存客户
session.save(c);//根据映射配置文件,生成 SQL 语句,实现保存。
//6.提交事务
tx.commit();
//7.释放资源
session.close();
factory.close();
}
}