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

一、给出映射文件 Mapper.xml 的总结:

① 设置 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 id="findAll" parameterType="yeepay.payplus.Person" resultType="Person"> <!-- 书写 SQL 语句 -->
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 id="update" parameterType="yeepay.payplus.Person">
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 id="deleteArray" parameterType="integer">
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>

复习mybatis框架(一)----映射文件的更多相关文章

  1. Mybatis框架基于映射文件和配置文件的方式,实现增删改查,可以打印日志信息

    首先在lib下导入: 与打印日志信息有关的架包 log4j-1.2.16.jar mybatis架包:mybatis-3.1.1.jar 连接数据库的架包:mysql-connector-java-5 ...

  2. Mybatis系列全解(五):全网最全!详解Mybatis的Mapper映射文件

    封面:洛小汐 作者:潘潘 若不是生活所迫,谁愿意背负一身才华. 前言 上节我们介绍了 < Mybatis系列全解(四):全网最全!Mybatis配置文件 XML 全貌详解 >,内容很详细( ...

  3. Mybatis(二) SQL映射文件

    SQL映射文件 单条件查询 1. 在UserMapper接口添加抽象方法 //根据用户名模糊查询 List<User> getUserListByName(); 2. 在UserMappe ...

  4. 【mybatis xml】数据层框架应用--Mybatis 基于XML映射文件实现数据的CRUD

    使用MyBatis框架进行持久层开发 MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架. MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索. MyBa ...

  5. 初始MyBatis、SQL映射文件

    MyBatis入门 1.MyBatis前身是iBatis,是Apache的一个开源项目,2010年这个项目迁移到了Google Code,改名为MyBatis,2013年迁移到GitHub.是一个基于 ...

  6. MyBatis 的 XML 映射文件使用说明

    简介 文档参考地址:http://www.mybatis.org/mybatis-3/zh/index.html MyBatis 的真正强大在于它的映射语句,也是它的魔力所在.由于它的异常强大,映射器 ...

  7. mybatis的mapper映射文件

    1概述1.1应用架构     mybatis框架用于支持对关系数据库的操作,该体系的应用架构如下图所示: 在mybatis框架体系中,主要的组件是:SqlSessionFactoryBean和Mapp ...

  8. MyBatis框架——关系映射(一对多、多对多、多对一查询)

    关系映射 一.映射(多)对一.(一)对一的关联关系 1).使用列的别名 ①.若不关联数据表,则可以得到关联对象的id属性 ②.若还希望得到关联对象的其它属性.则必须关联其它的数据表 1.创建表: 员工 ...

  9. mybatis教程3(映射文件)

    MyBatis 的真正强大在于它的映射语句,也是它的魔力所在.由于它的异常强大,映射器的 XML 文件就显得相对简单.如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉了将近 95% ...

随机推荐

  1. Codeforces Round #109 (Div. 2) A. I_love_%username%【打擂台算法/满足当前数字在已经出现的数字的最大值和最小值之间的个数】

    A. I_love_%username% time limit per test 2 seconds memory limit per test 256 megabytes input standar ...

  2. LIS【p1704】寻找最优美做题曲线

    Description 洛谷OJ刷题有个有趣的评测功能,就是系统自动绘制出用户的"做题曲线".所谓做题曲线就是一条曲线,或者说是折线,是这样定义的:假设某用户在第b[i]天AC了c ...

  3. Longest Common Substring($LCS$)

    Longest Common Substring(\(LCS\)) 什么是子序列? 子序列就是某一个序列的不连续的一部分. 如图, \(abcde\)就是图中序列的一个子序列. 公共子序列 公共子序列 ...

  4. 数学【p1412】 经营与开发(秦九韶算法)

    顾z 你没有发现两个字里的blog都不一样嘛 qwq 题目描述-->P1412 经营与开发 分析 虽然看到\(Rank_1\)已经有了解释. 但我认为我能BB的更好 我还是决定来写一篇题解. q ...

  5. codevs 1025 选菜——01背包

    时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Description 在小松宿舍楼下的不远处,有PK大学最不错的一个食堂—— ...

  6. 【IntellJ IDEA】idea上 实现了Serializable接口,要自动生成serialVersionUID的方法

    需要点进setting ->搜索Inspections-->右侧选择java 下拉 进入Serialization issue--->勾选Serializable class wit ...

  7. 【Linux】linux下查看目录所在分区

    命令如下: df -h 目录名 具体使用例子如下:查看/home/sxd/文档处于哪个分区 ------------------------------------------------------ ...

  8. java的几个概念AOP、IOC、DI、DIP、工厂模式、IOC容器

    1.AOP:面向切面编程 把一些公共类,比如日志类.安全类.数据库连接类.系统统一的认证.权限管理类.资源池(如数据库连接池的管理).性能监控等做成一个公共类,当其他类需要时,进行注入(调用).这样这 ...

  9. Linux下查找、删除、替换命令

    查看某目录下所有文件的个数: [root@localhost1 opt]# ls -l |grep "^-"|wc -l 查看某目录下所有文件的个数,包括子目录里面的: [root ...

  10. js获取页面传来参数的方法

    function GetQueryString(name) { var reg = new RegExp("(^|&)" + name + "=([^&] ...