Hibernate的映射機制
來源:程序員人生 發布時間:2014-12-23 09:05:57 閱讀次數:3362次
Hibernate的映照機制
對象關系映照(Object Relation Mapping(ORM))是1種為了解決面向對象與面向關系
數據庫互不匹配現象的技術,簡而言之
ORM是通過使用描寫對象之間映照的元數據,將java程序中的對象自動持久化到關系
數據庫中,這類映照機制從本質上來講
其實就是將數據從1種情勢轉化為另外一種情勢
Hibernate的基本映照數據類型
Hibernate的基本映照數據類型是java基本類型與標準SQL類型相互轉化的橋梁,其關系
java類型----------->Hibernate的映照數據類型----------->標準SQL類型
通過Hibernate的基本映照數據類型可以非常方便地將數據從1種情勢轉化成另外一個情勢,完成高質量的ORM任務
...
<!--
name:這是持久化類User.java中1個String類型的屬性
column:這是
數據庫表user中1個類型為char(20)的字段
type:這是Hibernate映照類型
-->
<property name="password"
column="password"
type="string"
...
>
datamap數據表
-----------------------------------------------------------------------------------------------
字段名稱
數據類型
主鍵
自增
允許為空
描寫
ID
int(4)
是
增1
否
ID號
MYBOOLEAN
bit(1)
邏輯型數據
MYINT
int(5)
整型數據
MYLONG
bigint(11)
長整型數據
MYFLOAT
float(8,2)
單精度浮點型數據
MYDOUBLE
double(10,2)
雙精度浮點型數據
MYDECIMAL
decimal(10,2)
Decimal型數據
MYSTRING
varchar(100)
字符串數據
MYTEXT
text
Text型數據
MYDATE
date
Date型數據
MYTIME
time
Time型數據
MYDATETIME
datetime
Datetime型數據
MYTIMESTAMP
timestamp
Timestamp型數據
MYBINARY
varbinary(10240)
Binary型數據
MYBLOB
longblob
Blob型數據
------------------------------------------------------------------------------------------------
其對應的持久化類Datamap.java
com.hephec.orm
import java.io.Serializable
public class Datamap implements Serializable{
private int hashValue=0;
private Integer id;
private Boolean myboolean;
private Integer myint;
private Long mylong;
private Float myfloat;
private Double mydouble;
private BigDecimal mydecimal;
private String mytext;
private String mytext;
private Date mydatel;
private Time mytime;
private Date mydatetime;
private Timestamp mytimestamp;
private byte[] mybinary;
private Blob myblob;
private Datamap(){}//構造方法
//getter...setter省略
}
datamap表與Datamap類的ORM映照文件Datamap.hbm.xml
<hibernate-mapping package="com.orm">
<class name="Datamap" table="datamap">
<id name="id" column="ID" type="Integer">
<generator class="identity"/>
</id>
<property name="myboolean" column="MYBOOLEAN" type="boolean"/>
<property name="myint" column="MYINT" type="integer"/>
<property name="mylong" column="MYLONG" type="long"/>
<property name="myfloat" column="MYFLOAT" type="float"/>
<property name="mydouble" column="MYDOUBLE" type="double"/>
<property name="mydecimal" column="MYDECIMAL" type="decimal"/>
<property name="mystring" column="MYSTRING" type="string"/>
<property name="mytext" column="MYTEXT" type="string"/>
<property name="mydate" column="MYDATE" type="date"/>
<property name="mytime" column="MYTIME" type="time"/>
<property name="mydatetime" column="MYDATETIME" type="timestamp"/>
<property name="mytimestamp" column="MYTEMESTAMP" type="timestamp"/>
<property name="mybinary" column="MYBINARY" type="binary"/>
<property name="myblob" column="MYBLOB" type="blob"/>
</class>
<hibernate-mapping/>
(1)創建數據訪問DAO接口TestDAO.java
package com.DAO;
import com.ORM.*;
public interface TestDAO{
public void addDatamap(Datamap datamap);
public Datamap loadDatamap(Integer id);
public void delDatamap(Integer id);
}
(2)創建數據訪問DAO接口實現TestDAOImpl.java
package com.DAO;
import com.ORM.*;
import org.hibernate.*;
public class TestDAOImpl implements TestDAO{
public void addDatamap(Datamap datamap){
Session session=MySessionFactory.currentSession();
Transaction ts=null;
try{
ts=session.beginTransaction();
session.save(datamap);
ts.commit();
}catch(Exception e){
if(ts!=null){
ts.rollback();
}
e.printStackTrace();
}finally{
MySessionFactory.closeSession();
}
}
public Datamap loadDatamap(Integer id){
Session session=MySessionFactory.currentSession();
Transaction ts=null;
try{
ts=session.beginTransaction();
datamap=(Datamap)session.get(Datamap.class,id);
ts.commit();
}catch(Exception e){
if(ts!=null){
ts.rollback();
}
e.printStackTrace();
}finally{
MySessionFactory.closeSession();
}
return datamap;
}
public void delDatamap(Integer id){
Session session=MySessionFactory.currentSession();
Transaction ts=null;
try{
ts=session.beginTransaction();
Datamap datamap=(Datamap)session.load(Datamap.class,id);
session.delete(datamap);
ts.commit();
}catch(Exception e){
if(ts!=null){
ts.rollback();
}
e.printStackTrace();
}finally{
MySessionFactory.closeSession();
}
}
}
(3)創建1個可供測試用的TestBean.java
package com.bean;
import com.ORM.*;
import java.io.*;
import java.math.BigDecimal;
import java.net.*;
import org.hibernate.*;
public class TestBean{
TestDAO dao=new TestDAOImpl();
//得到指定URL的html內容
private String getHtmlByUrl(String url){
StringBuffer hmtl=new StringBuffer();
String line=null;
try{
URL u=new URL(url);
URLConnection uc=u.openConnection();
BufferedReader br=new BufferedReader(new InputStreamReader(uc.getInputStream()));
while(line=(br.readLine())!=null){
html.append(line);
}
}catch(Exception e){
e.printStackTrace();
}
return html.toString();
}
//讀取2進制流
private byte[] readBinary(InputStream in){
byte[] binCodes=null;
try{
binCodes=new byte[in.available()];
in.read(binCodes);
in.close();
}catch(Exception e){
e.printStackTrace();
}
return binCodes;
}
}
//從輸出流中創建BLOB對象
private java.sql.Blob getBlob(InputStream in){
java.sql.Blob blob=null;
try{
blob=Hibernate.createBlob(in);
in.close();
}catch(Exception e){
e.printStackTrace();
}
return blob;
}
Hibernate的映照機制
對象關系映照(Object Relation Mapping(ORM))是1種為了解決面向對象與面向關系
數據庫互不匹配現象的技術,簡而言之
ORM是通過使用描寫對象之間映照的元數據,將java程序中的對象自動持久化到關系
數據庫中,這類映照機制從本質上來講
其實就是將數據從1種情勢轉化為另外一種情勢
Hibernate的基本映照數據類型
Hibernate的基本映照數據類型是java基本類型與標準SQL類型相互轉化的橋梁,其關系
java類型----------->Hibernate的映照數據類型----------->標準SQL類型
通過Hibernate的基本映照數據類型可以非常方便地將數據從1種情勢轉化成另外一個情勢,完成高質量的ORM任務
...
<!--
name:這是持久化類User.java中1個String類型的屬性
column:這是
數據庫表user中1個類型為char(20)的字段
type:這是Hibernate映照類型
-->
<property name="password"
column="password"
type="string"
...
>
datamap數據表
-----------------------------------------------------------------------------------------------
字段名稱
數據類型
主鍵
自增
允許為空
描寫
ID
int(4)
是
增1
否
ID號
MYBOOLEAN
bit(1)
邏輯型數據
MYINT
int(5)
整型數據
MYLONG
bigint(11)
長整型數據
MYFLOAT
float(8,2)
單精度浮點型數據
MYDOUBLE
double(10,2)
雙精度浮點型數據
MYDECIMAL
decimal(10,2)
Decimal型數據
MYSTRING
varchar(100)
字符串數據
MYTEXT
text
Text型數據
MYDATE
date
Date型數據
MYTIME
time
Time型數據
MYDATETIME
datetime
Datetime型數據
MYTIMESTAMP
timestamp
Timestamp型數據
MYBINARY
varbinary(10240)
Binary型數據
MYBLOB
longblob
Blob型數據
------------------------------------------------------------------------------------------------
其對應的持久化類Datamap.java
com.hephec.orm
import java.io.Serializable
public class Datamap implements Serializable{
private int hashValue=0;
private Integer id;
private Boolean myboolean;
private Integer myint;
private Long mylong;
private Float myfloat;
private Double mydouble;
private BigDecimal mydecimal;
private String mytext;
private String mytext;
private Date mydatel;
private Time mytime;
private Date mydatetime;
private Timestamp mytimestamp;
private byte[] mybinary;
private Blob myblob;
private Datamap(){}//構造方法
//getter...setter省略
}
datamap表與Datamap類的ORM映照文件Datamap.hbm.xml
<hibernate-mapping package="com.orm">
<class name="Datamap" table="datamap">
<id name="id" column="ID" type="Integer">
<generator class="identity"/>
</id>
<property name="myboolean" column="MYBOOLEAN" type="boolean"/>
<property name="myint" column="MYINT" type="integer"/>
<property name="mylong" column="MYLONG" type="long"/>
<property name="myfloat" column="MYFLOAT" type="float"/>
<property name="mydouble" column="MYDOUBLE" type="double"/>
<property name="mydecimal" column="MYDECIMAL" type="decimal"/>
<property name="mystring" column="MYSTRING" type="string"/>
<property name="mytext" column="MYTEXT" type="string"/>
<property name="mydate" column="MYDATE" type="date"/>
<property name="mytime" column="MYTIME" type="time"/>
<property name="mydatetime" column="MYDATETIME" type="timestamp"/>
<property name="mytimestamp" column="MYTEMESTAMP" type="timestamp"/>
<property name="mybinary" column="MYBINARY" type="binary"/>
<property name="myblob" column="MYBLOB" type="blob"/>
</class>
<hibernate-mapping/>
(1)創建數據訪問DAO接口TestDAO.java
package com.DAO;
import com.ORM.*;
public interface TestDAO{
public void addDatamap(Datamap datamap);
public Datamap loadDatamap(Integer id);
public void delDatamap(Integer id);
}
(2)創建數據訪問DAO接口實現TestDAOImpl.java
package com.DAO;
import com.ORM.*;
import org.hibernate.*;
public class TestDAOImpl implements TestDAO{
public void addDatamap(Datamap datamap){
Session session=MySessionFactory.currentSession();
Transaction ts=null;
try{
ts=session.beginTransaction();
session.save(datamap);
ts.commit();
}catch(Exception e){
if(ts!=null){
ts.rollback();
}
e.printStackTrace();
}finally{
MySessionFactory.closeSession();
}
}
public Datamap loadDatamap(Integer id){
Session session=MySessionFactory.currentSession();
Transaction ts=null;
try{
ts=session.beginTransaction();
datamap=(Datamap)session.get(Datamap.class,id);
ts.commit();
}catch(Exception e){
if(ts!=null){
ts.rollback();
}
e.printStackTrace();
}finally{
MySessionFactory.closeSession();
}
return datamap;
}
public void delDatamap(Integer id){
Session session=MySessionFactory.currentSession();
Transaction ts=null;
try{
ts=session.beginTransaction();
Datamap datamap=(Datamap)session.load(Datamap.class,id);
session.delete(datamap);
ts.commit();
}catch(Exception e){
if(ts!=null){
ts.rollback();
}
e.printStackTrace();
}finally{
MySessionFactory.closeSession();
}
}
}
(3)創建1個可供測試用的TestBean.java
package com.bean;
import com.ORM.*;
import java.io.*;
import java.math.BigDecimal;
import java.net.*;
import org.hibernate.*;
public class TestBean{
TestDAO dao=new TestDAOImpl();
//得到指定URL的html內容
private String getHtmlByUrl(String url){
StringBuffer hmtl=new StringBuffer();
String line=null;
try{
URL u=new URL(url);
URLConnection uc=u.openConnection();
BufferedReader br=new BufferedReader(new InputStreamReader(uc.getInputStream()));
while(line=(br.readLine())!=null){
html.append(line);
}
}catch(Exception e){
e.printStackTrace();
}
return html.toString();
}
//讀取2進制流
private byte[] readBinary(InputStream in){
byte[] binCodes=null;
try{
binCodes=new byte[in.available()];
in.read(binCodes);
in.close();
}catch(Exception e){
e.printStackTrace();
}
return binCodes;
}
}
//從輸出流中創建BLOB對象
private java.sql.Blob getBlob(InputStream in){
java.sql.Blob blob=null;
try{
blob=Hibernate.createBlob(in);
in.close();
}catch(Exception e){
e.printStackTrace();
}
return blob;
}
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