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);

还算完美吧!!

总结

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

相关文章

  • List调用toString()方法后,去除两头的中括号实例

    List调用toString()方法后,去除两头的中括号实例

    下面小编就为大家带来一篇List调用toString()方法后,去除两头的中括号实例。希望对大家有所帮助。一起跟随小编过来看看吧
    2017-03-03
  • 详解Spring中使用@within与@target的区别

    详解Spring中使用@within与@target的区别

    这篇文章主要介绍了Spring中使用@within与@target的一些区别,本文通过项目案例给大家详细分析,给大家介绍的非常详细,代码简单易懂,需要的朋友可以参考下
    2021-09-09
  • java打成jar后,获取resources下的文件资源问题及解决

    java打成jar后,获取resources下的文件资源问题及解决

    作者在写代码时遇到一个问题:在将项目打包成jar包后,无法通过常规方式获取resources文件夹下的资源,通过分析原因,作者找到了一种新的解决方案,即通过类加载器获取jar包内的资源,此方式返回后的资源以文件流的形式返回,作者将其转换为了byte[]的形式使用
    2026-05-05
  • 在CentOS系统中检测Java安装及运行jar应用的方法

    在CentOS系统中检测Java安装及运行jar应用的方法

    这篇文章主要介绍了在CentOS系统中检测Java安装及运行jar应用的方法,同样适用于Fedora等其他RedHat系的Linux系统,需要的朋友可以参考下
    2015-06-06
  • Java实现汽车租赁系统

    Java实现汽车租赁系统

    这篇文章介绍了Java实现汽车租赁系统的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • Java动态代理简单介绍

    Java动态代理简单介绍

    动态代理指的是,代理类和目标类的关系在程序运行的时候确定的,客户通过代理类来调用目标对象的方法,是在程序运行时根据需要动态的创建目标类的代理对象。本文将通过案例详细讲解一下Java动态代理的原理及实现,需要的可以参考一下
    2022-08-08
  • 学会CompletableFuture轻松驾驭异步编程

    学会CompletableFuture轻松驾驭异步编程

    这篇文章主要为大家介绍了CompletableFuture轻松驾驭异步编程教程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • java常见的序列化方式

    java常见的序列化方式

    这篇文章主要为大家详细介绍了java中两种常见的序列化方式,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • Java中File文件操作类的超详细使用教程

    Java中File文件操作类的超详细使用教程

    File类在包java.io.File下、代表操作系统的文件对象(文件、文件夹),File类提供了诸如:定位文件,获取文件本身的信息、删除文件、创建文件(文件夹)等功能,下面这篇文章主要给大家介绍了关于Java中File文件操作类的超详细使用教程,需要的朋友可以参考下
    2023-01-01
  • Java对象转换的实现方式汇总

    Java对象转换的实现方式汇总

    这篇文章主要介绍了Java对象转换的多种实现方式,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2025-04-04

最新评论