mybatis插入數據時處理為null的屬性


在做項目的時候,數據庫中的所有字段被設置為全都不能為null,但是在我們開發過程中,插入一些記錄的時候,實體類中的一些字段如果頁面沒有傳入,則默認就會被設置為null,這樣的話,在執行插入語句的時候,數據庫就會報錯,說指定的列不能為null,這樣數據就無法插入。
在網上找了一下,都沒有這種處理的方式,但是找到了mybatis的類型轉換,說的是在java中的類型和數據庫中的類型不一致的時候,需要自己處理數據庫類型和java中類型之間的轉換,這個就是通過mybatis的typehandler來處理的。
查看typehandler這個接口發現有一下幾個需要實現的方法:

public String getResult(ResultSet rs, String columnName) throws SQLException;
public String getResult(ResultSet rs, int columnIndex) throws SQLException;
public String getResult(CallableStatement cs, int columnIndex) throws SQLException;
public void setParameter(PreparedStatement pstmt, int index, String value, JdbcType jdbcType) throws SQLException;

在這4個需要實現的方法中,我們只需要關注第4個方法,因為這個方法是mybatis在給參數設置值的時候,會調用到此方法,基於這樣的原因,如果我們在 setParameter中判斷當前參數傳入的值,如果value=null,我們就將參數的值設置為空的字符串,這樣就避免了在執行插入語句的時候,傳入null的情況,數據庫中也不會報錯,問題就解決了。

代碼:
package zzt.ssm.controller.typehandler;

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.TypeHandler;

public class NullValueHandler implements TypeHandler<String> {

    @Override
    public String getResult(ResultSet rs, String columnName) throws SQLException {
        return rs.getString(columnName);
    }

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

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

    @Override
    public void setParameter(PreparedStatement pstmt, int index, String value, JdbcType jdbcType) throws SQLException {
        if(value == null && jdbcType == JdbcType.VARCHAR){//判斷傳入的參數值是否為null
            pstmt.setString(index,"");//設置當前參數的值為空字符串
        }else{
            pstmt.setString(index,value);//如果不為null,則直接設置參數的值為value
        }
    }

}


以上是已經定義好的一個typehandler類,但是還需要我們在配置文件中注冊我們自定義的typehandler,因為使用了和spring繼承的配置,所以注冊typehandler的配置在spring的配置文件中的配置如下:
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <!-- 指定mapper文件位置 -->
        <property name="mapperLocations" value="classpath*:**/dao/*Mapper.xml" />
        <!-- 指定別名 -->
        <property name="typeAliasesPackage" value="zzt.ssm.domain" />
         <property name="typeHandlersPackage" value="zzt.ssm.c ontroller.typehandler"/>
    </bean>
這里指定了 typeHandlersPackage屬性,value為自定義的typehandler的包名,這樣mybatis會將這個包下面的所有的類注冊為對應的TypeHandler類。

到這里我們的自定義的TypeHandler就配置好了,
下面在我們的mybatis的mapper中,指定對應的typehandler為自定義的TypeHandler類就可以了

<!-- 添加人員信息 -->
    <insert id="insertPerson" parameterType="Person">
        insert into person(name,sex,address)
            values( #{name,jdbcType=VARCHAR,typeHandler=zzt.ssm.controller.typehandler.NullValueHandler},#{sex},#{address} )
    </insert>

這里在name參數上指定了 typeHandler配置,這樣在數據插入的時候,mybatis會調用自定義的TypeHandler類來處理name參數的值,即,如果name的值為null則設置為空字符串,如果不為空,則直接設置值。


現在如果我們測試,在前端如果沒有傳入name屬性的情況下,數據庫中插入的數據是否為空字符串,而不是null

直接在瀏覽器的地址欄中輸入, http://localhost:8080/springmvcmybatis/person/savePerson.action?address=dddd
這里我們什么參數都沒有傳入,那么在springmvc中Controller中,就會將對應的實體的屬性值設置為null

 

 



現在我們看到,頁面傳入的屬性值已經被注入到對應的實體的屬性中,沒有傳入的屬性全都是null。

此時查看數據庫中插入的記錄,可以看到name的值為空字符串,而沒有處理的sex的值為null

 

 

 

 


 




實現自定義的除了使用以上這種實現 TypeHandler接口的方式外,還可以直接繼承BaseTypeHandler來實現。
mybatis官方文檔: http://mybatis.org/mybatis-3/zh/configuration.html#typeHandlers


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM