Hibernate连接Oracle数据库乱码问题

Hibernate连接Oracle数据库乱码问题

文章分类:Java编程

最近做了个项目,用的框架式Struts+Spring+Hibernate框架的,以前用这个框架连接的数据库都是GBK编码集的,这次连接的是Oracle AMERICAN_AMERICA.US7ASCII编码的,这样就导致项目运行后全是乱码,郁闷了很久,要是每个都自己写转码,实在是太累了,也很烦,所以就考虑是不是在Hibernate里通过什么方法使汉字编码正常。
经过多次尝试、找高手请教和网上的查找最后发现一种比较方便实用的方法:


首先定义一个GBKString替换默认的类型,在映射文件中使用该类型做为TYPE
例如:

Java代码

  1. <property name="battrancode" column="battrancode" type="String" />  

<property name="battrancode" column="battrancode" type="String" />


替换为:

Java代码

  1. <property name="battrancode" column="battrancode" type="com.nl.tsp.dao.GBKString" />  

<property name="battrancode" column="battrancode" type="com.nl.tsp.dao.GBKString" />

 

 

Java代码

  1.     
  2. GBKString.java    
  3. Java代码    
  4. package com.nl.tsp.dao;      
  5.      
  6. import java.io.Serializable;      
  7. import java.io.UnsupportedEncodingException;      
  8. import java.sql.PreparedStatement;      
  9. import java.sql.ResultSet;      
  10. import java.sql.SQLException;      
  11.      
  12. import oracle.jdbc.driver.OracleTypes;      
  13.      
  14. import org.apache.commons.lang.builder.HashCodeBuilder;      
  15. import org.hibernate.HibernateException;      
  16. import org.hibernate.usertype.UserType;      
  17.      
  18. /**    
  19.  * @description    
  20.  * @author Jason Tseng    
  21.  *     
  22.  */     
  23. public class GBKString implements UserType {      
  24.      
  25.     public GBKString() {      
  26.         super();      
  27.     }      
  28.      
  29.     public int[] sqlTypes() {      
  30.         return new int[] { OracleTypes.VARCHAR };      
  31.     }      
  32.      
  33.     public Class returnedClass() {      
  34.         return String.class;      
  35.     }      
  36.      
  37.     public boolean equals(Object x, Object y) throws HibernateException {      
  38.         return (x == y) || (x != null && y != null && (x.equals(y)));      
  39.     }      
  40.      
  41.     public Object nullSafeGet(ResultSet rs, String[] names, Object owner) throws HibernateException,      
  42.             SQLException {      
  43.         String val = rs.getString(names[0]);      
  44.         if (null == val) {      
  45.             return null;      
  46.         } else {      
  47.             try {      
  48.                 val = new String(val.getBytes("iso-8859-1"), "GBK");      
  49.             } catch (UnsupportedEncodingException e) {      
  50.                 throw new HibernateException(e.getMessage());      
  51.             }      
  52.             return val;      
  53.         }      
  54.     }      
  55.      
  56.     public void nullSafeSet(PreparedStatement st, Object value, int index) throws HibernateException,      
  57.             SQLException {      
  58.         if (value == null) {      
  59.             st.setNull(index, OracleTypes.VARCHAR);      
  60.         } else {      
  61.             String val = (String)value;      
  62.             try {      
  63.                 val = new String(val.getBytes("GBK"), "iso-8859-1");      
  64.             } catch (UnsupportedEncodingException e) {      
  65.                 throw new HibernateException(e.getMessage());      
  66.             }      
  67.             st.setObject(index, val, OracleTypes.VARCHAR);      
  68.         }      
  69.     }      
  70.      
  71.     public Object deepCopy(Object value) throws HibernateException {      
  72.         if (value == null)      
  73.             return null;      
  74.         return new String((String) value);      
  75.     }      
  76.      
  77.     public boolean isMutable() {      
  78.         return false;      
  79.     }      
  80.      
  81.     public Object assemble(Serializable arg0, Object arg1) throws HibernateException {      
  82.         // TODO Auto-generated method stub      
  83.         return null;      
  84.     }      
  85.      
  86.     public Serializable disassemble(Object arg0) throws HibernateException {      
  87.         // TODO Auto-generated method stub      
  88.         return null;      
  89.     }      
  90.      
  91.     public int hashCode(Object arg0) throws HibernateException {      
  92.         return HashCodeBuilder.reflectionHashCode(this);      
  93.     }      
  94.      
  95.     public Object replace(Object arg0, Object arg1, Object arg2) throws HibernateException {      
  96.         // TODO Auto-generated method stub      
  97.         return null;      
  98.     }      
  99. }    

 

