MyBatis
原生jdbc存在問題
1.數(shù)據(jù)庫連接,使用時就創(chuàng)建,不使用立即釋放,對數(shù)據(jù)庫進行頻繁的連接開啟和關(guān)閉,造成數(shù)據(jù)庫資源浪費,影響數(shù)據(jù)庫性能
解決------使用數(shù)據(jù)庫連接池管理數(shù)據(jù)庫連接。
2.將sql語句硬編碼到Java代碼中,如果sql語句修改,需要重新編譯Java代碼,不利于系統(tǒng)的維護。
解決------將sql語句配置在xml文件中。
3.向preparedStatement(可以防止sql注入)中設(shè)置參數(shù),對占位符位置和設(shè)置參數(shù)值,硬編碼,不利于系統(tǒng)維護。
解決------將sql語句配置在xml文件中。
4.從resultSet中遍歷結(jié)果集數(shù)據(jù)時,存在硬編碼,將獲取表的字段進行硬編碼,不利于系統(tǒng)維護。
解決------將查詢的結(jié)果集,自動映射成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è)務(wù)層公用的。
即使mapper接口只有一個參數(shù),可以使用包裝類型的pojo滿足不同的業(yè)務(wù)方法的需求。
注意:持久層方法的參數(shù)可以包裝類型、map。。。,service方法中建議不要使用包裝類型(不利于業(yè)務(wù)層的可擴展)。
resultMap 一對一
<resultMap id="OrdersUserResultMap" type="com.exam.examsystem.domain.Orders">
column:訂單信息的唯一標識的列
property:訂單信息的唯一標識列所映射到Orders中的對應(yīng)屬性-->
? ? <id column="id" property="id" />
<result column="userid" property="userId" />
<result column="number" property="number" />
association:用于映射關(guān)聯(lián)查詢單個對象的信息
javaType:將要關(guān)聯(lián)查詢的用戶信息映射到Orders中的對應(yīng)屬性-->
? ? <association property="user" javaType="com.exam.examsystem.domain.User">
column:用戶信息的唯一標識的列
property:用戶信息的唯一標識列所映射到User中的對應(yīng)屬性-->
? ? ? ? <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總結(jié)
resultType:
作用:
將查詢結(jié)果按照sql列名pojo屬性名一致性映射到pojo中。
場合:
常見一些明細記錄的展示,比如用戶購買商品明細,將關(guān)聯(lián)查詢信息全部展示在頁面時,此時可直接使用resultType將每一條記錄映射到pojo中,在前端頁面遍歷list(list中是pojo)即可。
resultMap:
使用association和collection完成一對一和一對多高級映射(對結(jié)果有特殊的映射要求)。
association:
作用:
將關(guān)聯(lián)查詢信息映射到一個pojo對象中。
場合:
為了方便查詢關(guān)聯(lián)信息可以使用association將關(guān)聯(lián)訂單信息映射為用戶對象的pojo屬性中,比如:查詢訂單及關(guān)聯(lián)用戶信息。
使用resultType無法將查詢結(jié)果映射到pojo對象的pojo屬性中,根據(jù)對結(jié)果集查詢遍歷的需要選擇使用resultType還是resultMap。
collection:
作用:
將關(guān)聯(lián)查詢信息映射到一個list集合中。
場合:
為了方便查詢遍歷關(guān)聯(lián)信息可以使用collection將關(guān)聯(lián)信息映射到list集合中,比如:查詢用戶權(quán)限范圍模塊及模塊下的菜單,可使用collection將模塊映射到模塊list中,將菜單列表映射到模塊對象的菜單list屬性中,這樣的作的目的也是方便對查詢結(jié)果集進行遍歷查詢。
如果使用resultType無法將查詢結(jié)果映射到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