mybatis 标签~基础
普通标签
1.1 select
查询标签主要理解两个映射,第一个映射发生在执行SQL语句之前,根据Mapper接口中的方法找到Mapper文件中对应的SQL语句。第二个映射发生在执行SQL语句之后,根据查询得到的结果集,将结果集映射为Java对象。接下来也分为两个阶段介绍它的每个属性
执行SQL之前:
- id:该属性在同一个命名空间中必须唯一,它建立Mapper配置文件中标签与Mapper中方法的映射关系。
- parameterType:用于指定接口方法中参数的类型。如果是基本数据类型或与之对应的Java类,则不用设置。如果是其他类型,例如Map,必须设置参数类的全名。
- statementType:执行SQL语句需要创建的statement对象,每个值对应JDBC中的一种statement。
- timeout:设置执行SQL语句的超时时间,单位为毫秒。
- databaseId:设置数据库厂商的标识,在某些情况下用处很大,例如分页时Oracle和mysql的写法完全不同。一般情况下会自动判断,但是也可以手动配置,此时databaseId的值必须与config配置文件中的databaseIdProvider对应。
- useCache:是否启用二级缓存。一般不在单个select配置,直接配置cache标签。
- flushCache:是否停用一级缓存,当该值为true时,每次执行select语句都会清空一级缓存。一级缓存是sqlSession的缓存,它默认是开启的。
执行SQL之后:
- resultType:建立结果集与Java类的映射关系,此时使用的是默认的驼峰方式,例如user_name会转换为userName属性。
- resultMap:建立结果集与Java类的映射关系,它的值为resultMap标签的id,这个标签在第六章节介绍一对一,一对多,多对多时在详细介绍。
- resultsetType:指定结果集的类型,它与JDBC中resultSet对象的类型一一对应。
杂项:
- fetchSize:指定返回条数,这个没什么用,一般使用分页插件实现。
- resultSets:多个结果集的名称,基本只有在调用存储过程时,存在多个出参时才会发生,基本没用过。
- resultOrdered:这个标签没有用到过,也没有理解具体的意思。
1.2 insert
Insert标签中大部分的属性与select标签相同,含义也相同,这里介绍insert标签独有的属性。
- useGeneratedKeys:默认为false。如果为true,Mybatis会调用JDBC的getGeneratedKeys方法来取出由数据库内部生成的主键。
- keyProperty:表中主键对应的属性名称。一般都是id。
插入之后获取主键:
使用selectKey标签,mysql数据库的语句为select last_insert_id()。不同的数据库使用不同的SQL语句。
1.3 update
与select标签的属性基本相同。参考select
1.4 delete
与select标签的属性基本相同。参考select。
动态标签
SQL的动态标签有以下四类
- 分支:if,[choose,when,otherwise]。
- 循环:foreach。
- 格式:trim,where,set。
- 杂项:databaseId,bind。
2.1 分支
2.1.1 if
与编程语言中的单If语句相同。通常用于where条件,insert,update语句中列的判断。
属性:
test: 指定分支的条件
格式:
<if test="">sql</if>
示例:
<if test="userName != null">
and user_name like concat("%",#{userName} ,"%")
<if>
2.1.2 choose & when & otherwise
与编程语言中的if,elseif,else格式相同。含义稍微有些区别,
choose标签无任何意义。
when标签对应if,每个test对应分支的条件,多个when之间并不存在if,elseif之间的关系。彼此都是独立的,相当于写了多个if。
otherwise标签与else格式含义相同,当上述中所有when的分支都不满足时,执行otherwise,并不对应具体的when分支。
属性:
只有when标签存在test属性,与if标签的test属性含义相同,值为分支的条件。
格式:
<choose>
<!—1到多个when标签 -->
<when test=""></when>
<!—只能存在一个-->
<otherwise></otherwise>
</choose>
2.2 循环
2.2.1 forEach
用于循环拼接SQL语句,常用于拼接in条件,批量插入的语句。在整个循环过程中,都是一条SQL语句。
属性:
- collect:指定集合的类型,值一般为list或map
- open: 在循环之前,添加一个前缀。
- close: 在循环结束之后,添加一个后缀
- separator: 每次循环结束之后,添加一个分隔符,例如insert中的逗号
- Item:当collection表示list时,相当于定义一个临时变量,在标签内部使用此变量,当collection表示map时,临时变量的值为map每次循环的value值。
- Index:当collection表示list时,值为数字,表示当前循环的索引值。当collection表示map时,值为字符串,表示当前map的key值。
格式:
<foreach collection= "list" open= "(" close= ")" separator="," item="" index="">
Sql片段
</foreach>
示例:
批量插入多个用户,为了简便只写了两个属性id,name,可以根据自身需求添加任何其他属性
<foreach collection= "list" open= "(" close= ")" separator="," item="user">
(#{user.id},#{user.name})
</foreach>
2.3 格式
2.3.1 trim
用于去掉SQL语句中多余的前缀和后缀,注意整个过程中,都是一条SQL语句。
属性:
- prefix: 指定语句片段的前缀,例如拼接where条件时,WHERE作为前缀
- prefixOverrides: 去除多余的前缀,一般值都是 and | or,容易在拼接SQL语句时产生多余的and和or
- suffix: 指定语句片段的后缀。
- suffixOverrides: 去除多余的后缀,一般都是逗号,在批量插入时,去除最后一个逗号。
格式:
<trim prefix= "where" prefixOverrides="" suffix="" suffixOverrides="">
sql片段
</trim>
示例:
<!-- 等价<where>
-->
<trim prefix= "where" prefixOverrides="and | or">
Sql片段
</trim>
<!-- 等价<set>
-->
<trim prefix= "set" suffixOverriders=",">
Sql片段
</trim>
2.3.2 where
where标签对应SQL片段中的where条件,包含在where标签内部的SQL片段会自动去除多余的and,or前缀
格式:<where> </where>
2.3.3 set
set标签对应更新SQL中的set片段。包含在set标签内部的SQL片段会自动去除多余的逗号。
属性:
只有when标签存在test属性,与if标签的test属性含义相同,值为分支的条件。
格式:
其中fieldName为Java类中属性的名称,columnName对应表的列名。最后的逗号不可省略。
<set>
<if test="fieldName != null">
columnName = #{fieldName},
</if>
</set>
2.4 其他
2.4.1 bind
bind标签用于定义一个临时变量,在之后的SQL语句中可以引用此变量,类似其他配置文件中的property,只不过它不可以引入properties文件。
属性:
name:变量的名称
value:变量的值
格式:
<!-- 它的作用域不是整个Mapper文件,而是某个SQL语句的标签内部。例如where标签内。-->
<bind name=”” value=""/>
2.4.2 databaseId
它对应于config配置文件中的databaseIdProvider,用于区分数据库的类型。
在Mapper配置文件中,它与id作为联合主键,与接口中的方法一一对应,例如存在select标签,它的id为selectById,默认情况下它与接口中的selectById方法对应,当指定databaseId时,当数据库类型为Mysql时,会执行databaseId为mysql,id为selectById的SQL,当为oracle时,会执行databaseid为oracle,id为selectById的SQL。默认id是唯一的,添加databaseId后,databaseId与id的组合是唯一的。
它不是一个标签,而是一个标签的属性。
示例:
<!-- 数据库为mysql,执行 -->
<select id="selectById" databaseId="mysql"></select>
<!-- 数据库为oracle,执行 -->
<select id="selectById" databaseId="oracle"></select>
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)