mybatis根据指定要求查询:
<select id="queryList" parameterType="xxx.ListDto" resultType="xxx.InfoVo">
SELECT
sb.id,
sb.solutionName,
sb.advertiserId,
sb.campaignId,
sb.mediaPlatformId,
sb.startTime,
sb.endTime,
sb.budget,
sr.metricOrderAmount,
sr.day
FROM
xxx_base sb
LEFT OUTER JOIN xxx_report sr ON sb.ID = sr.SolutionId AND sr.DAY = CURRENT_DATE
WHERE sb.advertiserId=#{advertiserId}
and sb.mediaPlatformId=0
<if test="campaignId!=null">
and sb.campaignId=#{campaignId}
</if>
<if test="keyword!=null and keyword!='' ">
and (sb.id=#{keyword} or sb.solutionName like CONCAT('%',#{keyword},'%'))
</if>
<if test="solutionStatus!=null">
<if test="solutionStatus==0">
and sb.status in (0,1)
</if>
<if test="solutionStatus==1">
and sb.status = 0
</if>
<if test="solutionStatus==2">
and sb.status = 1
</if>
<if test="solutionStatus==3">
and sb.status = 2
</if>
<if test="solutionStatus==4">
and sb.status = 3
</if>
</if>
<if test="startTime != null ">
<![CDATA[AND (DATE_FORMAT(sr.day, '%Y-%m-%d') >= DATE_FORMAT( #{startTime}, '%Y-%m-%d'))]]>
</if>
<if test="endTime != null ">
<![CDATA[AND (DATE_FORMAT(sr.day, '%Y-%m-%d') <= DATE_FORMAT( #{endTime}, '%Y-%m-%d'))]]>
</if>
<if test="sortType!=null">
<if test="sortType==1">
ORDER BY ${fieldName} ASC
</if>
<if test="sortType==2">
ORDER BY ${fieldName} DESC
</if>
<if test="sortType==3">
ORDER BY sb.CreateTime DESC
</if>
</if>
limit #{pageNum},#{pageSize}
</select>
备注:
入参ListDto:
@Data
@Accessors(chain = true)
public class ListDto implements Serializable {
private static final long serialVersionUID = -2197746901317929362L;
/**
* 计划ID
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long campaignId;
/**
* 搜索关键词
*/
private String keyword;
/**
* 字段排序<br>
* 根据某一个字段排序
*/
private String fieldName;
/**
* 升序降序:1 升 2 降 3 不排,默认值为3
* 情景一:不排
* sortType=3,fieldName=""
* 情景二:升序
* sortType=1,fieldName="solutionName"
* 情景三:降序
* sortType=2,fieldName="solutionName"
*/
@NotNull
@Range(min = 1, max = 3)
private Integer sortType = 3;
/**
* 单元状态<br>
* 可选值:0 - 所有非归档,1 - 启用,2 - 暂停,3 - 归档,4-投放结束,默认所有非归档
*/
@NotNull
@Range(min = 0, max = 4)
@JsonProperty("status")
private Integer solutionStatus = 0;
/**
* 页数
*/
@NotNull
@Min(1)
private Integer pageNum = 1;
/**
* 每页数量
*/
@NotNull
@Min(1)
private Integer pageSize = 10;
/**
* 平台类型<br>
* 可选值:0 - DSP,1 - JRTT,2 - GDT,3 -全部列表
*/
@NotNull
private Integer mediaPlatformId;
/**
* 查询报表开始日期
*/
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date startTime;
/**
* 查询报表结束日期
*/
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date endTime;
@Null
private String advertiserId;
}
备注:
1.mysql分页limit #{pageNum} #{pageSize},则在传入参数的时候需要计算好入参,则在service层中,pageNum=(pageNum-1)*pageSize;pageSize=pageSize
2."LEFT OUTER JOIN xxx_report sr ON sb.ID = sr.SolutionId AND sr.DAY = CURRENT_DATE"该关联是将第二张表的数据根据当前时间过滤查询然后跟第一张表左连接查询
3.根据名称模糊查询这里使用的方法是concat而不是${%keyword%},为什么不用${%keyword%}呢?是因为$有sql注入的问题,而#则没有sql注入问题
4."ORDER BY ${fieldName} ASC" 根据字段排序使用的是$而不是#,根据本地自测,使用#则会给排序字段自动添加双引号,则不会进行排序,而$则是用户输入什么就是什么,会进行排序
5.mysql根据指定时间格式排序过滤查询如:"<![CDATA[AND (DATE_FORMAT(sr.day, '%Y-%m-%d') >= DATE_FORMAT( #{startTime}, '%Y-%m-%d'))]]>"
6.业务要求:前端页面一个输入框"根据id或者名称查询",则mybatis实现:keyword是前端输入的值
"<if test="keyword!=null and keyword!='' ">
and (sb.id=#{keyword} or sb.solutionName like CONCAT('%',#{keyword},'%'))
</if>"
2.mybatis replace into的用法: