mybatis执行任意SQL问题

 更新时间:2026年05月18日 08:39:29   作者:continentlu  
文章主要介绍了使用MyBatis执行任意SQL的方法,包括声明接口、使用注解调用等步骤,并提到尝试使用泛型进行结果集处理时遇到的问题,最后给出一种改进后的解决方案

mybatis执行任意SQL

一、用一个方法可灵活方便执任意自定义SQL

不需要在XML或接口中声明,以下是实现,采用注解,XML没测试,应该类似。

1、声明一个接口,里面包括一个超级SQL方法

public interface SqlDao{
	@Select("${sql}")
    List<LinkedHashMap<String,Object>> 	sql(String sql,@Param("param") Map<String,Object> param);
}

2、调用

Map<String,Object>  params = new HashMap<>();
//这里可加任意多参数,与SQL中对应
params.put("id","xxx");
List<LinkedHashMap<String,Object>> result = medicineboxDao.sql("select * from DevLog where id =#{param.id}",params);

二、进一步改进时发现怪异的现象

因尝试采用泛型作为结果转型 ,这样在查询后通过泛型定义可获得具体的类型 ,可是结果却出人意料,但又不报错,希望有高手能指点下。代码如下

1、先改造上面的接口方法为泛型。

public interface SqlDao{
 @Select("${sql}")
 	<S> List<S> sql2(String sql,@Param("param") Map<String,Object> param);
 }
   
//调用
List<DevLog> o2 = medicineboxDao.sql2("select * from DevLog where id =#{param.id}",params); 

执行不报错,但获得的结果却是结果集有多个时只有一条数据,并且只有第一个字段的值。

当尝试获得集合里面的类时,报类转换异常。

//System.out.println(o2.get(0).getClass());当获得结果的CLASS对象时,报错了

没有跟进MYBATIS相关的源码,猜测是数据转换方面没有识别好。

三、继续改进,实现泛型转换

改造接口为如下:

 @Select({"${sql}"})
    default <S> List<S> sqlFromObject(String sql,@Param("param") Map<String,Object> param,Class<S> sc){
        final List<S> lis = new ArrayList<>();
        this.generalSql(sql, param, (ResultHandler<S>) resultContext -> {
            try {
                S s = sc.newInstance();
                //采用cglib BeanCopier,性能强劲
               //bean map拷贝
                BeanMap beanMap = BeanMap.create(s);
                beanMap.putAll((Map)resultContext.getResultObject());
                lis.add(s);
            } catch (Exception e) {
                e.printStackTrace();
            }
        });
        return lis;
    };

    @Select({"${sql}"})
    @ResultType(LinkedHashMap.class)
    <S> void generalSql(String sql, @Param("param") Map<String,Object> param, ResultHandler<S> handler) ;

然后调用:

 List<DevLog> o2 = medicineboxDao.sqlFromObject("select * from DevLog where id <>#{param.id}",params,DevLog.class);

还算完美吧!!

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • IDEA设置字体随鼠标滚动放大缩小的实现

    IDEA设置字体随鼠标滚动放大缩小的实现

    这篇文章主要介绍了IDEA设置字体随鼠标滚动放大缩小的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • Java代码中如何设置输出字符集为UTF-8

    Java代码中如何设置输出字符集为UTF-8

    这篇文章主要介绍了Java代码中设置输出字符集为UTF-8,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-05-05
  • SpringBoot两种方式接入DeepSeek的实现

    SpringBoot两种方式接入DeepSeek的实现

    本文主要介绍了SpringBoot两种方式接入DeepSeek的实现,包括HttpClient方式和基于spring-ai-openai的方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-03-03
  • 深入介绍Spring框架及故障排除

    深入介绍Spring框架及故障排除

    这篇文章主要介绍了深入介绍Spring框架及故障排除,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感兴趣的小伙伴可以参考一下
    2022-06-06
  • 从零开始:快速入门SpringBoot注解的精髓

    从零开始:快速入门SpringBoot注解的精髓

    Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架,它通过使用注解来简化配置和开发过程,使开发人员能够更加专注于业务逻辑的实现,Spring Boot提供了许多注解,用于定义和配置应用程序的各个方面,需要的朋友可以参考下
    2023-10-10
  • 在Java中将jsonObject转换成对象的实现方法

    在Java中将jsonObject转换成对象的实现方法

    在现代的Web开发中,JSON作为一种轻量级的数据交换格式,因其易读性和易于解析的特点而被广泛使用,本文将介绍如何在Java中将​​jsonObject​​转换成Java对象,主要通过使用Gson库来实现这一功能,需要的朋友可以参考下
    2025-04-04
  • IDEA的下载和使用安装详细图文教程

    IDEA的下载和使用安装详细图文教程

    这篇文章主要介绍了IDEA的下载和使用安装,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • 浅谈Maven resrouce下filtering作用

    浅谈Maven resrouce下filtering作用

    Filtering是Maven Resources Plugin的一个功能,本文主要介绍了浅谈Maven resrouce下filtering作用,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • Spring Boot @Conditional注解使用示例详解

    Spring Boot @Conditional注解使用示例详解

    在SpringBoot中,@Conditional注解用于条件性地注册bean,根据某些条件决定是否创建特定bean,可以实现Condition接口并重写matches方法来定义条件,本文介绍Spring Boot @Conditional注解的相关知识,感兴趣的朋友一起看看吧
    2024-12-12
  • SpringBoot项目离线环境手动构建的过程

    SpringBoot项目离线环境手动构建的过程

    文章介绍了如何在IntelliJ IDEA中手动创建一个Spring Boot项目,并详细讲解了pom.xml文件的配置和基本项目结构的设置,感兴趣的朋友跟随小编一起看看吧
    2025-01-01

最新评论