日期:2014-05-16  浏览次数:20554 次

ibatis自定义数据类型在不支持中文的数据库存储汉字
道理很简单,把gbk的汉字转换成iso编码存进数据库就可以了,读出来的时候把iso转换成gbk还原出原始的汉字。
ibatis可以自定义类型处理器,在这里面做编码转换再适合不过了!
sqlmap-config.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMapConfig PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
<settings useStatementNamespaces="true"/>
<typeHandler javaType="edu.sdust.xujsh.test.type.ChineseString"
callback="edu.sdust.xujsh.test.type.handler.CnStringTypeHandler" /><!--注意这里的自定义类型处理器-->
<!-- 使用JDBC的事务管理 -->
<transactionManager type="JDBC">
<!-- 数据源 -->
<dataSource type="SIMPLE">
<property name="JDBC.Driver" value="com.mysql.jdbc.Driver" />
<property name="JDBC.ConnectionURL" value="jdbc:mysql://localhost:3306/test" />
<property name="JDBC.Username" value="root" />
<property name="JDBC.Password" value="123456" />
</dataSource>
</transactionManager>
<!-- 这里可以写多个实体的映射文件 -->
<sqlMap resource="User.xml" />
</sqlMapConfig>
User.xml:
<?xml version="1.0" encoding="GB2312"?>
<!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" "http://www.ibatis.com/dtd/sql-map-2.dtd">
<sqlMap namespace="User">
    <typeAlias alias="user" type="com.xujsh.test.dto.User"/>
    <resultMap id="userResult" class="user">
        <result property="id" column="id" jdbcType="DECIMAL"/>
        <result property="name" column="name" jdbcType="VARCHAR"/>
        <result property="birth" column="birth" jdbcType="TIMESTAMP"/>
    </resultMap>
    <insert id="insertUser" parameterClass="user"><![CDATA[
        insert into USER (id,name,birth) 
        values (#id#,#name#,#birth#)
    ]]></insert>
    <select id="getUserByUserId" resultMap="userResult" parameterClass="int"><![CDATA[
        select  id,name,birth
        from    USER
        where   id = #id#  
    ]]></select>
</sqlMap>

User.xml这里就可以使用ChineseString这种数据类型了,往数据库读数据和写数据的时候会调用CnStringTypeHandler里面的:
getResult(ResultGetter getter)和setParameter(ParameterSetter setter, Object parameter);
edu.sdust.xujsh.test.type.ChineseString.java:
public class ChineseString {
    private String value;//简单的对原始的字符串做一个包装
    public ChineseString(){}
    public ChineseString(String value){
        this.value = value;
    }
    public String getValue() {
        return value;
    }
    public void setValue(String value) {
        this.value = value;
    }
    public String toString() {
        return value;
    }
}
edu.sdust.xujsh.test.type.handler.CnStringTypeHandler.java:
public class CnStringTypeHandler implements TypeHandlerCallback {
    // 中文数据被保存到数据库所使用的字符集
    private static final String STORE_CHARSET  = "GBK";
    // 系统使用的字符集
    private String              systemEncoding = "iso-8859-1";
    /**
     * 从数据库中取数据
     */
    public Object getResult(ResultGetter getter) throws SQLException {
        String value = getter.getString();
        if (value == null) {
            return null;
        } else {
            try {
                return new ChineseString(new String(value.g