MyBatis
原生jdbc存在問題
1.數(shù)據(jù)庫連接吠架,使用時就創(chuàng)建怀薛,不使用立即釋放落萎,對數(shù)據(jù)庫進行頻繁的連接開啟和關閉悯许,造成數(shù)據(jù)庫資源浪費仆嗦,影響數(shù)據(jù)庫性能
解決------使用數(shù)據(jù)庫連接池管理數(shù)據(jù)庫連接。
2.將sql語句硬編碼到Java代碼中先壕,如果sql語句修改瘩扼,需要重新編譯Java代碼,不利于系統(tǒng)的維護垃僚。
解決------將sql語句配置在xml文件中集绰。
3.向preparedStatement(可以防止sql注入)中設置參數(shù),對占位符位置和設置參數(shù)值谆棺,硬編碼栽燕,不利于系統(tǒng)維護。
解決------將sql語句配置在xml文件中改淑。
4.從resultSet中遍歷結果集數(shù)據(jù)時碍岔,存在硬編碼,將獲取表的字段進行硬編碼朵夏,不利于系統(tǒng)維護蔼啦。
解決------將查詢的結果集,自動映射成Java對象侍郭。
#{}和${}
#{}表示一個占位符號询吴,#{}接收輸入?yún)?shù)掠河,類型可以是簡單類型亮元,pojo、hashmap唠摹。
如果接收簡單類型爆捞,#{}中可以寫成value或其它名稱。
#{}接收pojo對象值勾拉,通過OGNL讀取對象中的屬性值煮甥,通過屬性.屬性.屬性...的方式獲取對象屬性值。
${}表示一個拼接符號藕赞,會引用sql注入成肘,所以不建議使用${}。
${}接收輸入?yún)?shù)斧蜕,類型可以是簡單類型双霍,pojo、hashmap。
如果接收簡單類型洒闸,${}中只能寫成value染坯。
${}接收pojo對象值,通過OGNL讀取對象中的屬性值丘逸,通過屬性.屬性.屬性...的方式獲取對象屬性值单鹿。
mapper代理開發(fā)規(guī)范
編寫mapper.xml映射文件
編寫mapper接口需要遵循一些開發(fā)規(guī)范,mybatis可以自動生成mapper接口實現(xiàn)類代理對象深纲。
開發(fā)規(guī)范:
1仲锄、在mapper.xml中namespace等于mapper接口地址
2、mapper.java接口中的方法名和mapper.xml中statement的id一致
3囤萤、mapper.java接口中的方法輸入?yún)?shù)類型和mapper.xml中statement的parameterType指定的類型一致昼窗。
4、mapper.java接口中的方法返回值類型和mapper.xml中statement的resultType指定的類型一致涛舍。
mapper接口方法參數(shù)只能有一個是否影響系統(tǒng)開發(fā)
系統(tǒng)框架中澄惊,dao層的代碼是被業(yè)務層公用的。
即使mapper接口只有一個參數(shù)富雅,可以使用包裝類型的pojo滿足不同的業(yè)務方法的需求掸驱。
注意:持久層方法的參數(shù)可以包裝類型、map没佑。毕贼。。蛤奢,service方法中建議不要使用包裝類型(不利于業(yè)務層的可擴展)鬼癣。
resultMap 一對一
<resultMap id="OrdersUserResultMap" type="com.exam.examsystem.domain.Orders">
column:訂單信息的唯一標識的列
property:訂單信息的唯一標識列所映射到Orders中的對應屬性-->
? ? <id column="id" property="id" />
<result column="userid" property="userId" />
<result column="number" property="number" />
association:用于映射關聯(lián)查詢單個對象的信息
javaType:將要關聯(lián)查詢的用戶信息映射到Orders中的對應屬性-->
? ? <association property="user" javaType="com.exam.examsystem.domain.User">
column:用戶信息的唯一標識的列
property:用戶信息的唯一標識列所映射到User中的對應屬性-->
? ? ? ? <id column="id" property="id" />
<result column="username" property="userName" />
<result column="sex" property="sex" />
</association>
</resultMap>
resultMap 一對多
<resultMap id="UserRoleResultMap" type="com.exam.examsystem.domain.User">
? ? ? ? <id column="id" property="id" />
? ? ? ? <result column="user_name" property="userName" />
? ? ? ? <result column="sex" property="sex" />
? ? ? ? <!--配置一對多 -->
? ? ? ? <collection property="roles" ofType="com.exam.examsystem.domain.Role">
? ? ? ? ? ? <id column="role_id" property="id" />
? ? ? ? ? ? <result column="role_name" property="roleName" />
? ? ? ? </collection>
? ? </resultMap>
resultMap總結
resultType:
作用:
將查詢結果按照sql列名pojo屬性名一致性映射到pojo中。
場合:
常見一些明細記錄的展示啤贩,比如用戶購買商品明細待秃,將關聯(lián)查詢信息全部展示在頁面時,此時可直接使用resultType將每一條記錄映射到pojo中痹屹,在前端頁面遍歷list(list中是pojo)即可章郁。
resultMap:
使用association和collection完成一對一和一對多高級映射(對結果有特殊的映射要求)。
association:
作用:
將關聯(lián)查詢信息映射到一個pojo對象中志衍。
場合:
為了方便查詢關聯(lián)信息可以使用association將關聯(lián)訂單信息映射為用戶對象的pojo屬性中暖庄,比如:查詢訂單及關聯(lián)用戶信息。
使用resultType無法將查詢結果映射到pojo對象的pojo屬性中楼肪,根據(jù)對結果集查詢遍歷的需要選擇使用resultType還是resultMap培廓。
collection:
作用:
將關聯(lián)查詢信息映射到一個list集合中。
場合:
為了方便查詢遍歷關聯(lián)信息可以使用collection將關聯(lián)信息映射到list集合中春叫,比如:查詢用戶權限范圍模塊及模塊下的菜單肩钠,可使用collection將模塊映射到模塊list中俘侠,將菜單列表映射到模塊對象的菜單list屬性中,這樣的作的目的也是方便對查詢結果集進行遍歷查詢蔬将。
如果使用resultType無法將查詢結果映射到list集合中爷速。
1.映射文件:xxxMapper.xml
配置sql語句
<mapper namespace="test">? ? ? ? 輸入? ? ? ? ? ? ? ? ? 輸出
<select id = "findUserById" parameterType = "int" resultType="類的全限定名">
select * from USER where i =#{id}
</select>
</mapper>
2.SqlMapConfig.xml中加載xxxMapper.xml