我已经使用的MyBatis的对象持久化的应用程序。 但也有我需要运行(与用户)任意的SQL机会。 我可以用MyBatis的办呢?
更新:
我选择使用dbutils(JDBC)来运行用户定义的SQL,但我需要的数据源的一个实例来创建QueryRunner。 有没有什么办法可以从MyBatis的数据源获取?
我已经使用的MyBatis的对象持久化的应用程序。 但也有我需要运行(与用户)任意的SQL机会。 我可以用MyBatis的办呢?
更新:
我选择使用dbutils(JDBC)来运行用户定义的SQL,但我需要的数据源的一个实例来创建QueryRunner。 有没有什么办法可以从MyBatis的数据源获取?
我用这个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);
}
你的问题是类似的问题, 如何从Java代码中使用的MyBatis exequte查询?
我已经考虑到这个问题的答案。 但我希望这个解决方案将帮助你。
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>
这样调用选择方法
String _sql = "select * from table where... order by... limit..."; xxxxx.findRecords(new SQLAdapter(_sql));
根据所提供的答案,他们都是很好的。 但是,他们都需要一个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定义它。
谢谢。
SQL的可重复使用的片段可以被用于动态创建查询的选择部分。 在你映射器通过查询作为参数正常:
@Param("sql")String sql
在您的查询只访问通过参数$ {} SQL代替#{} SQL。 在参数SQL值可以是一个完全有效的SQL查询或SQL查询的片段。