【与ORM】

Object Relational Mapping,对象关系映射,将对象和关系联系了起来。面向对象是从耦合、聚合、封装等的基础上发展起来的,而关系数据库则是从数学理论发展而来的,两套理论存在显著的区别。为了解决这个不匹配的现象,对象关系映射技术应运而生,这样开发人员就可以以面向对象的思想来操作数据库。

实现ORM技术的框架有很多,.net的有NHibernate、EF、iBATIS.NET等,java的有mybatis、ibatis,当然还有Hibernate。

言归正传,我们这里介绍Hibernate,他是一个实现了ORM技术的框架。Hibernate对jdbc进行了封装,这使得我们操作数据库变得更加简单。本篇博客主要介绍Hibernate自动建表的功能。

【Demo】

我们以一个简单的例子来看,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;
}
}

Uer类对应的映射文件User.hbm.xml,该配置文件中依据User实体类来建立的。具体建立时,可以一个实体一个映射文件,也可以多个实体配在一个映射文件中。

它指定数据库表(比如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>

现在实体类和对应的映射文件已经都准备好了,还差数据库的连接了。配置内容包括数据库的驱动类,连接数据库的url,用户名和密码等等。这里用的是mysql数据库,需要注意的是,我们一定要把实体类的映射文件加入,不然无法获取。

<!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>

之后我们建立一个测试类,来测试是否能够生成表。不过在执行该类之前,需要手动在数据库中建立相应的数据库,数据库的名称需要和配置文件保持一致。因为Hibernate只会自动建表,不会自动建库。

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);
}

这个方法主要功能是将hbm生成ddl语句,进行建表。DDL是用来操作数据库、表、视图等,所以最终需要转换成ddl语句来完成建表。这样也比较麻烦,每次建表都要单独执行该类。还有一种方法,修改配置文件。每次加载hibernate时都会删除上一次的生成的表,然后根据你的model类再重新来生成新表。但这个参数并不建议使用,正是因为每次加载都会重新生成表,会使得表中的数据丢失。

<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,如果没有这个东西,自动建表也是很麻烦的啊。不管是哪个巨人吧,还是先站在巨人的肩膀上了,然后再努力成为一个巨人!

【SSH】——Hibernate实现简单的自动建表的更多相关文章

  1. 配置hibernate根据实体类自动建表功能

    Hibernate支持自动建表,在开发阶段很方便,可以保证hbm与数据库表结构的自动同步. 如何使用呢?很简单,只要在hibernate.cfg.xml里加上如下代码 Xml代码<propert ...

  2. Hibernate+maven+eclipse 实现自动建表

    一.需求 如题,当建好Model 时,不想自己手工建表,可以采取hibernate进行自动建表.下面将用一个小例子来说明如何将其实现. 二.实现 说明:1)这里用的是4.3.1.Final版本的hib ...

  3. 【原创】Hibernate通过实体类自动建表时type=MyISAM的问题

    ι 版权声明:本文为博主原创文章,未经博主允许不得转载. 当使用的mysql数据库为5.5版本时,方言需要设置为 <property name="hibernate.dialect&q ...

  4. 关于Hibernate 连接mysql不能自动建表的问题

    最近看旧书,李刚那本<轻量级J2EE>在讲解hibernate的时候遇到一个问题,就是与mysql连接后,明明配置了自动建表,却老是建不了表,上网查了发现是方言的原因,到底什么是方言?这里 ...

  5. spring和hibernate整合时无法自动建表

    在使用spring整合hibernate时候代码如下: <property name="dataSource" ref="dataSource" /> ...

  6. hibernate连接mysql,自动建表失败

    hibernate的列名使用了mysql的关键字.

  7. [转]Hibernate不能自动建表解决办法及Hibernate不同数据库的连接及SQL方言

    最近开始学Hibernate,看的是李刚的那本<轻量级java ee企业应用实战>.头一个hibernate程序,我原原本本的按照书上例子写下来,同时只是改动了些mysql的连接参数,并且 ...

  8. hibernate注解(自动建表如何有表DDL注释) -- Comment用法

    import java.io.Serializable; import java.sql.Date; import java.sql.Timestamp; import javax.persisten ...

  9. Hibernate不能自动建表解决办法

    最近开始学Hibernate,看的是李刚的那本<轻量级java ee企业应用实战>.头一个hibernate程序,我原原本本的按照书上例子写下来,同时只是改动了些mysql的连接参数,并且 ...

随机推荐

  1. Sass 基础(五)

    @if @if 指令是一个SassScript,它可以根据条件处理样式块,如果条件为true返回一个样式块,反之 false 返回另一个样式块,在Sass 中除了@if之,还可以配合@else if和 ...

  2. span没有name属性

    <span id="test" name="测试数据">测试咯</span> 在eclipse中这么写发现会有警告提示.百度发现原来sp ...

  3. cookie与session的区别,你真的明白吗?

    当我们访问网页时,http是属于无状态的,为什么呢?接下来由我慢慢讲解,在cookie的到来之前,你第一次访问页面的时候和最后一次访问页面服务器是不知道的,不知道那一次访问的页面是你.当用户登录的时候 ...

  4. C/C++使用keybd_event模拟键盘按键

    #include <stdio.h> #include <Windows.h> /* 设置键盘大小写状态 big:为TRUE则切换大写状态,否则切换小写状态 */ VOID M ...

  5. oracle调度中使用schedule管理调度

    开始前,先说一句:作为dba应该禁止所有应用使用dbms_job. dbms_scheduler非常复杂,oracle在两本书中专门花费不少章节描述,这两本书分别是: Oracle® Database ...

  6. linux系统之-vi编辑器

    在linux系统使用中,掌握熟练的vi编辑器,可以提高linux工作效率.那么vi编辑器的使用方法有哪些呢? vi编辑器可在绝大部分linux发行版中使用. Vi编辑器的作用:创建或修改文件:维护li ...

  7. 【ntp时间校准配置】

    Ntp(网络时间协议)是一种可以通过TCP/IP网络传播,其架构模式可分为C/S(客户端/服务器),PTP(对等),broatcast(广播), mutilbrocast(组播),无论在任何系统或设备 ...

  8. (转)手游应该怎么做 UI 设计?

    之前一直做互动设计,在UI上有一些积累. 转战手游后发现,有着标准.互动方式.用户行为等等与常规大屏UI设计的不同,但是在设计流程,思考方式上是一样的. 以目前项目中一个界面为例(未完成版本)来说一下 ...

  9. djangorestframework怎么这么好用!

    一年前就已经用过restframework, 当时觉得这个只是给web框架打辅助的, 他能实现的我也都实现(可能没有那么好用, 嘿嘿) 但是我有一种东西叫做效率, 时间就是金钱, 别人造好的就直接用就 ...

  10. Laravel-admin 当使用Form组件hasMany的时候 进行编辑出现错误 foreach错误的时候解决方案

    我的关联关系原名是 goodImage 修改成 image 之后解决问题 分析得出应该是  laravel会将goodImage 转成 good_image字段  这样就foreach会报错  所以出 ...