不过应该有让⼤家了解到 Mybatis 的核⼼配置⽂件 l 全貌,其中的 元素即是我们本节准备登场介绍的 SQL 映射器,上节有介绍了三种引⼊ SQL 映射器的⽅式,本节我们就主要聊聊它的⼏个顶级元素⽤法。
Mybatis 真正强⼤就在于它的语句映射,这是它的魔⼒所在,也是基⽯。由于它异常强⼤,映射器的 XML ⽂件就显得相对简单。如
映射器有九⼤顶级元素 ,基本技能介绍
select : ⽤于查询,⽀持传参,返回指定结果集;
insert : ⽤于新增,⽀持传参,返回指定结果集;
update : ⽤于更新,⽀持传参,返回指定结果集;
⽆论你有多么复杂的 SQL 操作,最根本的思路都逃不出以上 4 部分。
每⼀段 SQL 语句都是唯⼀定义的,我们在 Mybatis 中⽤「 命名空间标识 + 语句块 ID 」作为唯⼀的标识,组合之后在 Mybatis ⼆级缓存中可以作为本地 map 集合 缓存 的唯⼀Key ,也可以⽤于 Dao 接⼝的 映射 绑定,还能作为唯⼀ 代理 标识。总之,我们希望避免命名冲突和重复定义,所以,拥有这么⼀个唯⼀标识 ,它就⾄少有⼀亿个利好。
我们希望完成类似 JDBC 中的 PrepareStatement 预编译处理 ,可以使⽤ #{} ,它会在替换占位符时⾸尾添加上单引号 '' ,能有效防⽌
SQL 注⼊ 风险。
、注⼊
select * from t_user
下⾯详细介绍⼀下,略微冗长,⼀⼝⽓看完吧:
id 必填项,在命名空间下的唯⼀标识,可被 Mybatis 引⽤,如果存在相同的 “ 命名空间 + 语句id ” 组合,Mybatis 将抛出异常;
java类的概念parameterType 可选项,传⼊语句的参数的类全限定名或别名,可以是基本类型、map 或 JavaBean 等复杂的参数类型传递给SQL;
parameterMap ⽤于引⽤外部 parameterMap 的属性块,⽬前已被废弃。以后请使⽤⾏内参数映射和 parameterType 属性。
resultType 可选项,定义类的全路径,在允许⾃动匹配的情况下,结果集将通过 Javaben 的规范映射,或定义为 int 、double、float 等参数;也可以使⽤别名,但是要符合别名规范和定义。 resultType 和 resultMap 之间只能同时使⽤⼀个。(⽇常中,⽐如我们统计结果总条数的时候可以设置为 int );
resultMap 可选项,对外部 resultMap 的命名引⽤。结果映射是 MyBatis 最强⼤的特性,如果你对其理解透彻,许多复杂的映射问题都能迎刃⽽解,后⾯⼀对⼀、⼀对多、多对多我们会有⼀篇⽂章单独讲解。 resultType 和 resultMap 之间只能同时使⽤⼀个。
flushCache 可选项,清空缓存,将其设置为 true 后,只要语句被调⽤,都会导致本地缓存和⼆级缓存被清空,默认值:false。
useCache 可选项,使⽤缓存,将其设置为 true 后,将会导致本条语句的结果被⼆级缓存缓存起来,默认值:对 select 元素为true。
timeout 可选项,这个设置是在抛出异常之前,驱动程序等待数据库返回请求结果的秒数。默认值为未设置(unset)(依赖数据库驱动)。
fetchSize 可选项,获取记录的总条数设定。这是⼀个给驱动的建议值,尝试让驱动程序每次批量返回的结果⾏数等于这个设置值。 默认值为未设置(unset)(依赖驱动)。由于性能问题,建议在 sql 做分页处理。
statementType 可选项,可选 STATEMENT,PREPARED 或 CALLABLE。这会让 MyBatis 分别使⽤
Statement,PreparedStatement 或 CallableStatement,默认值:PREPARED。
resultSetType 可选项,FORWARD_ONLY,SCROLL_SENSITIVE, SCROLL_INSENSITIVE 或 DEFAULT(等价于 unset) 中的⼀个,默认值为 unset (依赖数据库驱动)。 FORWARD_ONLY,只允许游标向前访问; SCROLL_SENSITIVE,允许游标双向滚动,但不会及时更新数据,也就是说如果数据库中的数据被修改过,并不会在resultSet中及时更新出来; SCROLL_INSENSITIVE ,允许游标双向滚动,如果数据库中的数据被修改过,会及时更新到resultSet;
我们知道 JDBC 通过 ResultSet 来对查询结果进⾏封装,ResultSet 对象本⾝包含了⼀个由查询语句返回的⼀个结果集合。例如你经常在 JDBC 见过的结果集读取:
// 允许滚动游标索引结果集while( rs.next() ){    rs.getString("name");}// 当然也⽀持游标定位到最后⼀个位置rs.last();// 向后滚动rs.previous();
databaseId 可选项,如果配置了数据库⼚商标识(databaseIdProvider),MyBatis 会加载所有不带 databaseId 或匹配当前
databaseId 的语句;如果带和不带的语句都有,则不带的会被忽略。
resultOrdered 可选项,这个设置仅针对嵌套结果 select 语句:如果为 true,将会假设包含了嵌套结果集或是分组,当返回⼀个主结果⾏时,就不会产⽣对前⾯结果集的引⽤。 这就使得在获取嵌套结果集的时候不⾄于内存不够⽤。默认值:false。
resultSets 这个设置仅适⽤于多结果集的情况。它将列出语句执⾏后返回的结果集并赋予每个结果集⼀个名称,多个名称之间以逗号分隔。
四、insert / update / delete 增删改
数据变更语句 insert,update 和 delete 的实现⾮常接近,⽽且相对于 select 元素⽽⾔要简单许多。
其中⼤部分属性和 select 元素相同,我们介绍 3 个不同的属性:
useGeneratedKeys : (仅适⽤于 insert 和 update)这会令 MyBatis 使⽤ JDBC 的 getGeneratedKeys ⽅法来取出由数据库内部⽣成的主键(⽐如:像 MySQL 和 SQL Server 这样的关系型数据库管理系统的⾃动递增字段),默认值:false。
keyProperty : (仅适⽤于 insert 和 update)指定能够唯⼀识别对象的属性,MyBatis 会使⽤ getGeneratedKeys 的返回值或 insert

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。