1. 程式人生 > >Mybatis學習過程中的一些問題

Mybatis學習過程中的一些問題

1、
異常:No enum const class org.apache.ibatis.mapping.ParameterMode.in
原因:mybatis沒有in這種parameterMode,應該為IN

 <update id="editMessage" statementType="CALLABLE" parameterType="com.lianlife.bean.Message">
    {call edit(
    #{id,mode=in,jdbcType=INTEGER},
    #{content,mode=in,jdbcType=VARCHAR}
    )}
 </update>

2、
異常:No enum const class org.apache.ibatis.type.JdbcType.Integer
原因:mybatis沒有Integer這種JdbcType,應為INTEGER,同理其他jdbcType都應該為大寫

<update id="editMessage" statementType="CALLABLE" parameterType="com.lianlife.bean.Message">
    {call edit(
    #{id,mode=IN,jdbcType=Integer},
    #{content,mode=IN,jdbcType=VARCHAR}
)} </update>

3、Mybatis保留了iBatis中通過“namespace+SQL id”的方式傳送sql並返回資料的形式不需要獲取對映器,不推薦這種方式,原因如下:
(1)sqlSession.update是功能性程式碼,不包含業務邏輯,不符合面向物件的規範
(2)使用Mapper方式IDE可以檢查JAVA語法,避免不必要的錯誤

//通過namespace+SQLid執行SQL語句,不採用
//sqlSession.update("Message.editMessage", message);
//通過mapper方式執行sql,進一步遮蔽了sqlSession物件,採用
MessageMapper messageMapper=sqlSession.getMapper
(MessageMapper.class); messageMapper.editMessage(message);

注:採用mapper方式
①mapper.xml中namespace要指向mapper介面

<mapper namespace="com.lianlife.map.MessageMapper">
    <select id="queryMessage" ...></select>
    <update id="editMessage"...></update>
    ...
</mapper>

②mapper介面中的方法名要與mapper.xml中SQL塊的id一致

package com.lianlife.map;

import java.util.List;

import com.lianlife.bean.Message;

public interface MessageMapper {
    public List<Message> queryMessage(Message message);
    public void editMessage(Message message);
}

4、sql列的別名與JavaBean的屬性名保持一致,mybatis就會把返回結果自動對映到JavaBean的屬性上,實現自動對映

5、《深入淺出MyBatis技術原理與實戰》是本好書