在 mybatis 的 xml 文件里写的 sql 语句实际用的是一门叫做 OGNL 的表达式语言,OGNL 全称 Object Graph Navigation Language 对象图导航语言,是常应用于 Java 中的一个开源的表达式语言(Expression Language),它被集成在 Spring、Mybatis、Struts2 等 Java 框架中,通过简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现类型转化等功能。
在书写动态 SQL 时经常需要借助各种标签,下面是一些在 mybatis 中常用的标签:
if 标签
if 标签的 test 中常用判断:
* 相等:==
* 不等:!=
* 条件或:or
* 条件与:and
* 条件非:!,也可以用 not
* 包含:in
* 不包含:not in
* 小于:<
* 小于等于:<=
* 大于:>
* 大于等于:>=
choose、when、otherwise 标签
相当于 if、else if、else,间接实现了上面 if 标签不支持的 else 效果
where 标签
用于拼接 SQL 语句中的 where 子句,条件成立时才会加上 where 关键字,可以避免拼接出多余的and、or
set 标签
<update id="updateUserInfo" parameterType="UserInfo">
update t_user_info
<set>
<if test="userName != null and userName != ''">
user_name = #{userName},
if>
<if test="age != null">
age = #{age},
if>
set>
where user_id = #{userId}
update>
trim 标签
可以间接实现 where 和 set 标签一样的功能
foreach 标签
遍历集合类数据,标签属性:
collection 接收的参数:
示例1:匿名参数
int insertUsers(List<User> users);
int updateUsers(List<User> users);
<insert id="insertUsers">
insert into t_user (id, user_name, age) values
<foreach collection="list" separator="," item="user">
(#{user.user_id}, #{user.user_name}, #{user.age})
foreach>
insert>
<update id="updateUsers">
<foreach collection="list" separator=";" item="user">
update t_user
<set>
<if test="user.userName != null and user.userName != ''">
user_name= #{user.userName},
if>
<if test="user.age != null">
age= #{user.age},
if>
set>
where user_id = #{user.userId}
foreach>
update>
示例2:具名参数
List<User> selectUsers(@Param("userIds") String[] userIds);
<select id="selectUsers" resultType="User">
select * from t_user where user_id in
<foreach collection="userIds" item="item" open="(" close=")" separator=",">
#{item}
foreach>
select>
更多参数传递可以参考后面的 mybatis 参数章节。
sql、include 标签
可以在 sql 标签里定义语句,然后在需要的地方用 include 标签引入进去,可以实现代码片段复用。
selectKey 标签
用于配合插入数据成功后返回的数据,一般用来返回 id 之类的。
mybatis 中参数传递
主要有以下 5 种传参方式:
1、匿名参数 单个简单类型参数
xml 获取的时候可以随便写,mybatis 会去自动处理,反正只有一个参数干脆就让你写啥都无所谓,不过推荐还是写个有意义的形参:
User getUserByUsername(String userName);
<select id="getUserByUsername" resultType="User">
select * from t_user where user_name = #{xxoo}
select>
多个简单类型参数
多个匿名参数的时候只能通过 mybatis 内置的 param1、param2 按传参顺序对应:
List<User> selectByuserNameAndAge(String userName, Integer age);
<select id="selectByuserNameAndAge" resultMap="BaseResultMap" >
select * from t_user where user_name = #{param1} and age = #{param2}
select>
2、具名参数
具名参数需要用 @Param 注解来指定
List<User> selectByuserNameAndAge(@Param("name") String userName, @Param("age") Integer age);
<select id="selectByuserNameAndAge" resultMap="BaseResultMap" >
select * from t_user where user_name = #{name} and age = #{age}
select>
3、List、Array、Set 参数
List 类型参数默认值 list,Array 类型参数默认值 array,注意 Set 类型的默认值并不是 set 而是 collection,除此之外的集合默认值也是 collection,当然我们也可以用 @Param 注解来自己指定
List<User> selectByAgeList(List ages);
<select id="selectByList" resultMap="BaseResultMap" >
SELECT * from t_user where age in
<foreach collection="list" open="(" separator="," close=")" item="age">
#{age}
foreach>
select>
4、Map 参数
使用 Map 参数时,可以直接用键名引用
Map params = new HashMap<>();
params.put("userName", "周小黑");
params.put("age", 18);
List<User> result = userMapper.selectByMapParams(params);
List<User> selectByMapParams(Map params);
<select id="selectByMapParams" resultMap="BaseResultMap" parameterType="map">
select * from t_user where user_name = #{userName} and age = #{age}
select>
5、Java Bean 参数
和上面的 Map 比较类似,不过这里的 parameterType 要指定为对应的 Bean 实体类型:
List<User> selectByBeans(User user);
<select id="selectByBeans" resultMap="BaseResultMap" parameterType="User">
select * from t_user where user_name = #{userName} and age = #{age}
select>
6、JSON 参数
和上面的 Map、Bean 参数类似,一般是直接把前端传递过来的 json 参数直接传入 Mapper 中进行查询,parameterType 为 JSONObject
List<User> selectByJSON(JSONObject params);
<select id="selectByJSON" resultMap="BaseResultMap" parameterType="com.alibaba.fastjson.JSONObject">
select * from t_user where user_name = #{userName} and age = #{age}
select>
常见属性设置
常用转义符
XML 文件和我们常见的 HTML 类似,都是通过标签来定义数据,而尖括号本身就是表示标签符号的开始和结束,所以在 mybatis 的 xml 文件中相关符号最好用转义符,尤其小于符号 “