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:
- package com.ORM;
- import java.io.Serializable;
- public class Datamap implements Serializable{
- private int hashValue = 0;
- private java.lang.Integer id;
- private java.lang.Boolean myboolean;
- private java.lang.Integer myint;
- private java.lang.Long mylong;
- private java.lang.Float myfloat;
- private java.lang.Double mydouble;
- private java.math.BigDecimal mydecimal;
- private java.lang.String mystring;
- private java.lang.String mytext;
- private java.sql.Date mydate;
- private java.sql.Time mytime;
- private java.util.Date mydatetime;
- private java.sql.Timestamp mytimestamp;
- private byte[] mybinary;
- private java.sql.Blob myblob;
- public Datamap() {} //构造方法
- //省略上述各属性的get/set方法对
- }
- datamap表与Datamap类的ORM映射文件Datamap.hbm.xml:
- <?xml version="1.0" encoding='UTF-8'?>
- <!DOCTYPE hibernate-mapping PUBLIC
- "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
- <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="big_decimal" />
- <property name="mystring" column="MYSTRING" type="string" />
- <property name="mytext" column="MYTEXT" type="text" />
- <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="MYTIMESTAMP" 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 ex){
- if(ts!=null)ts.rollback();
- System.out.println("【系统错误】
- 在TestDAOImpl的addDatamap方法中出错:");
- ex.printStackTrace();
- }finally{
- MySessionFactory.closeSession();
- }
- }
- public Datamap loadDatamap(Integer id) {
- Session session = MySessionFactory.currentSession();
- Transaction ts = null;
- Datamap datamap = null;
- try{
- ts = session.beginTransaction();
- datamap = (Datamap)session.get(Datamap.class,id);
- ts.commit();
- }catch(Exception ex){
- if(ts!=null)ts.rollback();
- System.out.println("【系统错误】
- 在TestDAOImpl的loadDatamap方法中出错:");
- ex.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 ex){
- if(ts!=null)ts.rollback();
- System.out.println("【系统错误】
- 在TestDAOImpl的delDatamap方法中出错:");
- ex.printStackTrace();
- }finally{
- MySessionFactory.closeSession();
- }
- }
- }
(3)创建一个供测试用的TestBean.java。
- package com.bean;
- import com.DAO.*;
- 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 html = 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 ex){
- System.out.println("【系统错误】
- 在TestBean的getHtmlByUrl方法中出错:");
- ex.printStackTrace();
- }
- return html.toString();
- }
- //读取二进制流
- private byte[] readBinary(InputStream in){
- byte[] binCodes = null;
- try{
- binCodes = new byte[in.available()];
- in.read(binCodes);
- in.close();
- }catch(Exception ex){
- System.out.println("【系统错误】
- 在TestBean的readBinary方法中出错:");
- ex.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 ex){
- System.out.println("【系统错误】
- 在TestBean的getBlob方法中出错:");
- ex.printStackTrace();
- }
- return blob;
- }
- public void addDatamap(){
- Datamap datamap = new Datamap();
- datamap.setMyboolean(new Boolean(true));
- datamap.setMyint(new Integer(100));
- datamap.setMylong(new Long(12345678));
- datamap.setMyfloat(new Float(3.14));
- datamap.setMydouble(new Double(0.8628));
- datamap.setMydecimal(new BigDecimal(5200.80));
- datamap.setMystring("这是测试内容");
- datamap.setMytext(getHtmlByUrl("http://www.163.com"));
- datamap.setMydate(new java.sql.Date(System.currentTimeMillis()));
- datamap.setMytime(new java.sql.Time(8,27,56));
- datamap.setMydatetime(new java.util.Date());
- datamap.setMytimestamp(new java.sql.Timestamp
- (System.currentTimeMillis()));
- datamap.setMybinary(readBinary(getClass().
- getResourceAsStream("TestBean.class")));
- datamap.setMyblob(getBlob(getClass().
- getResourceAsStream("/photo1.jpg")));
- dao.addDatamap(datamap);
- }
- public Datamap loadDatamap(Integer i){
- return dao.loadDatamap(i);
- }
- public void delDatamap(Integer i){
- dao.delDatamap(i);
- }
- }
(4)创建一个测试用的JSP页面index.jsp。
index.jsp运行效果如图4-8所示。
- <%@ page language="java" pageEncoding="gb2312"%>
- <%@ page import="com.bean.TestBean"%>
- <%@ page import="com.ORM.*"%>
- <%@ page import="java.io.*"%>
- <jsp:useBean id="test" class="com.bean.TestBean" />
- <html>
- <head><title>Hibernate映射数据类型</title></head>
- <body>
- <h2>Hibernate映射数据类型</h2><hr>
- <%
- test.addDatamap();
- Integer cur = new Integer(1);
- Datamap datamap = test.loadDatamap(cur);
- out.println("datamap.getMyboolean()="+datamap.getMyboolean());
- out.println("<br>datamap.getMyint()="+datamap.getMyint());
- out.println("<br>datamap.getMylong()="+datamap.getMylong());
- out.println("<br>datamap.getMyfloat()="+datamap.getMyfloat());
- out.println("<br>datamap.getMydouble()="+datamap.getMydouble());
- out.println("<br>datamap.getMydecimal()="+datamap.getMydecimal());
- out.println("<br>datamap.getMystring()="+datamap.getMystring());
- out.println("<br>datamap.getMydate()="+datamap.getMydate());
- out.println("<br>datamap.getMytime()="+datamap.getMytime());
- out.println("<br>datamap.getMydatetime()="+datamap.getMydatetime());
- out.println("<br>datamap.getMytimestamp()="+datamap.getMytimestamp());
- %>
- <br>datamap.getMytext():<br>
- <textarea cols="80" name="textfield" rows="10">
- <%=datamap.getMytext()%>
- </textarea>
- <br>datamap.getMybinary():<br>
- <textarea cols="80" name="textfield" rows="10">
- <%
- byte[] binCodes = datamap.getMybinary();
- out.print(new String(binCodes));
- %>
- </textarea>
- <br>datamap.getMyblob():<br>
- <textarea cols="80" name="textfield" rows="10">
- <%
- InputStream in = datamap.getMyblob().getBinaryStream();
- int tmp = 0;
- while((tmp=in.read())!=-1){
- out.print(tmp);
- }
- %>
- </textarea>
- <%test.delDatamap(cur);%>
- </body>
- </html>