使用MyBatis表名变化的时候如何查询
问题:工作中需要对不同表里的数据进行处理,表名结构 当前日期_plat_event_log
1).SQL语句
使用子查询 但是查询结果无法作为表名(无法实现)
select * from (select concat((select CURDATE()+0),'_plat_event_log')) a;
结果如下
只有表名,mysql无法将我们构造的表名当成表名,具体原因不太明白,只能找替代方法,有哪位大佬知道可以透露一下,不胜感激
一条语句无法达到想要的效果,只能多条语句(可实现)
set @time = concat("select * from ",(select CURDATE()+0),'_plat_event_log');
prepare STML from @time;
execute STML;
2).mybatis注解
Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;
Mybatis在处理 时 , 就 是 把 {}时,就是把 时,就是把{}替换成变量的值。
使用$而不是#,来自网友原话
3).动态SQL
mapper
层添加查询方法 @Param("tableName") String tableName
传入表名
/**
* 查询申请列表 自己定义的 在OmsOrderReturnApplySqlProvider类中
*/
@SelectProvider(type=OmsOrderReturnApplySqlProvider.class, method="getSQL1TableName")
@Results({
@Result(column="id", property="id", jdbcType=JdbcType.BIGINT, id=true),
··· // 此次省略一堆映射字段
//收货地址表id
@Result(column="company_address_id", property="companyAddress",
one = @One(select="com.weikun.mall.provider.mapper.OmsCompanyAddressMapper.selectByPrimaryKey"))//多对一关系
})
List<OmsOrderReturnApply> getOrderReturnApplyList1TableName(
@Param("tableName") String tableName, //
@Param("queryParam") OmsReturnApplyQueryParam queryParam);
编写动态SQL
//得到OrderReturnApply的动态sql
public String getSQL1TableName(
String tableName,
OmsReturnApplyQueryParam queryParam){
SQL sql = new SQL();
sql.SELECT("id");
sql.SELECT("create_time");
sql.SELECT("member_username");
sql.SELECT("product_real_price");
sql.SELECT("product_count");
sql.SELECT("return_name");
sql.SELECT("status");
sql.SELECT("handle_time");
sql.FROM(tableName); // 非常好用
sql.WHERE(" 1 = 1");
if (queryParam.getId()!=null){
sql.AND().WHERE("id=#{queryParam.id}");
}
if (queryParam.getStatus()!=null){
sql.AND().WHERE("status=#{queryParam.status}");
}
if (queryParam.getHandleMan()!=null && queryParam.getHandleMan()!=""){
sql.AND().WHERE("handle_man=#{queryParam.handleMan}");
}
if (queryParam.getCreateTime()!=null && queryParam.getCreateTime()!=""){
sql.AND().WHERE("create_time like CONCAT(#{queryParam.createTime}, '%')");
}
if (queryParam.getHandleTime()!=null && queryParam.getHandleTime()!=""){
sql.AND().WHERE("handle_time like CONCAT(#{queryParam.handleTime}, '%')");
}
if (queryParam.getReceiverKeyword()!=null && queryParam.getReceiverKeyword()!=""){
sql.AND().WHERE("return_name like CONCAT(#{queryParam.receiverKeyword}, '%')");
sql.OR().WHERE("return_phone like CONCAT(#{queryParam.receiverKeyword}, '%')");
}
return sql.toString();
4).扩充 MyBatis条件查询
这样很不好,因为这里的代码都是生成的,每次生成改动就丢失了,可以改一下生成器以后按照这样生成就好了,MyBatis不支持,咱们自己想办法支持
把表名当成条件查询的参数
使用Criteria
时加入表名 查询里边直接get