mybatis 映射文件中,if 标签判断字符串相等
两种方式:因为 mybatis 映射文件,是使用的 ognl 表达式,所以在判断字符串 sex 变量是否是字符串 Y 的时候使用
或者
将自己的 sql 改为:
<if test="companyId != null and companyId !='' ">
<if test="companyFlag == '1'.toString() ">
AND COMPANY_ID = `#{companyId,jdbcType=VARCHAR}`
if>
<if test="companyFlag == '0'.toString() ">
AND COMPANY_ID != `#{companyId,jdbcType=VARCHAR}`
if>
if>
再次调用 sql,则条件正常可用了。
参数 list 时,先判断是否为空,否则会报错
<if test='list != null and list.size()>0'>
AND purchase_id IN (229, 159)
if>
遍历
insert into redeem_code
(bach_id, code, type, facevalue,create_user,create_time)
values
(
`#{reddemCode.batchId}, #{reddemCode.code}` ,
`#{reddemCode.type}` ,
`#{reddemCode.facevalue},`
`#{reddemCode.createUser}, #{reddemCode.createTime}`
)
foreach >
insert >
<select id="testWhere" parameterType="Map"
resultMap="UserInfoResult">
select * from userinfo
<where>
<if test="department!=null">
department like `#{department}`
if>
<if test="gender!=null">
AND gender= `#{gender}`
if>
<if test="position!=null">
AND position like `#{position}`
if>
where>
select>
标签
标签内的 AND 应该不写,但是,就算开发中书写也不会报错。
标签内,必须有 AND 链接。where 1=1
之后加条件有时候需要简单地把一个 Map 中所有的 key 和 value 获取出来,拼到 sql 语句中。MyBatis 提供的一种方法是遍历 Map 中的 entrySet,然后把 key 扔进 index 里面,value 扔进 item 中。具体的一个使用的例子如下:
<insert id="operationName" parameterType="map">
INSERT INTO table_name(hot_word, cnt)
VALUES
<foreach item="value" index="key" collection="mapData.entrySet()" open="(" separator="),(" close=")">
`#{key}, #{value}`
foreach>
ON DUPLICATE KEY UPDATE
cnt=VALUES(cnt)
insert>
通过里面的 id 标签和 result 标签来建立映射关系,由 property 和 column 分别指定实体类属性和数据表的列名。
><
等特殊符号特殊字符
xml 中表示:
<= 小于等于
> = 大于等于
需加标记:
xml中有 & 的符号,需要这样表示&
<= 小于等于 :
> = 大于等于:= ]]>
CDATA 区
它的全称为 character data, 以 开始,以
]]>
结束,在两者之间嵌入不想被解析程序解析的原始数据,解析器不对 CDATA 区中的内容进行解析,而是将这些数据原封不动地交给下游程序处理。
一些特殊字符也可用下面的替代符号所代替。
特殊字符 替代符号
& &
< <
> >
" "
' '
ON DUPLICATE KEY UPDATE
sale_cost= VALUES(sale_cost),
amount = VALUES(amount),
user_id = VALUES(user_id);
<insert id="insertAndGetId" useGeneratedKeys="true" keyProperty="userId" parameterType="com.chenzhou.mybatis.User">
insert into user(userName,password,comment)
`values( #{userName},#{password},#{comment} ) `
insert>
缺包:
<properties>
<mybatis-plus.vision>3.1.2mybatis-plus.vision>
properties>
<dependency>
<groupId>com.baomidougroupId>
<artifactId>mybatis-plus-coreartifactId>
<version>${mybatis-plus.vision}version>
<scope>compilescope>
dependency>
<dependency>
<groupId>com.baomidougroupId>
<artifactId>mybatis-plus-boot-starterartifactId>
<version>${mybatis-plus.vision}version>
dependency>
### Cause: java.lang.IndexOutOfBoundsException: Index: 4, Size: 4
at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:77)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:446)
at com.sun.proxy.$Proxy203.selectList(Unknown Source)
at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:230)
解决
返回实体增加构造方法,增加lombok注解或者是直接添加无参构造方法
@AllArgsConstructor
@NoArgsConstructor
关键代码
<if test="devIds != null and devIds != ''">
and EXISTS (select 1 from
(SELECT regexp_split_to_table(#{devIds},',') AS dev_id) AS vir where cast(vir.dev_id as BIGINT) = sd.id)
if>
如果你不但需要传入map作为参数去sql中遍历,还需要传入别的参数
1,首先,传入map的遍历方式
把要传入的map转换为如下的形式
Map> map = new HashMap<>();
mabatis遍历中
sql语句
2,map的解决了,那么其他的参数怎么获取呢?我是这么解决的
仿照1的做法,把其他的参数也放到map中
Map map = new HashMap<>();
map.put("参数名","参数值");
再把这个map也添加到1中的大map中去,取值的时候也需要用foreach的方式取值,
3,坑点
注意在一个sql中,两个foreach的 item 和 index 的变量名,不要一样,一样的话会报下面的错
source is null for getProperty(null, "name")
sql语句
sql语句
前言
mybatis 有默认的 list,array,但是没有默认的 map。所以不能直接写 collection=“map”,如果这么写,它会当成是根据 map.get(“map”)来取 value 值,大部分情况下是一个 map 中是不会有 “map” 这个 key 的,于是就是报错。如果你想用这个 “map” 标识取参数 map,就需要保证传入的 Map 参数有 @Param(“map”)注解。
mybatis 入参 map 的基本语法:
service,dao 的写法:
//service:
public List<BpmDefUser> getByMap(Map<String,List<Long>> map){
Map<String,Object> paramsMap= new HashMap<String, Object>();
params.put("paramsMap", map);
return this.getByMap(paramsMap);
}
//dao:
int getByMap(Map<String,Object> map)
//service:
public List<BpmDefUser> getByMap(Map<String,List<Long>> map){
Map<String,Object> paramsMap= new HashMap<String, Object>();
params.put("paramsMap", map);
return this.getByMap(paramsMap);
}
//dao:
int getByMap(Map<String,Object> map)
或者(推荐):
//service直接调用dao
int getByMap(@param("paramsMap") Map<String,Object> map)
//service直接调用dao
int getByMap(@param("paramsMap") Map<String,Object> map)
xml 的写法:
<foreach collection="paramsMap.keys" item="k" separator="and">
`${k} = #{k} `
foreach>
<foreach collection="paramsMap.keys" item="k" separator="and">
` ${k} = #{k} `
foreach>
<foreach collection="paramsMap.values" item="v" separator="and">
` ${v} = #{v} `
foreach>
<foreach collection="paramsMap.values" item="v" separator="and">
` ${v} = #{v} `
foreach>
<foreach collection="paramsMap.keys" item="k" separator="and">
<if test="null != paramsMap[k]">
` ${k} = ${paramsMap[k]} `
if>
foreach>
<foreach collection="paramsMap.keys" item="k" separator="and">
<if test="null != paramsMap[k]">
` ${k} = ${paramsMap[k]} `
if>
foreach>
<foreach collection="paramsMap" index="key" item="value">
` ${key} = ${value}`
foreach>
<foreach collection="paramsMap" index="key" item="value">
` ${key} = ${value}`
foreach>
易错点:表达式抒写错误
通常我们设置值的时候,会以 #{}
的方式,而不是 ${}
,如下:
<foreach collection="paramsMap.keys" item="k" separator=",">
<if test="null != paramsMap[k]">
`${k} = `#{paramsMap[k]}` `
if>
foreach>
<foreach collection="paramsMap.keys" item="k" separator=",">
<if test="null != paramsMap[k]">
` ${k} = #{paramsMap[k]}`
if>
foreach>
你会发现,取不了值了,${condition[k]}
能取的出值,但 #{condition[k]}
取出来的值却实 null,正确的写法应该是:
<foreach collection="paramsMap.keys" item="k" separator=",">
<if test="null != paramsMap[k]">
`${k} = `#{paramsMap[${k}]}` `
if>
foreach>
<foreach collection="paramsMap.keys" item="k" separator=",">
<if test="null != paramsMap[k]">
`${k} = `#{paramsMap[${k}]}` `
if>
foreach>
假如参数类型是这么一个类型结构:Map map = new HashMap
我想要拼装出来的 sql 如下:
select * from 表名
where (
(id = 1 and name in ('小二','小三','小四') or
(id = 2 and name in ('小二','小三','赵六') or
(id = 3 and name in ('小三','王五','王八') or
……
)
select * from 表名
where (
(id = 1 and name in ('小二','小三','小四') or
(id = 2 and name in ('小二','小三','赵六') or
(id = 3 and name in ('小三','王五','王八') or
……
)
mybatis 应该怎么写?
第一种写法:
SELECT * FROM 表名
WHERE
<foreach collection="paramsMap.keys" item="key" open="(" separator="OR" close=")">
(id = `#{key}` AND name in
`#{name}`
foreach>
)
foreach>
SELECT * FROM 表名
WHERE
<foreach collection="paramsMap.keys" item="key" open="(" separator="OR" close=")">
(id = `#{key}` AND name in
`#{name}`
foreach>
)
foreach>
第二种写法(推荐):
SELECT * FROM 表名
WHERE
<foreach collection="paramsMap" index="key" item="value" open="(" separator="OR" close=")">
(id = `#{key}` AND name in
`#{name}`
foreach>
)
foreach>
SELECT * FROM 表名
WHERE
<foreach collection="paramsMap" index="key" item="value" open="(" separator="OR" close=")">
(id = `#{key}` AND name in
`#{name}`
foreach>
)
foreach>