GBKString.java

Java代码

package com.nl.tsp.dao;  

 

import java.io.Serializable;  

import java.io.UnsupportedEncodingException;  

import java.sql.PreparedStatement;  

import java.sql.ResultSet;  

import java.sql.SQLException;  

 

import oracle.jdbc.driver.OracleTypes;  

 

import org.apache.commons.lang.builder.HashCodeBuilder;  

import org.hibernate.HibernateException;  

import org.hibernate.usertype.UserType;  

 

/** 

 * @description 

 * @author Jason Tseng 

 *  

 */ 

public class GBKString implements UserType {  

 

    public GBKString() {  

        super();  

    }  

 

    public int[] sqlTypes() {  

        return new int[] { OracleTypes.VARCHAR };  

    }  

 

    public Class returnedClass() {  

        return String.class;  

    }  

 

    public boolean equals(Object x, Object y) throws HibernateException {  

        return (x == y) || (x != null && y != null && (x.equals(y)));  

    }  

 

    public Object nullSafeGet(ResultSet rs, String[] names, Object owner) throws HibernateException,  

            SQLException {  

        String val = rs.getString(names[0]);  

        if (null == val) {  

            return null;  

        } else {  

            try {  

                val = new String(val.getBytes("iso-8859-1"), "GBK");  

            } catch (UnsupportedEncodingException e) {  

                throw new HibernateException(e.getMessage());  

            }  

            return val;  

        }  

    }  

 

    public void nullSafeSet(PreparedStatement st, Object value, int index) throws HibernateException,  

            SQLException {  

        if (value == null) {  

            st.setNull(index, OracleTypes.VARCHAR);  

        } else {  

            String val = (String)value;  

            try {  

                val = new String(val.getBytes("GBK"), "iso-8859-1");  

            } catch (UnsupportedEncodingException e) {   

                throw new HibernateException(e.getMessage());  

            }  

            st.setObject(index, val, OracleTypes.VARCHAR);  

        }  

    }  

 

    public Object deepCopy(Object value) throws HibernateException {  

        if (value == null)  

            return null;  

        return new String((String) value);  

    }  

 

    public boolean isMutable() {  

        return false;  

    }  

 

    public Object assemble(Serializable arg0, Object arg1) throws HibernateException {  

        // TODO Auto-generated method stub  

        return null;  

    }  

 

    public Serializable disassemble(Object arg0) throws HibernateException {  

        // TODO Auto-generated method stub  

        return null;  

    }  

 

    public int hashCode(Object arg0) throws HibernateException {  

        return HashCodeBuilder.reflectionHashCode(this);  

    }  

 

    public Object replace(Object arg0, Object arg1, Object arg2) throws HibernateException {  

        // TODO Auto-generated method stub  

        return null;  

    }  

} 




之后在Web.xml配置文件里,把过滤器设定为GBK的,这样就没有问题了,经试验这种是最方便实用的。


在此之前曾经做过多次尝试,比如在GBKString这个类里只用get时转码,set时不转同时过滤器设定iso-8859-1。这个也勉强可以用,但在Java类中使用对象的set方法,需要手工转。

阅读更多
换一批

没有更多推荐了,返回首页