MyBatis 的动态 SQL 使用 OGNL 表达式
在 XML 中的一些特殊字符需要转义,参考 HTML ISO-8859-1 手册
一、IF
select * from myuser whereid = #{id}
and name like #{name}
and age = #{age}
入参没有ID属性时会报错,会拼接成 where and,解决:可以在 where 后添加一个恒成立,如 1=1。或者使用 where 标签,会自动去除 SQL 中多出来的 and 或 or
二、WHERE
select * from myuser
id = #{id}
and name like #{name}
and age = #{age}
where 标签只能去除第一个 and 或 or,所以不能把条件符号写多个或写在后面
三、SET
update myuser
name = #{name},
age = #{age}
where id = #{id}
四、TRIM
select * from myuser
id = #{id} and
name like #{name}
trim 标签可以替代 where 标签
...
trim 标签也可以替代 set 标签
...
五、CHOOSE
select * from myuser
id = #{id}
name like #{name}
age = 22
六、FOREACH
Map 入参
select * from myuser where id in
#{item}
测试代码
public static voidmain(String[] args) {
SqlSession session= null;try{
InputStream inputStream= Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory= newSqlSessionFactoryBuilder().build(inputStream);
session=sqlSessionFactory.openSession();
MyUserMapper mapper= session.getMapper(MyUserMapper.class);
Map ids = new HashMap<>(10);
ids.put("ids",Arrays.asList(7,8,9,10));
ids.put("b",8);
System.out.println(mapper.selectMyUserByArray(ids));
}catch(IOException e) {
e.printStackTrace();
}finally{if (session != null) {
session.close();
}
}
}
List 入参
select * from myuser where id in#{item}
Array 入参
select * from myuser#{item}
七、内置参数
select * from myuserwhere id = #{_parameter}
select * from oracle_myuserwhere name = #{_parameter.name}
八、BIND
select * from myuser where name like #{name}
例 SQL 映射想变为模糊查询有几种方式
1.传入参数时加上 %
2.改用 ${name} 来取值。name 取值会报错,用 _parameter 取值
select * from myuser where name like '%${_parameter}%'
3.使用 bind 标签
select * from myuser where name like #{_name}
九、SQL 复用
${id},name,age
xxx,xxx,xxx
select
from myuser where name like #{name}
可以使用其他语言来写动态 SQL:MyBatis-Velocity、MyBatis-FreeMarker 和自带的 XML