SQL 映射文件
Ⅰ 前言
在 MyBatis 第一课 中,我详细讲解了写一个 MyBatis 程序的全过程和它的全局配置文件。
在 MyBatis 中还有一个重要的配置文件就是 SQL 映射文件。
我们可以看一下官方文档对这个文件的描述。
文档中说,SQL 映射文件是 MyBatis 真正的力量所在……这里发生了神奇的事情。
这篇文章我们就来研究一下 SQL 映射文件。
Ⅱ 增、删、改操作
先回顾一下 MyBatis 第一课 中我的 case 。
我定义了一个实体类 Employee
,和我的数据库中的一个表相对应;定义了一个接口 EmployeeMapper
,这个接口中定义了一个根据 id 获得 Employee
对象的方法。
现在我们再加上增删改的方法。
现在我们在 SQL 映射文件中增加新添加的 增、删、改的 SQL 语句。
注意这里的每个模块的 parameterType
属性都可以不写。
我们写一个测试方法,使用方法在 MyBatis 第一课 中已经详细讲述,这里不再赘述。
我们先来测试一下添加数据。
这里获取 SqlSession
对象我使用的是 openSession()
的无参方法,实际上还有另外一个方法。
此布尔值表示的是是否自动提交事务,无参的方法默认的是 false,所以我们需要在执行完写操作之后通过 commit()
手动提交一下。
数据库原始数据只有一条:
测试成功:
再来看修改。
测试成功
最后再来测试一下删除:
仍是成功的。
这里我们定义的增删改都没有返回值,MyBatis 一共支持三种类型的返回值:int, long, boolean,这三种类型的基本类型或者它们的包装类都可以。
int
和 long
的返回值都会返回此次操作影响的行数,boolean 是在影响行数大于 0 行的时候就返回为 true
。
我们用增加方法来测试一下,我直接将它的返回值设置为 boolean,除此之外不需要做任何配置了,直接在接口中修改返回值即可。
测试结果如下
如果你使用的是自增主键,比如 id 值,不用自己写,数据库默认加一条记录 id 就增加 1,那我们要怎么获取数据库自增主键的值呢?
这里我们可以在 insert
标签下增加两个属性。
useGeneratedKeys
表示使用自增主键获取主键值策略,keyProperty
指定对应的主属性,也就是 MyBatis 在获取到主键值之后,将这个值封装给 javabean 的哪个属性。
Ⅲ 参数处理
在 MyBatis 中,我们配置 SQL 映射文件时是没有操心参数的类型问题的。
不管接口中传什么参数,在 SQL 映射文件中都可以根据 #{}
取出对应的值,现在我们来看一下 MyBatis 是如何进行参数处理的。
对于单个参数而言,MyBatis 不会做特殊的处理,直接可以取出参数值。比如我们要取得 id,可以在大括号里写个 id。
实际上,大括号里写什么都可以,因为这个大括号里只有一个参数值要取出来,所以无所谓。
比如我们写一个 yzh。
同样可以取出来。
那我们再试一下多个参数的,比如我再定义一个根据 id 和 firstName 共同查询的方法。
然后我们写 SQL 映射文件中的内容。
由于获取 SqlSessionFactory
的代码是一样的,所以我直接将它提取出来写了一个方法。
然后我们来看一下测试代码:
运行后发现报错了
报错说没有找到 id,可用的参数是 [arg1, arg0, param1, param2]
org.apache.ibatis.exceptions.PersistenceException:
### Error querying database. Cause: org.apache.ibatis.binding.BindingException: Parameter 'id' not found. Available parameters are [arg1, arg0, param1, param2]
### Cause: org.apache.ibatis.binding.BindingException: Parameter 'id' not found. Available parameters are [arg1, arg0, param1, param2]