前一篇博文已经对Hibernate有了一个整体的理解,本篇博文来看一下实现Hibernate的简单示例:
首先,来看下在Eclipse中整体的框架图:
框架图
其中,红色框起来的部分是我们需要的jar包,每个jar包的作用我就不一一介绍了,有兴趣的可以自己去看一看。
编辑实体(News类)
package hsl.domain;
public class News {
// 消息类的标识属性
private Integer id;
// 消息标题
private String title;
// 消息内容
private String content;
// id属性的setter和getter方法
public void setId(Integer id) {
this.id = id;
}
public Integer getId() {
return this.id;
}
// title属性的setter和getter方法
public void setTitle(String title) {
this.title = title;
}
public String getTitle() {
return this.title;
}
// content属性的setter和getter方法
public void setContent(String content) {
this.content = content;
}
public String getContent() {
return this.content;
}
}
创建数据库和表
这个部分我是在navicat for mysql可视化软件中建立的,建立一个名叫hibernate数据库,里面有一个表叫news_table,表的内容如下:
创建实体映射文件News.hbm.xml
<?xml version="1.0" encoding="gb2312"?>
<!-- 指定Hiberante3映射文件的DTD信息 -->
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- hibernate-mapping是映射文件的根元素 -->
<hibernate-mapping package="hsl.domain">
<!-- 每个class元素对应一个持久化对象 -->
<class name="News" table="news_table">
<!-- id元素定义持久化类的标识属性 -->
<id name="id">
<!-- 指定主键生成策略 -->
<generator class="identity" />
</id>
<!-- property元素定义常规属性 -->
<property name="title" />
<property name="content" />
</class>
</hibernate-mapping>
从这一步开始,JDBC开始与Hibernate有一定的区别,这里我们重点讲一下News.hbm.xml的作用。News.hbm.xml的作用简而言之就是对实体和数据库中的表进行相呼应,保证我们对实体对象进行的操作都会在数据库中产生与之对应响应的结果。但仅这样的配置还有一个问题那就是我们如何将能够将数据库中的表与对象进行关联。这就需要接下来的配置了。 创建数据库连接和映射配置文件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="connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- 指定连接数据库的url,hibernate连接的数据库名 -->
<property name="connection.url">jdbc:mysql://localhost/hibernate</property>
<!-- 指定连接数据库的编码 -->
<property name="connection.characterEncoding">utf8</property>
<!-- 指定连接数据库的用户名 -->
<property name="connection.username">root</property>
<!-- 指定连接数据库的密码 -->
<property name="connection.password">123456</property>
<!-- 指定连接池里最大连接数 -->
<property name="hibernate.c3p0.max_size">20</property>
<!-- 指定连接池里最小连接数 -->
<property name="hibernate.c3p0.min_size">1</property>
<!-- 指定连接池里连接的超时时长 -->
<property name="hibernate.c3p0.timeout">5000</property>
<!-- 指定连接池里最大缓存多少个Statement对象 -->
<property name="hibernate.c3p0.max_statements">100</property>
<property name="hibernate.c3p0.idle_test_period">3000</property>
<property name="hibernate.c3p0.acquire_increment">2</property>
<property name="hibernate.c3p0.validate">true</property>
<!-- 指定数据库方言 -->
<!--<property name="dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>-->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 根据需要自动创建数据表 -->
<property name="hbm2ddl.auto">update</property>
<!-- 显示Hibernate持久化操作所生成的SQL -->
<property name="show_sql">true</property>
<!-- 将SQL脚本进行格式化后再输出 -->
<property name="hibernate.format_sql">true</property>
<!-- 罗列所有的映射文件 -->
<mapping resource="hsl/domain/News.hbm.xml"/>
</session-factory>
</hibernate-configuration>
这里的重点区别在于,通过映射说明<mapping resource="com/entity/News.hbm.xml"/>我们可以将数据库连接和映射进行联系,也就是说通过 hibernate.cfg.xml的配置,我们就可以找到具体的实体和数据库表对应关系。到此为止我们所有的配置就进行完毕了,接下来做一个测试。
创建测试文件(NewsManage.java)
package hsl;
import org.hibernate.*;
import org.hibernate.cfg.*;
import hsl.domain.*;
public class NewsManager {
@SuppressWarnings("deprecation")
public static void main(String[] args) throws Exception {
// 实例化Configuration,
Configuration conf = new Configuration();
// 下面方法默认加载hibernate.cfg.xml文件
conf.configure();
// 以Configuration创建SessionFactory
SessionFactory sf = conf.buildSessionFactory();
// 创建Session
Session sess = sf.openSession();
// 开始事务
Transaction tx = sess.beginTransaction();
// 创建消息实例
News n = new News();
// 设置消息标题和消息内容
n.setTitle("中国风");
n.setContent("中国风," + "网站地址hanshilei.3322.org");
// 保存消息
sess.save(n);
// 提交事务
tx.commit();
// 关闭Session
sess.close();
sf.close();
}
}
运行结果: