オブジェクトの永続化に mybatis を使用するアプリケーションがあります。しかし、(ユーザーから) 任意の sql を実行する必要がある可能性があります。mybatisでできますか?
アップデート:
ユーザー定義の SQL を実行するために dbutils (JDBC) を使用することにしましたが、QueryRunner を作成するには DataSource のインスタンスが必要です。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);
}
あなたの質問は、mybatis を使用して Java コードから直接クエリを実行する方法に似ていますか?
私はすでにその質問に対する答えを与えました。しかし、この解決策があなたに役立つことを願っています。
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;
} }
クラス SQLAdapter の typeAlias を作成します
<typeAlias alias="sqladapter" type="com.zj.xxx.xxx.SQLAdapter" />
SQLを直接実行する必要がある各オブジェクトxmlに選択タグを配置します。
<select id="findRecords" parameterType="SQLAdapter" resultMap="xxxxxResultMap">
${sql}
</select>
このselectメソッドを次のように呼び出します
String _sql = "select * from table where... order by... limit..."; xxxxx.findRecords(new SQLAdapter(_sql));
SQL の再利用可能なフラグメントを使用して、クエリの選択部分を動的に作成できます。マッパーでは、クエリを通常のパラメーターとして渡します。
@Param("sql")String sql
クエリでは、 #{sql }の代わりに${sql}を使用してパラメーターにアクセスするだけです。パラメータ sql の値は、完全に有効な sql クエリまたは sql クエリのフラグメントにすることができます。