复习mybatis框架(一)----映射文件
参考博主的文章,尊重原创: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 语句的时候,咱们需要多注意以下几点:
- 通过 if 标签来判断字段是否为空,如果为空,则默认不参与到 SQL 语句中,并且可以自动省略逗号;
- 通过 where 标签来输出条件完成判断,其可以自动省略多余的 and 和 逗号;
- 通过 set 标签来完成修改操作,当字段值为 null 时,其不参与到 SQL 语句中;
- 在 foreach 标签中,collection 属性表示传入的参数集合, item 表示每个元素变量的名字,open 表示开始字符,close 表示结束字符,separator 表示分隔符;
- 任何参数都可以封装到 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框架(一)----映射文件的更多相关文章
- Mybatis框架基于映射文件和配置文件的方式,实现增删改查,可以打印日志信息
首先在lib下导入: 与打印日志信息有关的架包 log4j-1.2.16.jar mybatis架包:mybatis-3.1.1.jar 连接数据库的架包:mysql-connector-java-5 ...
- Mybatis系列全解(五):全网最全!详解Mybatis的Mapper映射文件
封面:洛小汐 作者:潘潘 若不是生活所迫,谁愿意背负一身才华. 前言 上节我们介绍了 < Mybatis系列全解(四):全网最全!Mybatis配置文件 XML 全貌详解 >,内容很详细( ...
- Mybatis(二) SQL映射文件
SQL映射文件 单条件查询 1. 在UserMapper接口添加抽象方法 //根据用户名模糊查询 List<User> getUserListByName(); 2. 在UserMappe ...
- 【mybatis xml】数据层框架应用--Mybatis 基于XML映射文件实现数据的CRUD
使用MyBatis框架进行持久层开发 MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架. MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索. MyBa ...
- 初始MyBatis、SQL映射文件
MyBatis入门 1.MyBatis前身是iBatis,是Apache的一个开源项目,2010年这个项目迁移到了Google Code,改名为MyBatis,2013年迁移到GitHub.是一个基于 ...
- MyBatis 的 XML 映射文件使用说明
简介 文档参考地址:http://www.mybatis.org/mybatis-3/zh/index.html MyBatis 的真正强大在于它的映射语句,也是它的魔力所在.由于它的异常强大,映射器 ...
- mybatis的mapper映射文件
1概述1.1应用架构 mybatis框架用于支持对关系数据库的操作,该体系的应用架构如下图所示: 在mybatis框架体系中,主要的组件是:SqlSessionFactoryBean和Mapp ...
- MyBatis框架——关系映射(一对多、多对多、多对一查询)
关系映射 一.映射(多)对一.(一)对一的关联关系 1).使用列的别名 ①.若不关联数据表,则可以得到关联对象的id属性 ②.若还希望得到关联对象的其它属性.则必须关联其它的数据表 1.创建表: 员工 ...
- mybatis教程3(映射文件)
MyBatis 的真正强大在于它的映射语句,也是它的魔力所在.由于它的异常强大,映射器的 XML 文件就显得相对简单.如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉了将近 95% ...
随机推荐
- (26)C#WebService
一.创建webservice 二.发布webservice 1.正式发布 (1)配置IIS 自己在局域网用的话,只需1,2,3 三步 1:网站的名称,将来IIS里有多个网站时可以方便区分 2:文件的本 ...
- (4)C#工具箱-菜单和工具栏
1.ContextMenuStrip(右键菜单栏) 把contextMenuStrip控件拖到窗体上,会在窗体下面显示,点击控件在最上行显示菜单栏,可以任意设置.(运行以后不会在界面上显示,它需要预控 ...
- 华农oj 2192: hzk又在打人【CRT合并/待补】
2192: hzk又在打人 Time Limit: 12 Sec Memory Limit: 512 MB Submit: 52 Solved: 1 [Submit][Status][Web Boar ...
- 新疆大学ACM-ICPC程序设计竞赛五月月赛(同步赛)- Red Rover
链接:https://www.nowcoder.com/acm/contest/116/A来源:牛客网 输入描述: Input consists of a single line containing ...
- 微信小程序开发,上传wx.uploadFile 返回参数处理
这真的是个坑,前端看了半天,说是字符串,让后台处理,后台说返回的是正确的,原来这个请求就是返回的string类型,见下图,无法取到code,需要前台自己转化. 以下为百度出来的参考: wx.reque ...
- docker网络及Dockerfile
1.制作镜像 使用阿里的yum源,网址:https://opsx.alibaba.com/mirror,或者mirrors.aliyun.com,点击帮助,就会有弹框出来. docker pull c ...
- 四. Java继承和多态1. 继承的概念与实现
继承是类与类之间的关系,是一个很简单很直观的概念,与现实世界中的继承(例如儿子继承父亲财产)类似. 继承可以理解为一个类从另一个类获取方法和属性的过程.如果类B继承于类A,那么B就拥有A的方法和属性. ...
- Java多线程设计模式(1)
1 线程中的几个方法解释 Thread.sleep(long 毫秒) 在指定的时间内让当前线程休眠,将控制权交给其他线程,休眠的线程依旧拥有它所占用的锁, Thread.yield(); 暂停或者放弃 ...
- 字母数字、字母、汉字验证码 (java)
原文:http://blog.csdn.net/qh_java/article/details/49854477 一.字母数字,字母,汉字验证码的生成代码 1.字母数字验证码: package com ...
- UVa 1218 - Perfect Service
/*---UVa 1218 - Perfect Service ---首先对状态进行划分: ---dp[u][0]:u是服务器,则u的子节点可以是也可以不是服务器 ---dp[u][1]:u不是服务器 ...