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);
还算完美吧!!
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
Spring Boot @Conditional注解使用示例详解
在SpringBoot中,@Conditional注解用于条件性地注册bean,根据某些条件决定是否创建特定bean,可以实现Condition接口并重写matches方法来定义条件,本文介绍Spring Boot @Conditional注解的相关知识,感兴趣的朋友一起看看吧2024-12-12


最新评论