参考博主的文章,尊重原创: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. 史上最全的web前端开发程序员学习清单!

    今天为什么要给大家分享这篇文章呢,我发现最近来学前端的特别多,群里面整天都有人问:前端好找工作吗?前端要怎么学啊?前端工资怎么样?前端XX,前端XXX,虽然我回答过无数次这种问题了,但是问这个的还是有 ...

  2. (29)C#多线程

    使用线程的原因 1.不希望用户界面停止响应. 2.所有需要等待的操作,如文件.数据库或网络访问需要一定的时间. 一个进程的多个线程可以同时运行不同cpu或多核cpu的不同内核上 注意多线程访问相同的数 ...

  3. 2-SAT浅谈

    2-SAT浅谈 一.2-SAT问题 首先,什么是$2-SAT$问题.现在给出这样一类问题:给出$n$个点和关于这$n$个点的$m$条限制条件,并且这$n$个点中,每一个点只有两种状态.对于上述问题,我 ...

  4. superviosrd进程管理

    supervisor进程管理器---------------------------1. 安装依赖yum install python-setuptools-devel 2. 安装supervisor ...

  5. sqlldr control file compare with HEX value

    when field= UTL_I18N.RAW_TO_CHAR ('e38080', 'AL32UTF8')

  6. 为添加了自定义域名的GitHub Pages添加SSL,启用强制HTTPS(小绿锁)

    直奔主题 为什么要使用https协议? 提高网站访问安全性,网络连接都是加密的 (PS:虽然SSL并不是无懈可击的,但是我们应该尽可能提高窃听成本). 目前越来越多的浏览器会判断当前站点支不支持htt ...

  7. iOS KVC/KVO 线程(GCP)

    最近比较忙,把学习知识点的帖子的地址记一下,有时间再好好整理. KVC/KVO1 KVC/KVO2 线程(GCP)

  8. 阿里云ECS在CentOS 6.9中使用Nginx提示:nginx: [emerg] socket() [::]:80 failed (97: Address family not supported by protocol)的解决方法

    说明: 1.[::]:80这个是IPv6的地址. 2.阿里云截至到今天还不支持IPv6. 解决方式: 1.普通解决方式:开启IPv6的支持,不过这个方法在阿里云行不通. vim /etc/nginx/ ...

  9. Springboot默认加载application.yml原理以及扩展

    Springboot默认加载application.yml原理以及扩展 SpringApplication.run(...)默认会加载classpath下的application.yml或applic ...

  10. 【微信】微信小程序 调用this.setData报错this.setData is not a function;

    在调用方法过程中 报错如下: 代码如下: Page({ /** * 页面的初始数据 */ data: { userLocalInfo:'用户地址' }, /** * 返回swapping页面 */ b ...