java之MyBatis 选择生成器

bonelee 阅读:73 2023-09-07 20:43:31 评论:0

我正在尝试提出一个动态查询,并且根据我所做的研究,看起来我最好的选择是选择构建器,因为我想使用注释而不是 XML。

我有两个参数;我想传递给此查询生成器方法的列表和对象。我可以毫无问题地使用该对象,但无法从该方法访问列表。

这是我的映射器界面:

@SelectProvider(type = ProductProvider.class, method = "getProductByBrandByCategory") 
List<Product> getProductListByBrandByCategory(@Param("brandList") List<Brand> brandList, @Param("category") Category category); 

这是 ProductProvider 类上的 getProductByBrandByCategory 方法:

public String getProductByBrandByCategory(Map params) { 
    return new SQL() {{ 
        SELECT("*"); 
        FROM("product"); 
        WHERE("category_id = #{category.id}"); 
    }}.toString(); 
} 

基本上,我尝试遍历列表以根据列表中的元素添加和/或/where 语句。

有什么方法可以访问 brandList 元素吗?我的猜测是它是 Maps 参数的一部分,但不知道如何访问它。

提前致谢。

请您参考如下方法:

参见 this question例如如何获取集合中的参数。 引用问题的代码示例

public class CategoryDaoSelectProvider { 
public static String findByParentIdAndName(Map<String, Object> params) { 
    Long parentId = (Long)params.get("parentId");  // WHY IS THIS HERE??? 
 
    StringBuffer buffer = new StringBuffer(); 
    buffer.append("SELECT COUNT(id) FROM Category "); 
 
    if (parentId == null) { 
        buffer.append("WHERE parentId IS NULL "); 
    } else { 
        buffer.append("WHERE parentId = #{parentId} "); 
    } 
 
    buffer.append("AND LOWER(name) = LOWER(#{name}) "); 
 
    return buffer.toString(); 
} 

其他解决方案是

  • 你可以使用 MyBatis Velocity使用 Apache Velocity 脚本 生成动态 SQL 查询的语言。

  • 您还可以使用基于 XML 的映射器定义,它们非常适合您的情况

引用 offical documentation ,“映射器注释”部分

Java Annotations are unfortunately limited in their expressiveness and flexibility. Despite a lot of time spent in investigation, design and trials, the most powerful MyBatis mappings simply cannot be built with Annotations

根据我的商业经验,myBatis XML 配置工作得非常好(我们将 myBatis 与 Spring 一起使用)。数量样板代码是最少的——只有查询和 resultMaps。 XML 语法易于阅读,即使在 XML 标记中有一些逻辑(if、foreach 等)。基于注解的配置需要复杂的嵌套注解,即使是最简单的映射也不适合我。我们仍然有一些映射器的注释,但对于新代码,我更喜欢 XML。

IntelliJ IDEA 将映射器接口(interface)方法与 XML SQL 定义链接起来,因此导航很容易。


标签:MyBatis
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号