MyBatis提取带参数的SQL语句

本文参照了https://blog.csdn.net/wooden_people/article/details/90676121中的参数拼接方法

工具类:



import com.tydic.common.utils.DateUtils;
import org.apache.commons.beanutils.BeanMap;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.mapping.ParameterMapping;
import org.apache.ibatis.mapping.ParameterMode;
import org.apache.ibatis.session.SqlSessionFactory;

import java.sql.Timestamp;
import java.util.*;

public class MyBatisSqlUtils {

    public static String execute(String sqlId, Object object, SqlSessionFactory sqlSessionFactory) {
        BoundSql boundSql = sqlSessionFactory.getConfiguration().getMappedStatement(sqlId).getBoundSql(object);
        List<ParameterMapping> parameterMappings = boundSql.getParameterMappings();
        String sql = boundSql.getSql();
        Map<?, Object> paramMap = new BeanMap(object);
        List<Object> paramValues = getParamValues(paramMap, parameterMappings);
        String execSql = getExecuteSql(sql, paramValues);
        execSql = execSql.replace("\n","").replaceAll("[ ]+"," ");
        return execSql;
    }

    /**
     * 设置查询参数值,返回可直接执行的sql
     */
    private static String getExecuteSql(String sql, List<Object> paramValues) {
        while (sql.indexOf("?") != -1 && paramValues != null && paramValues.size() > 0 && paramValues.get(0) != null) {
            Object paramValue = paramValues.get(0);
            if (paramValue != null) {
                String value = paramValue.toString();
                if (paramValue instanceof String) {
                    value = "'" + paramValue.toString() + "'";
                } else if (paramValue instanceof Date || paramValue instanceof Timestamp) {
                    value = DateUtils.parseDateToStr("yyyy-MM-dd HH:mm:ss", (Date) paramValue);
                    value = "str_to_date('" + value + "','%Y-%m-%d %T')";
                }
                sql = sql.replaceFirst("\\?", value);
                paramValues.remove(0);
            }
        }

        return sql;
    }

    /**
     * 根据动态查询条件获取查询参数值
     */
    private static List<Object> getParamValues(Map<?, Object> paramMap,
                                               List<ParameterMapping> parameterMappings) {
        if (parameterMappings == null) {
            return new ArrayList<Object>();
        }
        List<Object> paramValues = new ArrayList<Object>();
        for (ParameterMapping pm : parameterMappings) {
            if (pm.getMode() != ParameterMode.OUT) {
                String paramName = pm.getProperty();
                Object paramValue = paramMap.get(paramName);
                paramValues.add(paramValue);
            }
        }
        return paramValues;
    }


    /**
     * 初始化查询参数
     */
    private static Map<String, Object> initParamMap(Object[] args) {
        Map<String, Object> paramMap = new HashMap<String, Object>();
        for (Object obj : args) {
            if (obj instanceof Map) {
                paramMap = (Map<String, Object>) obj;
            }
        }
        return paramMap;
    }
}

调用方式Demo:

    @Override
    public Long trialGroup(final DlUserMonth dlUserMonth, CustGroupInfo groupInfo) {
        String statement = "com.tydic.zhApplication.mapper.DlUserMonthMapper.selectDlUserMonthList";
        String sql = "";
        try{
            sql = MyBatisSqlUtils.execute(statement,dlUserMonth,sqlSessionFactory);
        }catch (Exception e){
            e.printStackTrace();
            throw new BusinessException("MyBatis获取sql异常",e);
        }
//		custGroupInfoMapper.trialGroup();
        return 0L;
    }

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
回答: 在Spring Boot的Mapper中,可以通过使用@Param注解来传递参数。在方法的参数列表中,使用@Param注解来指定参数的名称,然后在SQL语句中使用${参数名}的方式来引用参数。需要注意的是,如果使用了MyBatis-Plus的版本大于等于3.0.7,参数名要么叫ew,要么加上注解@Param(Constants.WRAPPER)。另外,需要注意的是,不支持在Wrapper内的entity生成where语句。以下是一个示例代码: @Repository public interface DiaryMapper extends BaseMapper<Diary> { @Select("SELECT user.name \n" + "FROM USER \n" + "WHERE user.id= ${id};") List<DiaryDTO> diaryUserDto(@Param("id")int id); } 在上述代码中,使用@Param注解来指定参数id的名称,并在SQL语句中使用${id}来引用该参数。这样就可以在Mapper中传递参数了。同时,需要在配置文件中指定mapper文件的位置,可以通过配置mapper-locations来指定mapper文件的路径。另外,还可以通过配置map-underscore-to-camel-case来开启驼峰命名规则,将数据库字段的下划线转换为驼峰命名规则。 #### 引用[.reference_title] - *1* [如何快速提取mybatis mapper里的sql语句](https://blog.csdn.net/lsx6766/article/details/103045866)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Mybatis-plus自定义sql以及传参+springboot补充](https://blog.csdn.net/qq_45580642/article/details/118877002)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [springboot中controller层接收参数,servers层调用mapper层,一条sql搞定排序](https://blog.csdn.net/weixin_42274846/article/details/128460723)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值