MyBatis 3.1.1,如何直接执行自定义SQL代码
MyBatis 3.1.1, how to execute custom SQL code directly
我使用 PostrgeSQL 9.6 和 MyBatis 3.1(下面还有 Java 8 和 Spring),我需要执行一个自定义查询,我动态创建的一个 StringBuilder 因为它很复杂。
如何将其传递到我的 class mapper.xml 文件?
我听说过@SelectProvider,但是?找不到完整的示例...有人可以给我一步一步的指导吗?
我也在阅读 MyBatis 的 SQL Builder Class,在 the official guide 之后,但我想念如何启动我创建的 query/object。顺便说一句,这对我来说似乎不是正确的方法,因为我必须构建的查询很复杂。按照指南,我似乎无法使用 IF 或 FOR 等条件运算符来创建查询字符串...因此它无法供我使用。
谢谢。
我只将@SelectProvider 用于java 注释,这是一种简单的使用方法,
这是我今年早些时候的简单示例
1。创建您的提供商 class
package com.mybatis;
import java.util.Map;
import java.util.logging.Logger;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.jdbc.SQL;
public class SqlProvider {
public String sqlProvider(Map<String, Object> map){
Logger.getLogger(SqlProvider.class.getName()).info("select * from student where id="+map.get("0"));
return "select * from student where id="+map.get("0");
}
public String findById(@Param("id") int id){
return new SQL(){{
SELECT("id,name,info");
FROM("student");
WHERE("id="+id);
}
}.toString();
}
}
您可以使用字符串生成您的 sql 查询,也可以使用新的 SQL(){{ 一些子句,例如 SELECT(string),WHERE(string) 等。
}}.toString();
2。在 Mapper 接口
中使用您的提供商 class
我们可以使用@SelectProvider(type=Class,method="methodName")
指定 class 和方法
package com.mybatis;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Options;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.SelectProvider;
import org.apache.ibatis.annotations.Update;
/*
*
*Stu is an entity map to your table in db
*
*/
@Mapper
public interface StuMapper {
@SelectProvider(type=SqlProvider.class,method="sqlProvider")
public Stus sqlProvider(Map<String, Object> map);
@SelectProvider(type=SqlProvider.class,method="findById")
public Stus findById_(@Param("id") int id);
}
最后,使用映射器。
尤其是 第 4 章
<select id="methodName" resultMap="alarmPieEntry">
${your_raw_sql}
</select>
只需在 myClass_mapper.xml
文件中使用 ${your_raw_sql}
变量,不要 use #{your_raw_sql}
。
我使用 PostrgeSQL 9.6 和 MyBatis 3.1(下面还有 Java 8 和 Spring),我需要执行一个自定义查询,我动态创建的一个 StringBuilder 因为它很复杂。
如何将其传递到我的 class mapper.xml 文件?
我听说过@SelectProvider,但是?找不到完整的示例...有人可以给我一步一步的指导吗?
我也在阅读 MyBatis 的 SQL Builder Class,在 the official guide 之后,但我想念如何启动我创建的 query/object。顺便说一句,这对我来说似乎不是正确的方法,因为我必须构建的查询很复杂。按照指南,我似乎无法使用 IF 或 FOR 等条件运算符来创建查询字符串...因此它无法供我使用。
谢谢。
我只将@SelectProvider 用于java 注释,这是一种简单的使用方法, 这是我今年早些时候的简单示例
1。创建您的提供商 class
package com.mybatis;
import java.util.Map;
import java.util.logging.Logger;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.jdbc.SQL;
public class SqlProvider {
public String sqlProvider(Map<String, Object> map){
Logger.getLogger(SqlProvider.class.getName()).info("select * from student where id="+map.get("0"));
return "select * from student where id="+map.get("0");
}
public String findById(@Param("id") int id){
return new SQL(){{
SELECT("id,name,info");
FROM("student");
WHERE("id="+id);
}
}.toString();
}
}
您可以使用字符串生成您的 sql 查询,也可以使用新的 SQL(){{ 一些子句,例如 SELECT(string),WHERE(string) 等。 }}.toString();
2。在 Mapper 接口
中使用您的提供商 class我们可以使用@SelectProvider(type=Class,method="methodName") 指定 class 和方法
package com.mybatis;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Options;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.SelectProvider;
import org.apache.ibatis.annotations.Update;
/*
*
*Stu is an entity map to your table in db
*
*/
@Mapper
public interface StuMapper {
@SelectProvider(type=SqlProvider.class,method="sqlProvider")
public Stus sqlProvider(Map<String, Object> map);
@SelectProvider(type=SqlProvider.class,method="findById")
public Stus findById_(@Param("id") int id);
}
最后,使用映射器。
尤其是 第 4 章
<select id="methodName" resultMap="alarmPieEntry">
${your_raw_sql}
</select>
只需在 myClass_mapper.xml
文件中使用 ${your_raw_sql}
变量,不要 use #{your_raw_sql}
。