1. 程式人生 > >解決Mybatis框架java.sql.SQLException: 資料大小超出此型別的最大值的問題

解決Mybatis框架java.sql.SQLException: 資料大小超出此型別的最大值的問題

1.問題所在:

 JDBC在轉換過程中對字串的長度做了限制。這個限制和資料庫中欄位的實際長度沒有關係,JDBC對轉換字元長度的限制是為了轉換過程中的資料擴充套件。根據實際測試結果,在ZHS16GBK字符集和thin驅動下,2000-4000長度的varchar欄位都只能插入1333個位元組(約666個漢字),而setCharacterStream()方法可以逃過字元轉換限制。

2.定義TypeHandler並繼承BaseTypeHandler<String>

import java.io.StringReader;   
import java.sql.CallableStatement;
import java.sql.PreparedStatement;   
import java.sql.ResultSet;
import java.sql.SQLException;      
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.StringTypeHandler;
   
/**
 * JDBC在轉換過程中對字串的長度做了限制(Mybatis解決方法:採用ps.setCharacterStream())
 * @author jiandandia
 *
 */
@MappedJdbcTypes(JdbcType.VARCHAR)
public class LargeStringTypeHandler extends BaseTypeHandler<String> {     

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i,
            String parameter, JdbcType jdbcType) throws SQLException {
        StringTypeHandler sth=new StringTypeHandler();
        if(parameter.length()>666){//超過了666,就用   setCharacterStream
        	ps.setCharacterStream( i , new StringReader(parameter), parameter.length() );      
      }else{//沒有超過666,就用setString  
    	  sth.setNonNullParameter(ps, i, parameter, jdbcType); 
      }      
    }
 
    @Override
    public String getNullableResult(ResultSet rs, String columnName) throws SQLException {
      return rs.getString(columnName);
    }

    @Override
    public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
      return rs.getString(columnIndex);
    }

    @Override
    public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
      return cs.getString(columnIndex);
    }
       
}

3.在Mybatis配置檔案Config.xml下注冊TypeHandler
	<typeHandlers>  
   		<typeHandler  handler="org.dtt.handler.LargeStringTypeHandler"/>  
	</typeHandlers>

4.在sql對映檔案下使用
<?xml version="1.0" encoding="UTF-8" ?>  
<!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"      
 "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
