Hibernate的基本映射数据类型

4.3.1  Hibernate的基本映射数据类型

Hibernate的基本映射数据类型是Java基本类型与标准SQL类型相互转换的桥梁,其关系如图4-7所示。

 

通过Hibernate的基本映射数据类型可以非常方便地将数据从一种形式转换成另一种形式,完成高质量的ORM任务。例如:

  

表4-4列出了这3种数据类型之间的对应关系。

表4-4  3种数据类型之间的对应关系

Hibernate映射类型

Java类型

标准SQL类型

integer

java.lang.Integer

INTEGER

long

java.lang.Long

BIGINT

short

java.lang.Short

SMALLINT

float

java.lang.Float

FLOAT

double

java.lang.Double

DOUBLE

big_decimal

java.math.BigDecimal

NUMERIC

character

java.lang.String

CHAR(1)

string

java.lang.String

VARCHAR

byte

byte或java.lang.Byte

TINYINT

boolean

boolean或java.lang.Boolean

BIT

(续表)

Hibernate映射类型

Java类型

标准SQL类型

yes_no

boolean或java.lang.Boolean

CHAR(1)('Y'或'N')

true_false

boolean或java.lang.Boolean

CHAR(1)('Y'或'N')

date

java.util.Date或java.sql.Date

DATE

time

java.util.Date或java.sql.Time

TIME

timestamp

java.util.Date或java.sql.Timestamp

TIMESTAMP

calendar

java.util.Calendar

TIMESTAMP

calendar_date

java.util.Calendar

DATE

binary

byte[]

VARBINARY或BLOB

text

java.lang.String

CLOB

serializable

java.io.Serializable实例

VARBINARY或BLOB

clob

java.sql.Clob

CLOB

blob

java.sql.Blob

BLOB

class

java.lang.Class

VARCHAR

locale

java.util.Locale

VARCHAR

timezone

java.util.TimeZone

VARCHAR

currency

java.util.Currency

VARCHAR

下面我们用实例演示上述映射数据类型的用法。

假如在MySQL数据库中有一张关系表datamap,如表4-5所示。

表4-5  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:

 
 
  1. package com.ORM;  
  2. import java.io.Serializable;  
  3. public class Datamap implements Serializable{  
  4. private int hashValue = 0;  
  5. private java.lang.Integer id;  
  6. private java.lang.Boolean myboolean;  
  7. private java.lang.Integer myint;  
  8. private java.lang.Long mylong;  
  9. private java.lang.Float myfloat;  
  10. private java.lang.Double mydouble;  
  11. private java.math.BigDecimal mydecimal;  
  12. private java.lang.String mystring;  
  13. private java.lang.String mytext;  
  14. private java.sql.Date mydate;  
  15. private java.sql.Time mytime;  
  16. private java.util.Date mydatetime;  
  17. private java.sql.Timestamp mytimestamp;  
  18. private byte[] mybinary;  
  19. private java.sql.Blob myblob;  
  20. public Datamap() {} //构造方法  
  21. //省略上述各属性的get/set方法对  
  22. }  
  23. datamap表与Datamap类的ORM映射文件Datamap.hbm.xml:  
  24. <?xml version="1.0" encoding='UTF-8'?>  
  25. <!DOCTYPE hibernate-mapping PUBLIC  
  26. "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
  27. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >  
  28. <hibernate-mapping package="com.ORM">  
  29. <class name="Datamap" table="datamap">  
  30. <id name="id" column="ID" type="integer">  
  31. <generator class="identity"/>  
  32. </id>   
  33. <property name="myboolean" column="MYBOOLEAN" type="boolean" />  
  34. <property name="myint" column="MYINT" type="integer" />  
  35. <property name="mylong" column="MYLONG" type="long" />  
  36. <property name="myfloat" column="MYFLOAT" type="float" />  
  37. <property name="mydouble" column="MYDOUBLE" type="double" />  
  38. <property name="mydecimal" column="MYDECIMAL" type="big_decimal" />  
  39. <property name="mystring" column="MYSTRING" type="string" />  
  40. <property name="mytext" column="MYTEXT" type="text" />  
  41. <property name="mydate" column="MYDATE" type="date" />  
  42. <property name="mytime" column="MYTIME" type="time" />  
  43. <property name="mydatetime" column="MYDATETIME" type="timestamp" />  
  44. <property name="mytimestamp" column="MYTIMESTAMP" type="timestamp" />  
  45. <property name="mybinary" column="MYBINARY" type="binary" />  
  46. <property name="myblob" column="MYBLOB" type="blob" />  
  47. </class>  
  48. </hibernate-mapping> 

