如何运行与MyBatis的任意SQL?(How to run arbitrary sql with

2019-07-03 19:43发布

我已经使用的MyBatis的对象持久化的应用程序。 但也有我需要运行(与用户)任意的SQL机会。 我可以用MyBatis的办呢?

更新:

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

Answer 1:

我用这个utilitary类:

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


Answer 2:

你的问题是类似的问题, 如何从Java代码中使用的MyBatis exequte查询?

我已经考虑到这个问题的答案。 但我希望这个解决方案将帮助你。

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. 把选择的标签在你需要直接执行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语言。 祝好运。


Answer 3:

根据所提供的答案,他们都是很好的。 但是,他们都需要一个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规定,您不必在代码中定义的类属性,或字段的方式,你可以使用地图redomly定义它。

谢谢。



Answer 4:

SQL的可重复使用的片段可以被用于动态创建查询的选择部分。 在你映射器通过查询作为参数正常:

@Param("sql")String sql

在您的查询只访问通过参数$ {} SQL代替#{} SQL。 在参数SQL值可以是一个完全有效的SQL查询或SQL查询的片段。



文章来源: How to run arbitrary sql with mybatis?