我有一个使用mybatis进行对象持久化的应用程序。但是我有机会运行任意的sql(来自用户)。我可以用mybatis做吗?
更新:
我选择使用dbutils(JDBC)来运行用户定义的sql,但我需要一个DataSource实例来创建QueryRunner。有什么方法可以从mybatis获取数据源吗?
我用这个实用类:
import java.util.List;
import org.apache.ibatis.annotations.SelectProvider;
public interface SqlMapper {
static class PureSqlProvider {
public String sql(String sql) {
return sql;
}
public String count(String from) {
return "SELECT count(*) FROM " + from;
}
}
@SelectProvider(type = PureSqlProvider.class, method = "sql")
public List<?> select(String sql);
@SelectProvider(type = PureSqlProvider.class, method = "count")
public Integer count(String from);
@SelectProvider(type = PureSqlProvider.class, method = "sql")
public Integer execute(String query);
}
你的问题类似于How to exequte query directly from java code using mybatis?的问题
我已经给出了这个问题的答案。但我希望这个解决方案可以帮到你。
Mybatis已有此功能,但您必须按如下方式使用适配器。
public class SQLAdapter {
String sql;
public SQLAdapter(String sql) {
this.sql = sql;
}
public String getSql() {
return sql;
}
public void setSql(String sql) {
this.sql = sql;
} }
<typeAlias alias="sqladapter" type="com.zj.xxx.xxx.SQLAdapter" />
<select id="findRecords" parameterType="SQLAdapter" resultMap="xxxxxResultMap">
${sql}
</select>
String _sql = "select * from table where... order by... limit..."; xxxxx.findRecords(new SQLAdapter(_sql));
根据提供的答案,他们都很好。但是他们都需要使用Adapter
类。
使用Mybatis版本3,我成功使用HashMap<String, String>
来保存并传递SQL。
请参阅以下代码。
在Mapper
班
final String sql = "${sql}";
@Select(sql)
void execute(HashMap<String, String> m);
调用方法时:
String sql = "SELECT * FROM record limit 1";
HashMap<String, String> map = new HashMap<String, String>();
map.put("sql", sql);
mapper.execute(map);
HashMap
提供了一种不必定义类属性或代码中的字段的方法,您可以使用Map来重新定义它。
谢谢。
可重用的SQL片段可用于动态创建查询的选择部分。在您的映射器传递查询作为正常参数:
@Param("sql")String sql
在您的查询中,只需使用$ {sql}而不是#{sql}访问参数。参数sql中的值可以是完全有效的sql查询或sql查询的片段。