(1)创建数据访问DAO接口TestDAO.java。

 
 
  1. package com.DAO;  
  2. import com.ORM.*;  
  3. public interface TestDAO {  
  4. public void addDatamap(Datamap datamap);  
  5. public Datamap loadDatamap(Integer id);  
  6. public void delDatamap(Integer id);  

(2)创建数据访问DAO接口实现TestDAOImpl.java。

 
 
  1. package com.DAO;  
  2. import com.ORM.*;  
  3. import org.hibernate.*;  
  4. public class TestDAOImpl implements TestDAO {  
  5. public void addDatamap(Datamap datamap) {  
  6. Session session = MySessionFactory.currentSession();  
  7. Transaction ts = null;  
  8. try{  
  9. ts = session.beginTransaction();  
  10. session.save(datamap);  
  11. ts.commit();  
  12. }catch(Exception ex){  
  13. if(ts!=null)ts.rollback();  
  14. System.out.println("【系统错误】  
  15. 在TestDAOImpl的addDatamap方法中出错:");  
  16. ex.printStackTrace();  
  17. }finally{  
  18. MySessionFactory.closeSession();  
  19. }  
  20. }  
  21. public Datamap loadDatamap(Integer id) {  
  22. Session session = MySessionFactory.currentSession();  
  23. Transaction ts = null;  
  24. Datamap datamap = null;  
  25. try{  
  26. ts = session.beginTransaction();  
  27. datamap = (Datamap)session.get(Datamap.class,id);  
  28. ts.commit();  
  29. }catch(Exception ex){  
  30. if(ts!=null)ts.rollback();  
  31. System.out.println("【系统错误】  
  32. 在TestDAOImpl的loadDatamap方法中出错:");  
  33. ex.printStackTrace();  
  34. }finally{  
  35. MySessionFactory.closeSession();  
  36. }  
  37. return datamap;  
  38. }  
  39. public void delDatamap(Integer id) {  
  40. Session session = MySessionFactory.currentSession();  
  41. Transaction ts = null;  
  42. try{  
  43. ts = session.beginTransaction();  
  44. Datamap datamap = (Datamap)session.load(Datamap.class,id);  
  45. session.delete(datamap);  
  46. ts.commit();  
  47. }catch(Exception ex){  
  48. if(ts!=null)ts.rollback();  
  49. System.out.println("【系统错误】  
  50. 在TestDAOImpl的delDatamap方法中出错:");  
  51. ex.printStackTrace();  
  52. }finally{  
  53. MySessionFactory.closeSession();  
  54. }  
  55. }  

(3)创建一个供测试用的TestBean.java。

 
 
  1. package com.bean;  
  2. import com.DAO.*;  
  3. import com.ORM.*;  
  4. import java.io.*;  
  5. import java.math.BigDecimal;  
  6. import java.net.*;  
  7. import org.hibernate.*;  
  8. public class TestBean {  
  9. TestDAO dao = new TestDAOImpl();  
  10. //得到指定URL的HTML内容  
  11. private String getHtmlByUrl(String url){  
  12. StringBuffer html = new StringBuffer();  
  13. String line = null;  
  14. try{  
  15. URL u = new URL(url);  
  16. URLConnection uc = u.openConnection();  
  17. BufferedReader br = new BufferedReader  
  18. (new InputStreamReader(uc.getInputStream()));  
  19. while ((line=br.readLine())!=null){  
  20. html.append(line);  
  21. }  
  22. }catch(Exception ex){  
  23. System.out.println("【系统错误】  
  24. 在TestBean的getHtmlByUrl方法中出错:");  
  25. ex.printStackTrace();  
  26. }  
  27. return html.toString();  
  28. }  
  29. //读取二进制流  
  30. private byte[] readBinary(InputStream in){  
  31. byte[] binCodes = null;  
  32. try{  
  33. binCodes = new byte[in.available()];  
  34. in.read(binCodes);  
  35. in.close();  
  36. }catch(Exception ex){  
  37. System.out.println("【系统错误】  
  38. 在TestBean的readBinary方法中出错:");  
  39. ex.printStackTrace();  
  40. }  
  41. return binCodes;  
  42. }  
  43. //从输入流创建BLOB对象  
  44. private java.sql.Blob getBlob(InputStream in){  
  45. java.sql.Blob blob = null;  
  46. try{  
  47. blob = Hibernate.createBlob(in);  
  48. in.close();  
  49. }catch(Exception ex){  
  50. System.out.println("【系统错误】  
  51. 在TestBean的getBlob方法中出错:");  
  52. ex.printStackTrace();  
  53. }  
  54. return blob;  
  55. }  
  56. public void addDatamap(){  
  57. Datamap datamap = new Datamap();  
  58. datamap.setMyboolean(new Boolean(true));  
  59. datamap.setMyint(new Integer(100));  
  60. datamap.setMylong(new Long(12345678));  
  61. datamap.setMyfloat(new Float(3.14));  
  62. datamap.setMydouble(new Double(0.8628));  
  63. datamap.setMydecimal(new BigDecimal(5200.80));  
  64. datamap.setMystring("这是测试内容");  
  65. datamap.setMytext(getHtmlByUrl("http://www.163.com"));  
  66. datamap.setMydate(new java.sql.Date(System.currentTimeMillis()));  
  67. datamap.setMytime(new java.sql.Time(8,27,56));  
  68. datamap.setMydatetime(new java.util.Date());  
  69. datamap.setMytimestamp(new java.sql.Timestamp  
  70. (System.currentTimeMillis()));  
  71. datamap.setMybinary(readBinary(getClass().  
  72. getResourceAsStream("TestBean.class")));  
  73. datamap.setMyblob(getBlob(getClass().  
  74. getResourceAsStream("/photo1.jpg")));  
  75. dao.addDatamap(datamap);  
  76. }  
  77. public Datamap loadDatamap(Integer i){  
  78. return dao.loadDatamap(i);  
  79. }  
  80. public void delDatamap(Integer i){  
  81. dao.delDatamap(i);  
  82. }  

(4)创建一个测试用的JSP页面index.jsp。

 
 
  1. <%@ page language="java" pageEncoding="gb2312"%>  
  2. <%@ page import="com.bean.TestBean"%>  
  3. <%@ page import="com.ORM.*"%>  
  4. <%@ page import="java.io.*"%>  
  5. <jsp:useBean id="test" class="com.bean.TestBean" />  
  6. <html>  
  7.   <head><title>Hibernate映射数据类型</title></head>   
  8.   <body>  
  9.   <h2>Hibernate映射数据类型</h2><hr>  
  10. <%  
  11. test.addDatamap();  
  12. Integer cur = new Integer(1);  
  13. Datamap datamap = test.loadDatamap(cur);  
  14. out.println("datamap.getMyboolean()="+datamap.getMyboolean());  
  15. out.println("<br>datamap.getMyint()="+datamap.getMyint());  
  16. out.println("<br>datamap.getMylong()="+datamap.getMylong());  
  17. out.println("<br>datamap.getMyfloat()="+datamap.getMyfloat());  
  18. out.println("<br>datamap.getMydouble()="+datamap.getMydouble());  
  19. out.println("<br>datamap.getMydecimal()="+datamap.getMydecimal());  
  20. out.println("<br>datamap.getMystring()="+datamap.getMystring());  
  21. out.println("<br>datamap.getMydate()="+datamap.getMydate());  
  22. out.println("<br>datamap.getMytime()="+datamap.getMytime());  
  23. out.println("<br>datamap.getMydatetime()="+datamap.getMydatetime());  
  24. out.println("<br>datamap.getMytimestamp()="+datamap.getMytimestamp());  
  25. %>  
  26. <br>datamap.getMytext():<br>  
  27. <textarea cols="80" name="textfield" rows="10">  
  28. <%=datamap.getMytext()%>  
  29. </textarea>  
  30. <br>datamap.getMybinary():<br>  
  31. <textarea cols="80" name="textfield" rows="10">  
  32. <%  
  33. byte[] binCodes = datamap.getMybinary();  
  34. out.print(new String(binCodes));  
  35. %>  
  36. </textarea>  
  37. <br>datamap.getMyblob():<br>  
  38. <textarea cols="80" name="textfield" rows="10">  
  39. <%  
  40. InputStream in = datamap.getMyblob().getBinaryStream();  
  41. int tmp = 0;  
  42. while((tmp=in.read())!=-1){  
  43. out.print(tmp);  
  44. }  
  45. %>  
  46. </textarea>  
  47. <%test.delDatamap(cur);%>  
  48.   </body>  
  49. </html> 
index.jsp运行效果如图4-8所示。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值