MyBatis学习(三)

94 阅读5分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第33天,点击查看活动详情

MyBatis映射文件

上篇文章我们讲了MyBatis的配置文件内容,知道了如何通过XML对MyBatis的运行行为进行配置,这样我们就可以将MyBatis运行起来了,接下来我们来讲一下MyBatis中另外一种重要的xml文件:映射文件

MyBatis可以通过在xml中写sql语句,然后和通过xml中的命名空间将当前文件对象和Java中的mapper对象管理起来,这样的xml文件在MyBatis中称为映射文件。接下来看下MyBatis为我们提供了哪些xml文档。

映射文件的顶层元素

每个映射xml文件都可以有多个顶层元素节点,这些节点如下所示,按照应被定义的顺序列出:

  • cache – 当前命名空间中的缓存。
  • cache-ref – 对其它命名空间的引用。
  • resultMap – 用于配置数据库结果和Java对象字段之间的映射关系,也是MyBatis中ORM实现的重要能力。
  • parameterMap – 参数映射功能,已废弃,不再介绍。
  • sql – 可以在这里填写sql语句,然后被别的地方引用。
  • insert – 映射插入语句。
  • update – 映射更新语句。
  • delete – 映射删除语句。
  • select – 映射查询语句。

因为我们用的最多的是resultMapinsertupdatedeleteselect语句,接下来进行分别介绍。

select节点

通常来说,一个应用做的最多的事情就是查询,因此MyBatis提供了select节点作为查询的文档节点,也是我们打交道最多的节点,其使用如下:

<select id="selectPerson" parameterType="int" resultType="hashmap">
  SELECT * FROM PERSON WHERE ID = #{id}
</select>

其中用#{id}其实是相当于用数据库中预编译的参数,会从参数id作为值传给数据库,而对应位置用占位符?进行替换,实际生成的sql语句如下:

SELECT * FROM PERSON WHERE ID = ?

对应的Java代码类似如下:

// 近似的 JDBC 代码,非 MyBatis 代码...
String selectPerson = "SELECT * FROM PERSON WHERE ID=?";
PreparedStatement ps = conn.prepareStatement(selectPerson);
ps.setInt(1,id);

该节点的支持配置的属性有很多,这里列出一部分比较重要的:

属性描述
id在命名空间中唯一的标识符,可以被用来引用这条语句。
parameterType将会传入这条语句的参数的类全限定名或别名。这个属性是可选的,因为 MyBatis 可以通过类型处理器(TypeHandler)推断出具体传入语句的参数,默认值为未设置(unset)。
resultType期望从这条语句中返回结果的类全限定名或别名。 注意,如果返回的是集合,那应该设置为集合包含的类型,而不是集合本身的类型。 resultType 和 resultMap 之间只能同时使用一个。
resultMap对外部 resultMap 的命名引用。结果映射是 MyBatis 最强大的特性,如果你对其理解透彻,许多复杂的映射问题都能迎刃而解。 resultType 和 resultMap 之间只能同时使用一个。
fetchSize这是一个给驱动的建议值,尝试让驱动程序每次批量返回的结果行数等于这个设置值。 默认值为未设置(unset)(依赖驱动)。
statementType可选 STATEMENT,PREPARED 或 CALLABLE。这会让 MyBatis 分别使用 Statement,PreparedStatement 或 CallableStatement,默认值:PREPARED。
resultSetTypeFORWARD_ONLY,SCROLL_SENSITIVE, SCROLL_INSENSITIVE 或 DEFAULT(等价于 unset) 中的一个,默认值为 unset (依赖数据库驱动)。
databaseId如果配置了数据库厂商标识(databaseIdProvider),MyBatis 会加载所有不带 databaseId 或匹配当前 databaseId 的语句;如果带和不带的语句都有,则不带的会被忽略。
resultSets这个设置仅适用于多结果集的情况。它将列出语句执行后返回的结果集并赋予每个结果集一个名称,多个名称之间以逗号分隔。

insert, update 和 delete节点

数据变更语句 insert,update 和 delete 的实现非常接近,这里列出它们所支持的配置项:

属性描述
id在命名空间中唯一的标识符,可以被用来引用这条语句。
parameterType将会传入这条语句的参数的类全限定名或别名。这个属性是可选的,因为 MyBatis 可以通过类型处理器(TypeHandler)推断出具体传入语句的参数,默认值为未设置(unset)。
statementType可选 STATEMENT,PREPARED 或 CALLABLE。这会让 MyBatis 分别使用 Statement,PreparedStatement 或 CallableStatement,默认值:PREPARED。
useGeneratedKeys(仅适用于 insert 和 update)这会令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键(比如:像 MySQL 和 SQL Server 这样的关系型数据库管理系统的自动递增字段),默认值:false。
keyProperty(仅适用于 insert 和 update)指定能够唯一识别对象的属性,MyBatis 会使用 getGeneratedKeys 的返回值或 insert 语句的 selectKey 子元素设置它的值,默认值:未设置(unset)。如果生成列不止一个,可以用逗号分隔多个属性名称。
keyColumn(仅适用于 insert 和 update)设置生成键值在表中的列名,在某些数据库(像 PostgreSQL)中,当主键列不是表中的第一列的时候,是必须设置的。如果生成列不止一个,可以用逗号分隔多个属性名称。
databaseId如果配置了数据库厂商标识(databaseIdProvider),MyBatis 会加载所有不带 databaseId 或匹配当前 databaseId 的语句;如果带和不带的语句都有,则不带的会被忽略。