在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Java/ 相比JDBC,為什么MyBatis需要TypeHandler接口所提供的功能?

相比JDBC,為什么MyBatis需要TypeHandler接口所提供的功能?

MyBatis中的TypeHandler的作用是用于Java與數(shù)據(jù)庫(kù)的數(shù)據(jù)類型轉(zhuǎn)換;
但在JDBC中,貌似并沒有涉及到Java和數(shù)據(jù)庫(kù)之間的類型轉(zhuǎn)換啊.它們之間的類型轉(zhuǎn)換指的是
什么時(shí)間發(fā)生的轉(zhuǎn)換?
回答
編輯回答
兔囡囡

TypeHandler 一般用于復(fù)雜類型的裝換,比如你的字段是 JSON 格式,自動(dòng)轉(zhuǎn)化成 POJO。

JDBC 的 API 提供了 Java 與 數(shù)據(jù)庫(kù)類型裝換,比如ResultSet,

本人的SF直播中,有詳細(xì)講解:

JDBC : https://segmentfault.com/l/15...
MyBatis : https://segmentfault.com/l/15...

2017年9月17日 13:08
編輯回答
使勁操

數(shù)據(jù)庫(kù)類型也有涯, 而Java類型也無(wú)涯, 以有涯對(duì)無(wú)涯, TypeHandler來(lái)也.

如果你有一個(gè)自己的類型,比如叫MyVersionClass 對(duì)應(yīng)地要存到數(shù)據(jù)的一個(gè)MyVersion(varchar(100))字段里:

class MyVersionClass{

 int major,
 int minor,
 int reversion

}

保存時(shí), 你想存成這個(gè)樣子 1.2.3, 取出來(lái)后再還原成MyVersionClass, 這時(shí)你就可以定義一個(gè)MyVersionTypeHandler幫你在存儲(chǔ)和取出時(shí)自動(dòng)完成轉(zhuǎn)換.

2017年12月9日 18:56
編輯回答
哚蕾咪

正因?yàn)镴DBC沒有涉及到j(luò)ava與數(shù)據(jù)庫(kù)之間的類型轉(zhuǎn)化,所以需要TypeHandler.
舉個(gè)例子吧 IntegerTypeHandler
rs.getInt(columnName); // rs為ResultSet, 從int轉(zhuǎn)化為Integer。
ps.setInt(i, parameter); // ps為PreparedStatement, 從Integer轉(zhuǎn)化為int。 parameter為Integer類型

給你個(gè)Date類型好了。
DateOnlyTypeHandler

ps.setDate(i, new java.sql.Date((parameter.getTime())));
// 這邊的parameter是 java.util.Date
java.sql.Date sqlDate = rs.getDate(columnName);
if (sqlDate != null) {
    return new java.util.Date(sqlDate.getTime());
}
2018年3月4日 09:13
編輯回答
尛曖昧
在Java中的Girl實(shí)體類中,isBeauty的數(shù)據(jù)類型為Boolean[],
而MySQL中的Girl表的isBeauty字段的數(shù)據(jù)類型為varchar,
這時(shí)候在MyBatis中,直接向數(shù)據(jù)庫(kù)添加數(shù)據(jù)將會(huì)出現(xiàn)錯(cuò)誤,而TypeHandler接口可以解決這個(gè)問題.

圖片描述

主要為4個(gè)文件,其中:
    Girl.java定義了實(shí)體類;
    girlMapper為MyBatis的映射文件;
    GirlTest.java為測(cè)試類;
    GirlTypeHandler.java為類型轉(zhuǎn)換器,用于將Java中的Boolean[]類型轉(zhuǎn)換為數(shù)據(jù)庫(kù)中的varchar類型
    
具體代碼如下:
-----------------------------------------------------------------------

數(shù)據(jù)表Girl:
create table girl(
    name varchar(20),
    isBeauty varchar(10)
)charset = utf8;    
    
    
    
-----------------------------------------------------------------------
Girl.java
    
public class Girl {
    
    private String name;
    private Boolean[] isBeauty;  //兩個(gè)true代表美女,兩個(gè)false代表非美女
    
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Boolean[] getIsBeauty() {
        return isBeauty;
    }
    public void setIsBeauty(Boolean[] isBeauty) {
        this.isBeauty = isBeauty;
    }
}    

------------------------------------------------------------------
girlMapper.xml

<mapper namespace="com.kgc.mybatis.pojo">
    <insert id="addGirl" parameterType="Girl">
        insert into girl values(#{name},#{isBeauty,jdbcType=VARCHAR})
    </insert>
</mapper>


------------------------------------------------------------------
public class GirlTypeHandler implements TypeHandler<Boolean[]> {

    @Override
    public void setParameter(PreparedStatement ps, int i, Boolean[] parameter, JdbcType jdbcType) throws SQLException {
        //為了方便,省略判斷
        ps.setString(i, "很漂亮哦");
    }

    //省略其他幾個(gè)方法...
    
}


------------------------------------------------------------------
測(cè)試類:
    @Test
    public void addGirl(){
        Girl girl = new Girl();
        girl.setName("小倩");
        
        Boolean[] beauty = {true,true};
        girl.setIsBeauty(beauty);
        //4.執(zhí)行插入操作,返回影響行數(shù)
        int count = session.insert("com.kgc.mybatis.pojo.addGirl", girl);
        System.out.println(count>0?"insert succ!" : "insert fail!");
    }































2017年10月6日 23:14