如何用mybatis运行任意sql?

eri*_*223 9 java database mybatis

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

更新:

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

Ita*_*tto 11

我用这个实用类:

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);
}
Run Code Online (Sandbox Code Playgroud)


Ben*_*Ben 5

您的问题类似于How to execute query direct 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;  
     }   }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 创建 SQLAdapter 类的 typeAlias

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

  1. 在每个需要直接执行sql的对象xml中放置select标签。

     <select id="findRecords" parameterType="SQLAdapter" resultMap="xxxxxResultMap">  
         ${sql}  
     </select> 
    
    Run Code Online (Sandbox Code Playgroud)
  2. 调用这个选择方法就像

String _sql = "select * from table where... order by... limit...";
xxxxx.findRecords(new SQLAdapter(_sql));
Run Code Online (Sandbox Code Playgroud)
  1. 事情已经全部办完了。你不能再在xml文件中编写复杂的sql语言。祝你好运。