项目结构:
1、导入 jar 包:
2、写实体类对象:Employee.java
package com.hibernate.demo;
import java.util.Date;
/**
* 实体类 对象
*/
public class Employee {
private int empId;
private String empName;
private Date workDate;
public int getEmpId() {
return empId;
}
public void setEmpId(int empId) {
this.empId = empId;
}
public String getEmpName() {
return empName;
}
public void setEmpName(String empName) {
this.empName = empName;
}
public Date getWorkDate() {
return workDate;
}
public void setWorkDate(Date workDate) {
this.workDate = workDate;
}
@Override
public String toString() {
return "Employee{" +
"empId=" + empId +
", empName='" + empName + '\'' +
", workDate=" + workDate +
'}';
}
}
3、写对象与表的映射文件:和实体类在同一目录下;
映射文件命名规则:类名.hbm.xml;比如 Employee.hbm.xml:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- 映射文件:映射一个实体类对象 和 一个数据表的对应关系 -->
<!--
package:要映射的实体类所在的包(可选);
如果不指定 package,那么下面所有的 类 都要指定包名,比如写成
<class name="com.hibernate.demo.Employee" table="employee">
auto-import:默认为 true,表示在写 HQL 语句的时候会自动导入包名,直接写 "from Employee" 就行;
如果为 false,那么 HQL 就必须要写类的全名,比如 "from com.hibernate.demo.Employee";
-->
<hibernate-mapping package="com.hibernate.demo" auto-import="true">
<!--
class 节点:用于映射某一个对象;一般情况下,一个对象写一个映射文件,一个 class 节点;
name:指定要映射的对象的类型(实体类的名称);
table:指定对象对应的表名;可以不写,如果没有指定表名,默认与对象名称一样;
-->
<class name="Employee" table="employee">
<!--
主键映射:
name:指定对象中的属性名
column:指定表中的主键
-->
<id name="empId" column="id">
<!--
主键的生成策略:
identity:自增长,对 DB2、MySQL、MS SQL Server、Sybase 和 HypersonicSQL 有效;
sequence:自增长(序列),oracle 中的自增长是以序列方式实现的;
native:自增长,根据底层数据库的能力选择 identity、sequence、hilo 中的一个(常用);
如果是 mysql 数据库,选择 identity;
如果是 oracle 数据库,选择 sequence;
increment:自增长,只有在没有其他进程往同一张表中插入数据时才能使用;在服务器集群下不要使用(不常用);
assigned:手动指定主键的值,即保存对象数据时需要设置 empId 的值:emp.setEmpId(id);
uuid:指定使用 uuid 随机生成的唯一值作为主键;
foreign:外键的方式(后面再讲);
-->
<generator class="native"/>
</id>
<!--
非主键映射:普通字段映射
name:指定对象中的属性
column:指定表中的字段,和对象中的属性相对应;如果不写,默认与属性名一样
length:指定字符长度,默认为 255
type:指定映射表的字段的类型,如果不指定,会自动匹配对应属性的类型;
可以写 java 类型:必须写全名,比如 type="java.lang.String";java 类型的类的首字母必是大写;
也可以写 hibernate 类型:比如 type="string";hibernate 的类型全是小写;
-->
<property name="empName" column="empName" length="20" type="string"/>
<property name="workDate" column="workDate" type="java.util.Date"/>
<!-- 注意:列名不能为关键字,如果非要用关键字(desc 为 order by 语句的降序关键字),需要用反引号(``) -->
<!--<property name="desc" column="`desc`"/>-->
</class>
</hibernate-mapping>
4、写主配置文件:src/hibernate.cfg.xml;配置数据库连接,和加载映射文件;
<!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 节点代表一个数据库 -->
<session-factory>
<!-- 数据库连接配置:
配置的属性可以在 hibernate-distribution-3.6.0.Final\project\etc\hibernate.properties 中查看 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql:///hib_demo</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<!-- 数据库方言配置:hibernate 在运行的时候,会根据不同的方言生成符合当前数据库语法的 sql 语句 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
<!-- 显示 hibernate 在运行时候执行的 sql 语句 -->
<property name="hibernate.show_sql">true</property>
<!-- 格式化 sql 语句 -->
<property name="hibernate.format_sql">true</property>
<!-- 自动建表:如果表不存在,hibernate 会根据映射文件 自动创建表;
update:如果表不存在就创建,如果表已经存在,则不再创建;
create:每次都创建表;如果表已经存在,则先删除,再创建;
create-drop:在创建 SessionFactory 的时候创建表,在调用 sessionFactory 的 close 方法时候删除表;
validate:执行验证,当映射文件的内容与数据库表结构不一样的时候就会报错;
-->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 加载映射文件 -->
<mapping resource="com/hibernate/demo/Employee.hbm.xml"/>
</session-factory>
</hibernate-configuration>
5、写测试代码:HibernateDemo1.java
package com.hibernate.demo;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;
import org.junit.Test;
import java.util.Date;
/**
* SSH 框架:
* struts:基于 MVC 模式的应用层框架技术;
* hibernate:基于持久层的框架(数据访问层使用);
* spring:创建对象,处理对象的依赖关系,以及框架整合;
*
* ORM:Object Relation Mapping,对象关系映射;
* 关系型数据库有:mysql、oracle 等;
*
* ORM 解决的问题:
* 1、存储:直接将对象存储到数据库;
* 2、获取:直接从数据库中获取对象;
*
* ORM 和 hibernate 的关系:
* hibernate 是 ORM 的实现;
*/
public class HibernateDemo1 {
/**
* 保存数据:直接将对象保存到数据库
*/
@Test
public void testSave(){
// 创建对象
Employee emp = new Employee();
// 如果映射文件中设置主键的生成策略为 自增长(native),则此处设置的 id 值无效;
// 当映射文件中设置主键的生成策略为 assigned 时,此处设置的 id 才有效;
emp.setEmpId(3);
emp.setEmpName("Lily");
emp.setWorkDate(new Date());
// 创建加载配置文件的管理类对象:用于加载配置文件
Configuration config = new Configuration();
// 加载主配置文件:默认加载 src/hibernate.cfg.xml
config.configure();
// 加载指定路径下,指定名称的主配置文件(一般不用)
// config.configure("cn/config/hibernate.cfg.xml");
// 根据加载的配置文件 创建 sessionFactory 工厂对象:用于管理 session
SessionFactory sessionFactory = config.buildSessionFactory();
// 创建 session;session 对象维护了一个连接(Connection),代表了与数据库连接的会话;
// hibernate 最重要的对象,只要使用 hibernate 与数据库操作,都要用到这个对象;
Session session = sessionFactory.openSession();
// 开启事务:hibernate 要求所有与数据库的操作必须有事务的环境,否则报错;
Transaction transaction = session.beginTransaction();
// 保存:将对象保存到数据库
session.save(emp);
// 提交事务
transaction.commit();
// 结束会话,关闭连接
session.close();
sessionFactory.close();
}
}