很多人说Hbiernate已经没人用了,市面上有太多可供选择的开源工具.诚然市面上有很多新技术,但是作为初学者,还是要踏踏实实从基础做起,而且Hbiernate有自己的应用场景.
上篇博文 我们介绍了Hibernate的基本概念、Hibernate的核心以及Hibernate的执行原理,可以很好帮助我们从宏观上了解Hibernate,
再看这篇博客之前,请先回顾上篇博文内容。这篇博文,是Hibernate的一个入门,一起来学习.
一、开发包和版本介绍
这里使用的环境为: win10+jdk1.7+Tomcat7+mysql5.5
下载网址:http://sourceforge.net/projects/hibernate/files/hibernate-orm/5.0.7.Final/
页面显示如下图:
需要说明的是:
这里使用的环境如下:
win10+ jdk1.7 +Tomcat5.0 + MySQL5.1
开发包目录,如下图所示:
从图可以看出,hibernate5.0.7的解压s目录中包含一系列的子目录,这些子目录分别用于存放不同功能的文件,接下来针对这些子目录进行简单介绍,具体如下:
documentation文件夹:存放Hibernate的相关文档,包括参考文档的API文档。
lib文件夹:存放Hibernate编译和运行所依赖的JAR包。其中required子目录下包含了运行Hibernate5项目必须的JAR包。
project文件夹:存放Hibernate各种相关的源代码。
三、所需jar包
hibernate5.jar // Hibernate的核心包
dom4j-1.2.16..jar //dom4j读取xml文件包
mysql-connector-Java-5.1.7-bin.jar // MySQL的jdbc驱动包
Hibernate的作用:让我们以面向对象的方式或思维来考虑怎么向关系型数据库存取数据。它需要与相应的数据库打交道,所以需要相应的jdbc驱动。我们的database用的是MySQL,所以需要引入MySQL的jdbc驱动。
log4j1.2.16.jar //记录日志框架
由于log4j的记录日志比jdk自带的记录日志功能更加美观,简单,易配置日志级别,便于调试,我们选择使用log4j。
第二步:创建数据库和实体类
1. 创建数据库及客户表
mysql> create database hibernate;
3. Query OK, 1 row affected (0.00 sec)
4. mysql> use hibernate
5. Database changed
6. mysql> CREATE TABLE `cst_customer` (
7. -> `cust_id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '客户编号(主键)',
8. -> `cust_name` varchar(32) NOT NULL COMMENT '客户名称(公司名称)',
9. -> `cust_source` varchar(32) DEFAULT NULL COMMENT '客户信息来源',
10. -> `cust_industry` varchar(32) DEFAULT NULL COMMENT '客户所属行业',
11. -> `cust_level` varchar(32) DEFAULT NULL COMMENT '客户级别',
12. -> `cust_address` varchar(128) DEFAULT NULL COMMENT '客户联系地址',
13. -> `cust_phone` varchar(64) DEFAULT NULL COMMENT '客户联系电话',
14. -> PRIMARY KEY (`cust_id`)
15. -> ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
16. Query OK, 0 rows affected (0.39 sec)
2. 根据数据库创建持久化类
新建一个项目,在src目录下创建cn.xinsz08.domian包
3. 在domain包内创建实体类Customer类,对应数据库表cus_customer
第三步:写代码
(1)编写客户实体类Customer,并创建get/set方法
package cn.xinsz08.domain;
import java.io.Serializable;
publicclass Customer implements Serializable {
/**
* 客户的实体类
*/
private Long custId;
private String custName;
private String custSource;
private String custIndustry;
private String custLevel;
private String custAddress;
private String custPhone;
public Long getCustId() {
returncustId;
}
publicvoid setCustId(Long custId) {
this.custId = custId;
}
public String getCustName() {
returncustName;
}
publicvoid setCustName(String custName) {
this.custName = custName;
}
public String getCustSource() {
returncustSource;
}
publicvoid setCustSource(String custSource) {
this.custSource = custSource;
}
public String getCustIndustry() {
returncustIndustry;
}
publicvoid setCustIndustry(String custIndustry) {
this.custIndustry = custIndustry;
}
public String getCustLevel() {
returncustLevel;
}
publicvoid setCustLevel(String custLevel) {
this.custLevel = custLevel;
}
public String getCustAddress() {
returncustAddress;
}
publicvoid setCustAddress(String custAddress) {
this.custAddress = custAddress;
}
public String getCustPhone() {
returncustPhone;
}
publicvoid setCustPhone(String custPhone) {
this.custPhone = custPhone;
}
public String toString() {
return"Customer [custId=" + custId + ", custName=" + custName + ", custSource=" + custSource
+ ", custIndustry=" + custIndustry + ", custLevel=" + custLevel + ", custAddress=" + custAddress
+ ", custPhone=" + custPhone + "]";
}
}
实体类Customer 目前还不具备持久化操作的能力,而Hibernate需要知道实体类Customer映射到数据库Hibernate中的哪个表,以及类中的属性对应表中那个字段,这些需要在下面的映射文件中配置.
(2)在实体类Custmoer包中创建Customer.hbm.xml文件,完成实体类映射
导入dtd约束步骤如下:
Customer.hbm.xml配置文件内容
<!-- 导入约束:dtd约束 位置:在Hibernate的核心jar包中名称为hibernate-mapping-3.0.dtd 明确该文件中的内容:
实体类和表的对应关系 实体类中属性和表的字段的对应关系 -->
<hibernate-mapping package="cn.xinsz08.domain"><!-- package属性,用于设定 包的名称,
接下来该配置文件凡是用到此包名的都可以省略 -->
<!-- class 标签 作用:建立实体类和表的对应关系 属性: name:指定实体类的名称 table:
指定数据表的名称 -->
<class name="Customer" table="cut_customer">
<!-- id标签 作用:用于映射主键 属性: name:指定的是属性名称,也就是get/set方法后面的部分,
并且首字母要转为小写 column:指定的是数据库字段名称 -->
<id name="custId" column="cust_id">
<!-- generator标签: 作用:配置主键的生产策略 属性: class :指定生成方式的取值 取值1:native
,使用本地数据库的自动增长能力 -->
<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>
(3) 编写主配置文件,把Customer.bhm.xml文件加入到hibernate.cfgxml文件中
在src下创建主配置文件:hibernate.cfg.xml文件.
并按如下图所示,导入约束
配置文件的配置
<hibernate-configuration>
<!-- 配置SessionFactory
注:sessionFactory是一个工厂,用于生产Session对象的
创建SessionFactory 由三部分组成:
1.连接数据库的基本信息
2.hibernate的基本配置
3.映射文件的位置
-->
<session-factory>
<!-- 1.连接数据库的基本信息 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate</property>
<property name="hibernate.connection.usrname">root</property>
<property name="hibernate.connection.password">root</property>
<!-- 2.hibernate的基本配置 -->
<!-- 指定对应数据库的方言,hibernate为了更好适配各种关系数据库,
针对每种数据库都指定了一个方言dialect -->
<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语句
*none:不用hibernate自动生成表
*create:每次都会创建一个新表
*create-drop:每次都会创建一个新的表,执行程序结束后删除这个表
*update:如果数据库中有表,使用原来的表,如果没有标,创建一个新表
-->
<!-- 设置hibernate的连接池提供商C3P0 -->
<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
<!-- 把session绑定到当前线程上 -->
<property name="hibernate.current_session_context_class">thread</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 映射文件位置 -->
<mapping resource="cn/xinsz08/domain/Customer.hbm.xml"/>
</session-factory>
</hibernate-configuration>
(4)实现保存操作
在项目中新建一个名称为cn.xinsz08.test的包,然后在包中建立一个HibernateTest1.java 的文件,进行测试
package cn.xinsz08.test;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;
import cn.xinsz08.domain.Customer;
/**
* 测试:把一个客户保存到数据库中
* @author Administrator
*
*/
publicclass HibernateTest1 {
publicvoid test1(){
Customer ct =new Customer();
ct.setCustName("xinsz08");
ct.setCustIndustry("程序猿");
ct.setCustSource("java");
ct.setCustLevel("p7");
ct.setCustAddress("xinsz08@yeah.net");
ct.setCustPhone("158****08**");
//1.加载主配置文件
Configuration cfg=new Configuration();
cfg.configure(); //读取操作,加载配置文件
//2构建sessionFactory
SessionFactory factory =cfg.buildSessionFactory();
//3.获取Session
Session session=factory.openSession();
//4.开启事务
Transaction tx =session.beginTransaction();
//5.执行操作
session.save(ct);
//6.提交事务
tx.commit();
//7.释放资源
session.close();
factory.close();
}
}
在执行之前,数据库是空的.
mysql> show tables;
Empty set (0.00 sec)
执行后控制台输出:(hibernate执行SQL语句)
数据库显示结果:
mysql> set names gbk;
Query OK, 0 rows affected (0.00 sec)
mysql> show tables; +-----------------+ | Tables_in_hibernate| +-----------------+ | cst_customer | +-----------------+ 1 row in set (0.00 sec) |
mysql> select * from cst_customer \G *************************** 1. row *************************** cust_id: 1 cust_name: xinsz08 cust_source: java cust_industry: 程序猿 cust_level: p7 cust_address: xinsz08@yeah.net cust_phone: 158****08** 1 rows in set (0.00 sec) |
可以看到,我们没有写任何SQL语句,但是hibernate依然保存数据成功了.而且一开始是只有数据库hibernate,没有表的,执行完后,自动创建表,因为我们在配置文件里使用了update.
(四)总结
通过上面的代码我们可以看出,作为开发人员只需要写好相应的实体类,然后通过配置就可以实现了表的建立以及向
表中实现数据的增删改查,这里只介绍了插入,后面会介绍增删改.
在代码中有许多Hibernate的核心对象,例如Configuration、SessionFactory、Session等等。这些内容将在以后
介绍。