13

オブジェクトの永続化に mybatis を使用するアプリケーションがあります。しかし、(ユーザーから) 任意の sql を実行する必要がある可能性があります。mybatisでできますか?

アップデート:

ユーザー定義の SQL を実行するために dbutils (JDBC) を使用することにしましたが、QueryRunner を作成するには DataSource のインスタンスが必要です。mybatis からデータソースを取得する方法はありますか?

4

5 に答える 5

15

私はこの実用的なクラスを使用します:

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);
}
于 2012-11-16T18:28:42.303 に答える
4

あなたの質問は、mybatis を使用して Java コードから直接クエリを実行する方法に似ていますか?

私はすでにその質問に対する答えを与えました。しかし、この解決策があなたに役立つことを願っています。

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. このselectメソッドを次のように呼び出します

String _sql = "select * from table where... order by... limit...";
xxxxx.findRecords(new SQLAdapter(_sql));
  1. 物事はすべて完了しました。xml ファイルに複雑な SQL 言語を記述することはできなくなりました。幸運を。
于 2014-10-11T02:30:33.430 に答える
1

SQL の再利用可能なフラグメントを使用して、クエリの選択部分を動的に作成できます。マッパーでは、クエリを通常のパラメーターとして渡します。

@Param("sql")String sql

クエリでは、 #{sql }の代わりに${sql}を使用してパラメーターにアクセスするだけです。パラメータ sql の値は、完全に有効な sql クエリまたは sql クエリのフラグメントにすることができます。

于 2017-12-18T10:24:00.853 に答える