如何用mybatis运行任意sql?

问题描述 投票:7回答:4

我有一个使用mybatis进行对象持久化的应用程序。但是我有机会运行任意的sql(来自用户)。我可以用mybatis做吗?

更新:

我选择使用dbutils(JDBC)来运行用户定义的sql,但我需要一个DataSource实例来创建QueryRunner。有什么方法可以从mybatis获取数据源吗?

java database mybatis
4个回答
9
投票

我用这个实用类:

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

2
投票

你的问题类似于How to exequte query directly from java code using mybatis?的问题

我已经给出了这个问题的答案。但我希望这个解决方案可以帮到你。

Mybatis已有此功能,但您必须按如下方式使用适配器。

  1. 创建一个适配器类; 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; } }
  2. 创建类SQLAdapter的typeAlias

<typeAlias alias="sqladapter" type="com.zj.xxx.xxx.SQLAdapter" />

  1. 将select标记放在需要直接执行sql的每个对象xml中。 <select id="findRecords" parameterType="SQLAdapter" resultMap="xxxxxResultMap"> ${sql} </select>
  2. 称之为选择方法
String _sql = "select * from table where... order by... limit...";
xxxxx.findRecords(new SQLAdapter(_sql));
  1. 事情都已完成。你不能再在xml文件中编写复杂的sql语言。祝好运。

1
投票

根据提供的答案,他们都很好。但是他们都需要使用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来重新定义它。

谢谢。


0
投票

可重用的SQL片段可用于动态创建查询的选择部分。在您的映射器传递查询作为正常参数:

@Param("sql")String sql

在您的查询中,只需使用$ {sql}而不是#{sql}访问参数。参数sql中的值可以是完全有效的sql查询或sql查询的片段。

© www.soinside.com 2019 - 2024. All rights reserved.