Object Relational Mapping,对象关系映射,将对象和关系联系了起来。面向对象是从耦合、聚合、封装等的基础上发展起来的,而关系数据库则是从数学理论发展而来的,两套理论存在显著的区别。为了解决这个不匹配的现象,对象关系映射技术应运而生,这样开发人员就可以以面向对象的思想来操作数据库。
实现ORM技术的框架有很多,.net的有NHibernate、EF、iBATIS.NET等,java的有mybatis、ibatis,当然还有Hibernate。
言归正传,我们这里介绍Hibernate,他是一个实现了ORM技术的框架。Hibernate对jdbc进行了封装,这使得我们操作数据库变得更加简单。本篇博客主要介绍Hibernate自动建表的功能。
我们以一个简单的例子来看,Hibernate是如何自动建表的。其中涉及到User类,以及他对应的映射文件User.hbm.xml,Hibernate的数据库配置文件hibernate.cfg.xml,后面我们会详细介绍各自的作用。
首先从实体开始,我们先来构造User类。
描述数据库表的结构,表中的字段对应类中的属性,数据库中的表对应一个类。
这里的User是一个java类,也可以叫作POJO对象。即Plain Ordinary Java Object,简单的Java对象,只有一些属性及其getter setter方法的类,没有业务逻辑。POJO对象可以方便程序员操作数据库中的表,进行get和set操作。
package com.hibernate; import java.util.Date; /** * 用户类 * @author YANG * */ public class User { //用户id private String id; //用户名称 private String name; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
它指定数据库表(比如t_User)和映射类(User.java)之间的关系,包括映射类和数据库表的对应关系、表字段和类属性类型的对应关系以及表字段和类属性名称的对应关系等。
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping > <!-- 数据库默认表的名称和类名相同, 如果需要改变或类名为关键字时, 可以添加table="t_user"给表重命名 --> <class name="com.hibernate.User" ><!-- table="t_user" --> <!-- 映射主键 --> <id name="id"> <!-- 主键生成策略,利用生成器 --> <generator class="uuid"></generator> </id> <!-- 利用property映射其他字段 --> <property name="name" ></property><!-- 若加上column="user_name",数据库字段名为user_name --> </class> </hibernate-mapping>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!-- 驱动类 --> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <!-- 连接的url,数据库名称为hibernate_first --> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_first</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password"></property> <!-- 适配器,方言,用于翻译成mysql的语句 --> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <!-- 设置打印到控制台 --> <property name="hibernate.show_sql">true</property> <!-- 格式化sql --> <property name="hibernate.format_sql">true</property> <!-- 映射文件加入 --> <mapping resource="com/hibernate/User.hbm.xml"/> </session-factory> </hibernate-configuration>
public static void main(String[] args){ //读取的是properties文件 //Configuration cfg=new Configuration(); Configuration cfg=new Configuration().configure(); //工具类 SchemaExport export=new SchemaExport(cfg); //打到控制台,输出到数据库 export.create(true, true); }
<properties> <property name="hibernate.hbm2ddl.auto" value="create" /> </properties>
drop table if exists User create table User ( id varchar(255) not null, name varchar(255), primary key (id) )
之前就接触过自动建表这部分,但当时就只是照着做,没有去看是如何实现的,觉得好神奇啊。不过边用边总结一下,就会有恍然大悟的感觉,其实也就是这个样子啦。其实也是人家Hibernate-tool里面的工具类封装的好,像SchemaExport,如果没有这个东西,自动建表也是很麻烦的啊。不管是哪个巨人吧,还是先站在巨人的肩膀上了,然后再努力成为一个巨人!