一  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架构演变

     浅谈mybatis如何半自动化解耦

     详解mybatis配置文件

四  参考文献


   【01】http://www.mybatis.org/mybatis-3/zh/configuration.html#

五 版权区


  •    转载博客,必须注明博客出处
  •    博主网址:http://www.cnblogs.com/wangjiming/
  •    如您有新想法,欢迎提出,邮箱:2098469527@qq.com

 

版权声明:本文为wangjiming原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/wangjiming/p/10399333.html