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...
數(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)換.
正因?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());
}在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!");
}
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國(guó)IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國(guó)家
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國(guó)一站式人才培養(yǎng)平臺(tái)、一站式人才輸送平臺(tái)。2014年4月3日在美國(guó)成功上市,融資1
北大課工場(chǎng)是北京大學(xué)校辦產(chǎn)業(yè)為響應(yīng)國(guó)家深化產(chǎn)教融合/校企合作的政策,積極推進(jìn)“中國(guó)制造2025”,實(shí)現(xiàn)中華民族偉大復(fù)興的升級(jí)產(chǎn)業(yè)鏈。利用北京大學(xué)優(yōu)質(zhì)教育資源及背
博為峰,中國(guó)職業(yè)人才培訓(xùn)領(lǐng)域的先行者
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動(dòng)互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺(tái)面向?qū)ο箝_發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫(kù),具有快速界面開發(fā)的能力,對(duì)瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁(yè)制作和網(wǎng)頁(yè)游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國(guó)Software AG 技術(shù)顧問,美國(guó)Dachieve 系統(tǒng)架構(gòu)師,美國(guó)AngelEngineers Inc. 系統(tǒng)架構(gòu)師。