Hibernate基本映射(三)

2018-01-12 11:15:50来源:oschina作者:architect刘源源人点击

分享

这篇博客小编介绍Hibernate的经典内容:对象关系映射。主要介绍映射的基本概念,映射的分类,映射文件。

概念

ORM(Object Relational Mapping),即对象关系映射。它的作用就是在关系型数据库和对象之间做了一个映射。从对象(Object)映射到关系(Relation),再从关系映射到对象。相信很多人跟小编一个毛病,看到概念就头疼,下面小编画了一张图加深理解。

这张图特别简单:原来,没有Hibernate时,我们需要通过JDBC+手动写SQL语句来操作数据库,现在,有了Hibernate,它将JDBC+SQL进行了高度封装,我们不需要再去和复杂SQL打交道,只要像操作对象一样操作数据库就可以了。

ORM的实现思想就是将数据库中表的数据映射成对象,Hibernate可以使我们采用对象化的思维操作关系型数据库。

映射文件

Hibernate在实现ORM功能的时候主要用到的文件有:1、 映射类(*.java):它是描述数据库表的结构,表中的字段在类中被描述成属性,将来就可以实现把表中的记录映射成为该类的对象了。 2、映射文件(*.hbm.xml):它是指定数据库表和映射类之间的关系,包括映射类和数据库表的对应关系、表字段和类属性类型的对应关系以及表字段和类属性名称的对应关系等。 3、 hibernate核心配置文件(*.properties/*.cfg.xml):它指定hibernate的一些核心配置,包含与数据库连接时需要的连接信息,比如连接哪种数据库、登录数据库的用户名、登录密码以及连接字符串等。映射文件的地址信息也放在这里。

分类

上面的内容看上去挺多,其实特别少,基本映射很简单,我们主要学习关联关系映射,其他几种映射一般不会用,只需要了解即可,用的时候看一下相关资料会做就好。

基本映射

上篇博文我们已经实现了一个基本映射,是使用XML方式配置映射,如下所示:


[html]view plaincopy

<?xmlversion="1.0"?>
"-//Hibernate/HibernateMappingDTD3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">












除了XML方式配置映射外,还可以通过给类文件添加注解的方式配置映射,在上篇博文的基础之上,我们稍加修改。

1、加入hibernate annotion支持包


*hibernate-annotations.jar*hibernate-commons-annotations.jar *ejb3-persistence.jar

如图所示:


2、建立实体类User,采用注解完成映射


[java]view plaincopy

packagecom.liang.hibernate;importjava.util.Date;importjavax.persistence.Column;
importjavax.persistence.Entity;
importjavax.persistence.GeneratedValue;
importjavax.persistence.GenerationType;
importjavax.persistence.Id;
importjavax.persistence.Temporal;
importjavax.persistence.TemporalType;@Entity//不写Table默认为user,@Table(name="t_user")
publicclassUser{@Id//主键
@GeneratedValue(strategy=GenerationType.AUTO)//采用数据库自增方式生成主键
//JPA提供的四种标准用法为TABLE,SEQUENCE,IDENTITY,AUTO.
//TABLE:使用一个特定的数据库表格来保存主键。
//SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列。
//IDENTITY:主键由数据库自动生成(主要是自动增长型)
//AUTO:主键由程序控制。
privateintid;privateStringname;
privateStringpassword;@Temporal(TemporalType.DATE)//生成yyyy-MM-dd类型的日期
privateDatecreateTime;
@Temporal(TemporalType.DATE)//生成yyyy-MM-dd类型的日期
privateDateexpireTime;
publicintgetId(){
returnid;
}
publicvoidsetId(intid){
this.id=id;
}
@Column(name="name",unique=true,nullable=false)//字段为name,不允许为空,用户名唯一
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicStringgetPassword(){
returnpassword;
}
publicvoidsetPassword(Stringpassword){
this.password=password;
}
publicDategetCreateTime(){
returncreateTime;
}
publicvoidsetCreateTime(DatecreateTime){
this.createTime=createTime;
}
publicDategetExpireTime(){
returnexpireTime;
}
publicvoidsetExpireTime(DateexpireTime){
this.expireTime=expireTime;
}}

注:由于主键改成了自增长,所以数据类型修改成了int类型

3、提供hibernate.cfg.xml文件,将实体类User加入到hibernate.cfg.xml配置文件中,完成基本配置


[html]view plaincopy

"-//Hibernate/HibernateConfigurationDTD3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">


com.mysql.jdbc.Driver

jdbc:mysql://localhost:3306/hibernate_first

root

123456

org.hibernate.dialect.MySQLDialect



4、编写工具类ExportDB.java,注解生成ddl,必须采用AnnotationConfiguration类


[java]view plaincopy

packagecom.liang.hibernate;importorg.hibernate.cfg.AnnotationConfiguration;
importorg.hibernate.cfg.Configuration;
importorg.hibernate.tool.hbm2ddl.SchemaExport;/**
*将hbm生成ddl
*@authorliang
*
*/
publicclassExportDB{
publicstaticvoidmain(String[]args){
//默认读取hibernate.cfg.xml文件
Configurationcfg=newAnnotationConfiguration().configure();
SchemaExportexport=newSchemaExport(cfg);
export.create(true,true);
}
}

数据库生成表如图所示:



5、建立客户端类Client,添加用户数据到mysql


[java]view plaincopy

packagecom.liang.hibernate;importjava.util.Date;importorg.hibernate.Session;
importorg.hibernate.SessionFactory;importorg.hibernate.cfg.AnnotationConfiguration;
importorg.hibernate.cfg.Configuration;publicclassClient{
publicstaticvoidmain(String[]args){
//读取hibernate.cfg.xml文件
Configurationcfg=newAnnotationConfiguration().configure();
//建立SessionFactory
SessionFactoryfactory=cfg.buildSessionFactory();//取得session
Sessionsession=null;try{
//开启session
session=factory.openSession();
//开启事务
session.beginTransaction();Useruser=newUser();
user.setName("jiuqiyuliang");
user.setPassword("123456");
user.setCreateTime(newDate());
user.setExpireTime(newDate());
//保存User对象
session.save(user);//提交事务
session.getTransaction().commit();}catch(Exceptione){
e.printStackTrace();
//回滚事务
session.getTransaction().rollback();
}finally{
if(session!=null){
if(session.isOpen()){
//关闭session
session.close();
}
}
}
}
}

运行之后,数据库表生成的数据,如下图所示:


注解和xml文件的优缺点,网上有很多,有兴趣可以查一下,小编就不再累述了,但是小编认为,学习初期最好不要使用注解,不易于理解Hibernate的原理,并且注解对于程序的可扩展性而言,太差了。

下篇博文,我们介绍Hibernate的七种关联关系映射,异常简单,谢谢关注。

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台