在使用Hibernate的时候使得访问数据库变得非常的容易,因为之前使用JDBC的时候做数据库相关功能开发会有许多重复性的工作,但是Hibernate将会使其变得非常容易简单,代码也比较简洁。
比如我们先创建一个实体类Product,用来映射数据库中的表product_
package com.vipcpi;
public class Product {
int id;
String name;
float price;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
}
接下来就到我们的重点了,就是配置文件Product.hbm.xml,用来映射Product类对应的数据库中的product_表
注意!!!这里的文件名Product.hbm.xml中的P一定要大写,要和Product实体类的类名保持一致。
<?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对应的就是实体类Product所在的包-->
<hibernate-mapping package="com.vipcpi">
<!--下面这一句表示类Product对应数据库表product_-->
<class name="Product" table="product_">
<!--实体类属性id,映射表中的字段id-->
<id name="id" column="id">
<!--下面这标识数据库的自增长方式采用的是数据库的本地方式,如果连接的是oracle数据库,则指定sequence作为id的增长方式-->
<generator class="native">
</generator>
</id>
<!--这里的配置只是写了name属性,并没有通过column指定字段,那么说明字段的名字也是name-->
<property name="name" />
<property name="price" />
</class>
</hibernate-mapping>
接下来就是配置文件 hibernate.cfg.xml,在src目录下创建此文件,此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>
<!-- Database connection settings,依次为:
数据库驱动名称,数据库连接地址,数据库编码格式,数据库用户名,数据库密码
-->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/test?characterEncoding=UTF-8</property>
<property name="connection.characterEncoding">utf-8</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<!-- SQL dialect
数据库SQL语言类型,设置使用线程,设置是否显示SQL语句,最后一个就是Hibernate的映射文件
-->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="current_session_context_class">thread</property>
<property name="show_sql">true</property>
<property name="hbm2ddl.auto">update</property>
<mapping resource="com/vipcpi/Product.hbm.xml" />
</session-factory>
</hibernate-configuration>
接下来说漏掉的那个<property name="hbm2ddl.auto">update</property>
的作用:
这个属性标签中有四个参数可以写,这四个参数是对数据库中插入的进行不同的操作,分别为:
(1)create-drop
(2)create
(3)update
(4)validate
下面分别来介绍他们的作用以及对数据库中的影响
(1)<property name="hibernate.hbm2ddl.auto"> create-drop </property>
create-drop:表示在hebarinate初始化时创建表格,程序运行结束的时候会删除相应的表格,在实际项目中不用。
(2)<property name="hibernate.hbm2ddl.auto">create</property>
在hibernate初始化时会创建表格,在运行结束之后不删除表格,而是在下一次运行的时候如果有旧的删掉,没有旧的,重新建表格。
(3)<property name="hibernate.hbm2ddl.auto">update</property>
只是根据映射文件去和数据库中的表对应起来,如果不一致,就更新表的结构
(4)<property name="hibernate.hbm2ddl.auto">validate</property>
校验映射文件和数据库中的表是不是能对应起来,不能对应报错,实际中常用
注意:在使用的时候必须要慎重,我就是在当时学习的时候所设置的属性是validate,所以只要改了数据库名就会抛初始化异常,当时我郁闷了半天都不知道是怎么回事,没有往这方面想,后来才知到validate是在没有数据库名的时候不让你创建,会抛异常的。
测试插入收据,Hibernate的基本步骤是:
- 获取SessionFctory
- 通过SessionFctory获取一个session
- 在session基础上开启一个事务【查看事务详解】
- 通过调用session的save方法将对象保存到数据库
- 提交事务
- 关闭session
- 关闭sessionfactory
示例代码
package com.vipcpi.yang;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import com.vipcpi.Product;
public class TestHibernate {
public static void main(String[] args) {
SessionFactory sf=new Configuration().configure().buildSessionFactory();
Session s=sf.openSession();
s.beginTransaction();
Product p=new Product();
p.setId(2);
p.setName("CSDN");
p.setPrice(240);
s.save(p);
s.getTransaction().commit();
s.close();
sf.close();
}
}
经过上面实例估计都差不多明白了Hibernate的操作步骤,接下来结合原理估计就更清楚他的机制了。
应用程序通过Hibernate将一个Product对象插入到product_表中,其中Product.cfg.xml提供数据库连接的基本信息
Product.hbm.xml提供对象和表的映射关系