<mapper namespace="org.dtt.all.MainBatch">
	<insert id="add_log" parameterType="org.dtt.all.MainBatch">
		insert into log_record
			(code_id,file_code,file_name,
			file_text,error,status,create_time)
				values
			(s_code_id.nextval,#{file_code},#{file_name},#{file_text,typeHandler=org.dtt.handler.LargeStringTypeHandler},
			#{error},#{status},sysdate)
	</insert>
</mapper>


相關推薦

解決Mybatis框架java.sql.SQLException: 資料大小超出型別的問題

1.問題所在:  JDBC在轉換過程中對字串的長度做了限制。這個限制和資料庫中欄位的實際長度沒有關係,JDBC對轉換字元長度的限制是為了轉換過程中的資料擴充套件。根據實際測試結果,在ZHS16GBK字符集和thin驅動下,2000-4000長度的varchar欄位都只能插入

PreparedStatement 資料大小超出型別

今天在進行oracle開發的時候遇到了一個異常,在baidu一通沒有結果後,進行了google嘗試,最終挖掘出了答案,哈哈。 異常: java.sql.SQLException:   資料大小超出此型別的最大值: 2017 在將過長的字串寫入資料庫中時,不能直接使用setS

Mybatis異常解決之:java.sql.SQLException: Parameter index out of range

mybatis使用過程中遇到下面一個異常: org.springframework.dao.TransientDataAccessResourceException: ### Error querying database. Cause: java.sql.SQLException: Param

Oracle異常:Caused by: java.sql.SQLException: ORA-01536: 超出表空間 '登入名' 的空間限額 (JPA儲存資料)

原因: Oracle表空間為0,沒有分配空間記憶體. 解決辦法在程式碼框裡:  1. 檢視使用者表空間的限額 select * from user_ts_quotas; max_bytes欄位就是了 -1是代表沒有限制,其它值多少就是多少了. 2. 不對使用者做表空間

(解決)Caused by: java.sql.SQLException: 無法轉換為內部表示

今天遇到了個錯誤: org.springframework.jdbc.UncategorizedSQLException: Hibernate operation: could not execute query; uncategorized SQLException fo

Mybatisjava.sql.SQLException

java.sql.SQLException  Parameter index out of range (2 > number of parameters, which is 1) 原因是 與

Java 基本資料型別極限和極限

想知道 Java 基本資料型別最大值極限和最小值極限,寫個小程式就很容易知道。 測試 Integer, Long, Float 和 Double 的最大值和最小值,程式碼如下:  public

java 基本資料型別及各自的極限

測試 Integer, Long, Float 和 Double 的最大值和最小值,程式碼如下: public static void main(String[] args) { System.out.println("Integer.MIN_VALUE = " + In

java入門】使用選擇法確定輸入

package com.demo; import java.util.Scanner; public class Test4 { public static void main(String[] args) { Scanner scanner = new Sca

Java方法案例--比較三個數中的

package com.zhangxueliang.demo; import java.util.Scanner; public class MethodTest2 { // 返回三個數中的

java常見練習題找到數組裡面的

題目:找到數組裡面的最大值 我們首先建立一個數組,想要找到一個數組裡面的最大值,第一步先要遍歷這個陣列,即: 第一步 int[] arr = { 7, 3, 2, 80, 4 }; for (int i = 0; i < arr.length; i++)

Java陣列練習(二) 獲取陣列中的

思路一: 1.獲取最值需要進行比較,每一次比較都會有一個較大的值,因為該值的不確定性,通過一個變數進行臨時儲存。 2.讓陣列中的每一個元素都和這個變數中的值進行比較,如果大於變數中的值,就用該變數記錄較大值。 3.當所有的元素都比較完成,那麼該變數中的儲存就是陣列中

Java 中一個int型陣列的求

小友今日看單元測試,發現的一個測試用例的程式碼。而測試的是某個類的最大值,最小值方法。 在此把測試類發上來。保留此地,如有人對此有興趣,看以看下。閒話少說: public class MaxMinTool { public static int getMax(int[

JAVA 各種數值型別 Int, short, char, long, float,&nbs

程式碼片段: byte bmax, bmin; short shmax, shmin; char cmax, cmin; int imax, imin; long lmax,lmin; float fmax,fmin; double dmax,dmin;

sql如何找到某欄位的所在行

首先,查詢某欄位的最大值 select max(weight) from apple; 7888 接著,根據最大值,查詢其所在行 select * from apple where weigh

關於超過js的number型別(9007199254740992),的解決辦法

bug經過:點選修改無法展示資訊(修改時呼叫queryOne,以id(long)為值,頁面傳過去的id=1480042498255640-00 ,在資料庫中該id=148004249825564012,即錯誤的id)根本原因:js的number型別有個最大值(安全值)。即2的

資料庫排名sql,group by 分組查詢按照時間

先給出類似的簡單表 DROP TABLE IF EXISTS `TouTiaoAnchor`; CREATE TABLE `TouTiaoAnchor` ( `HourId` int(10) unsigned NOT NULL, `BetinTime` varcha

mybatis向oracle新增資料報:java.sql.SQLException: 無效的列型別: 1111

org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.type.TypeException: Could not set parameters for mapping

解決sqoop導入報錯:Caused by: java.sql.SQLException: Protocol violation

detail ext lang dcb dsta run org with int 報錯信息: 2017-06-15 15:02:15,374 INFO [main] org.apache.hadoop.mapred.MapTask: Ignoring excepti

java.sql.SQLException: [Microsoft][ODBC 驅動程序管理器] 未發現數據源名稱而且未指定默認驅動程序解決方法

成功 access exception div 數據庫 java 配置 題解 調用 開發程序須要登錄功能 。就不想用大數據庫。直接用java連接access。 在自己機器上一切正常, url直連 和配置數據源都沒有問題。 公布到windows serve