案例如下图所示:
实现 根据 登录名 姓名 邮箱 查询
一. 以下代码用 姓名 地址 模糊查询xml代码如下
<select id="queryClientList" resultType="com.lt.crm.vo.QueryClient.QueryDeliveryClientVo"> select a.CUSTOMERSNO "customersno", a.CUSTOMERSNAME "customersname", a.COMMUNITY "community", a.CUSTOMERSTEL "customerstel" from CRM_CUSTOMERS a <where> <if test="integratedQuery != null and integratedQuery != ''"> 1=1 and a.customersname like concat(concat('%',#{integratedQuery}),'%') or a.community like concat(concat('%',#{integratedQuery}),'%') </if> <if test="customersno != null and customersno != ''"> and a.customersno like '%'||#{customersno}||'%' </if> <if test="customersname != null and customersname != ''"> and a.customersname like '%'||#{customersname}||'%' </if> <if test="community != null and community != ''" > and a.community like '%'||#{community}||'%' </if> </where> </select>
二. 最重要的就是这一行:
<if test="integratedQuery != null and integratedQuery != ''"> 1=1 and a.customersname like concat(concat('%',#{integratedQuery}),'%') or a.community like concat(concat('%',#{integratedQuery}),'%') </if>
1. 动态sql中 where 1=1
1. where 1=1,因为它总是ture ,执行计划就会忽略这个条件,Oracle、MySQL 结果都一样。
2. 为了避免:条件A判断出错 或者 往条件A传值时,传了空值,导致sql报错。
3. where1=1不影响SQL性能,也不会导致索引失效。SQL优化器已经将where1=1过滤了。
2.解释:
1. a.customersname like concat(concat('%',#{integratedQuery}),'%') 这是查 名字
2. a.community like concat(concat('%',#{integratedQuery}),'%') 这是查 地址
3. 两个字段 写到 一个 if 里面 用关键函数 or 将 他们 关联
4. 定义一个 新的 字段 integratedQuery 这个字段是 前端给后端传值的字段
5. 对应的dao service serviceImpl实现层 controller 都加上 (integratedQuery) 这个字段
integratedQuery 这个字段 也要在我们的实体类里 定义 我用的是VO 我就写Vo类里 如下: