复习mybatis框架(一)----映射文件 一、给出映射文件 Mapper.xml 的总结: ① 设置 namespace 命名空间,目的是为了区分映射文件中的方法; ② 结果集 resultMap 是 MyBatis 最大的特色,对象的 ORM 就由其来转换: ③ 在映射文件中,常用的标签有四个,分别为: select、insert、update 和 delete: ④ 获取参数的方法为 #{ 字段名 } 二、动态SQL语句:  四、总结

复习mybatis框架(一)----映射文件
一、给出映射文件 Mapper.xml 的总结:
① 设置 namespace 命名空间,目的是为了区分映射文件中的方法;
② 结果集 resultMap 是 MyBatis 最大的特色,对象的 ORM 就由其来转换:
③ 在映射文件中,常用的标签有四个,分别为: select、insert、update 和 delete:
④ 获取参数的方法为 #{ 字段名 }
二、动态SQL语句:
 四、总结

  参考博主的文章,尊重原创:https://blog.csdn.net/qq_35246620/article/details/54837618

① 设置 namespace 命名空间,目的是为了区分映射文件中的方法;

② 结果集 resultMap 是 MyBatis 最大的特色,对象的 ORM 就由其来转换:

  • 在结果集中,包括主键 id 和 普通属性 result;
  • 在结果集中,常用的两个属性分别为:property,表示实体的属性;column,表示 SQL 查询的结果集的列。

③ 在映射文件中,常用的标签有四个,分别为: select、insert、update 和 delete:

  • 每个标签中都有 id 属性,在同一个 mapper 文件中 id 不允许重复;
  • 参数 parameterMap 已经被废弃,现在其存在的目的就是为了兼容前期的项目;
  • 参数 parameterType 支持很多的类型,例如 int、Integer、String、Double、List、Map 或者实体对象等;
  • 返回值 resultType 用于简单的类型;
  • 返回值 resultMap 用于复杂的类型;
  • 当参数和返回值是集合的时候,其声明的是集合中的元素类型;
  • SQL 语句不区分大小写,它默认使用 PrepareStatement,预编译,可以防止 SQL 注入。

④ 获取参数的方法为 #{ 字段名 }

二、动态SQL语句:

  <!-- 查询功能,parameterType 设置参数类型,resultType 设置返回值类型 -->
    <select >
        SELECT id,name,age FROM person
        <where>
            <if test="name =! null">
                name = #{name}
            </if>
            <if test="age =! null">
                and age = #{age}
            </if>
        </where>
    </select>
    <!-- 修改功能 -->
    <update >
        UPDATE person
        <set>
            <if test="name =! null">
                name = #{name},
            </if>
            <if test="age =! null">
                age=#{age},
            </if>
        </set>
        WHERE id = #{id}
    </update>

  

三、删除功能,给出三种完成批量删除功能的方法,参数类型分别为:Array、List 和 Map。

 <!-- 批量删除,Array 类型    要删除的id在后面这个数组中取:new Integer[]{2, 3, 4}-->
    <delete >
        DELETE FROM person WHEN id IN
        <foreach collection="array" item="id" open="(" close=")" separator=",">
            #{id}
        </foreach>
    </delete>  
    <!-- 批量删除,List 类型 list={1,2,3} -->
    <delete id="deleteList" parameterType="integer">
        DELETE FROM person WHEN id IN
        <foreach collection="list" item="id" open="(" close=")" separator=",">
            #{id}
        </foreach>
    </delete>
   <!-- 批量删除,Map 类型 map.put{}-->
 <!--在通过以下两条语句测试本方法时,实际上仅删除了 id = 3、4、5 中 age = 18 的记录 -->
map.put("ids", new Integer[]{2, 3, 4}); map.put("age",18);
<delete id="deleteMap" parameterType="Map"> DELETE FROM person WHERE id IN <foreach collection="ids" item="id" open="(" close=")" separator=","> #{id} </foreach> AND age = #{age} </delete>

 四、总结

在使用动态 SQL 语句的时候,咱们需要多注意以下几点:

  1. 通过 if 标签来判断字段是否为空,如果为空,则默认不参与到 SQL 语句中,并且可以自动省略逗号;
  2. 通过 where 标签来输出条件完成判断,其可以自动省略多余的 and 和 逗号;
  3. 通过 set 标签来完成修改操作,当字段值为 null 时,其不参与到 SQL 语句中;
  4. 在 foreach 标签中,collection 属性表示传入的参数集合, item 表示每个元素变量的名字,open 表示开始字符,close 表示结束字符,separator 表示分隔符;
  5. 任何参数都可以封装到 Map 中,其以 key 来取值。

 

五、注意用ORACLE数据库需要给每个字段加上默认的jdbcType

测试以上功能的时候就会报出一个异常,即“java.sql.SQLException:无效的列类型(在外包项目中第三方要求用Oracle,经常遇到这个问题”,究其原因:

Oracle 数据库,在进行新增、修改操作时,如果字段值为 null,必须指定字段默认的类型。

 <!-- 在 Oracle 数据中,完成修改功能 -->
 <!-- jdbcType 的类型为数据库中字段的类型,需要严格的对应。 -->

     <update id="update" parameterType="yeepay.payplus.Person">

        UPDATE person
        <set>
            name = #{name,jdbcType=VARCHAR},
            age=#{age,jdbcType=INTEGER}
        </set>
        WHERE id = #{id}
    </update>