一 mybatis 映射文件结构
mybatis映射配置文件存在如下顶级元素,且这些元素按照如下顺序被定义。
- cache – 给定命名空间的缓存配置。
- cache-ref – 其他命名空间缓存配置的引用。
- resultMap – 是最复杂也是最强大的元素,用来描述如何从数据库结果集中来加载对象。
- parameterMap – 已废弃!老式风格的参数映射。内联参数是首选,这个元素可能在将来被移除,这里不会记录。
- sql – 可被其他语句引用的可重用语句块。
- insert – 映射插入语句
- update – 映射更新语句
- delete – 映射删除语句
- select – 映射查询语句
二 mybatis映射配置文件顶级元素分析
(一)CRUD
在映射配置文件中,基本的CRUD操作定义如下
<!--select by id--> <select id="getUserInfoById" resultType="UserInfo"> SELECT user_name ,user_addr FROM user_info WHERE user_id=#{user_id} </select> <!--insert--> <insert id="addUserInfo" useGeneratedKeys="true"> INSERT INTO user_info(user_name,user_addr)VALUES(#{user_name},#{user_addr}) </insert> <!--update--> <update id="updateUserInfo"> UPDATE user_info set user_name=#{user_name} WHERE user_id=#{user_id} </update> <!--delete--> <delete id="delUserInfoById"> DELETE FROM user_info WHERE user_id=#{user_id} </delete>
1.#{}表示占位符,相当于?,#{}需要经过预处理,能防止SQL漏洞注入,当然,也可以使用${},只是不能防止漏洞注入。
2.select语句有很多属性
id -- 唯一标识select语句
parameterType --参数类型
paramerterMap -- 参数映射
resultType -- 返回类型
resultMap -- 返回类型映射
flushCache -- 当语句被调用时,是否清除本地缓存或二级缓存
useCache -- 是否使用二级缓存
timeout -- 在抛出异常之前,驱动程序等待数据库返回请求结果的秒数
fetchSize -- 每次批量返回的结果行数
statementType -- 使用STATEMENT,PREPARED 或 CALLABLE 的一个
resultSetType -- 使用FORWARD_ONLY,SCROLL_SENSITIVE 或 SCROLL_INSENSITIVE 中的一个
<select id="selectPerson" parameterType="int" parameterMap="deprecated" resultType="hashmap" resultMap="personResultMap" flushCache="false" useCache="true" timeout="10000" fetchSize="256" statementType="PREPARED" resultSetType="FORWARD_ONLY">
(二)resultType
resultType可表示返回基本类型,也可表示返回复杂对象类型(包括自定义类型)
1.返回基本类型
<select id="listUserInfo" resultType="int"> SELECT userId FROM user_info </select>
2.返回复杂类型
<select id="getUserInfoById" resultType="UserInfo"> SELECT user_name ,user_addr FROM user_info WHERE user_id=#{user_id} </select>
(三)resultMap
resultMap主要解决TABLE字段与JavaBean映射不匹配问题。
举个例子:
定义一个JavaBean
public class UserInfo { String userName; String addr; //setter和getter }
SQL语句:
DROP TABLE IF EXISTS `user_info`; CREATE TABLE `user_info` ( `user_id` int(5) NOT NULL AUTO_INCREMENT, `user_name` varchar(50) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL, `user_addr` varchar(100) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL, PRIMARY KEY (`user_id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 16 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Compact; SET FOREIGN_KEY_CHECKS = 1;
通过如上发现,user_name与userName不匹配,user_addr与addr不匹配。
通过resultMap就能很好地解决该问题
<resultMap id="userInfoMap" type="UserInfo"> <result property="userName" column="user_name"/> <result property="addr" column="user_addr"/> </resultMap>
property表示JavaBean,column表示table字段
(四)SQL
sql语句,定义可重用语句。
<sql id="userColumns"> ${alias}.id,${alias}.username,${alias}.addr </sql>
引定义好的sql
<select id="listUserInfo" resultMap="userInfoMap"> SELECT <include refid="userColumns"> <property name="alias" value="t1"/> </include> FROM user_info t1 </select>
(五)cache &cache-ref
cache和cache-ref比较重要,放在下篇文章讲解。
三 Mybatis系列文章
浅谈JavaWeb架构演变
四 参考文献
【01】http://www.mybatis.org/mybatis-3/zh/configuration.html#
五 版权区
- 转载博客,必须注明博客出处
- 博主网址:http://www.cnblogs.com/wangjiming/
- 如您有新想法,欢迎提出,邮箱:2098469527@qq.com
原文地址:https://www.cnblogs.com/wangjiming/p/10399333.html