java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > mybatis执行任意SQL

mybatis执行任意SQL问题

作者: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);

还算完美吧!!

总结

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

您可能感兴趣的文章:
阅读全文