MyBatis 使用 SQL 语句构建器

简介: MyBatis 使用 SQL 语句构建器

MyBatis 使用 SQL 语句构建器


问题


  • 面对代码中最痛苦的事情就是在 Java 代码中嵌入 SQL 语句。 这样做的目的通常是为了来动态生成SQL,否则可以将它放到外部文件或者存储过程中。正如我们已经看到的那样,MyBatis 在它的 XML映射特征中有很强大的SQL生成方案,但是有时候 Java 代码呢哦不创建SQL语句也是必要的。此时, MyBatis 的另外一个特征可以帮助到我们,来减少典型的添加加好,引号,新行,格式化问题和嵌入条件来处理多余的逗号或者AND 连接词之前。我们采用Java 来拼接SQL代码其实是非常差的设计, 比如:


String sql = "SELECT P.ID, P.USERNAME, P.PASSWORD, P.FULL_NAME, "
"P.LAST_NAME,P.CREATED_ON, P.UPDATED_ON " +
"FROM PERSON P, ACCOUNT A " +
"INNER JOIN DEPARTMENT D on D.ID = P.DEPARTMENT_ID " +
"INNER JOIN COMPANY C on D.COMPANY_ID = C.ID " +
"WHERE (P.ID = A.ID AND P.FIRST_NAME like ?) " +
"OR (P.LAST_NAME like ?) " +
"GROUP BY P.ID " +
"HAVING (P.LAST_NAME like ?) " +
"OR (P.FIRST_NAME like ?) " +
"ORDER BY P.ID, P.FULL_NAME";


解决方案


  • MyBatis 3 提供了方便的根据类来帮助解决该问题。使用SQL类, 简单地创建一个实例来调用方法生成SQL语句。上面示例中的问题采用SQL类来重写


private String selectPersonSql() {
   return new SQL() {{
    SELECT("P.ID, P.USERNAME, P.PASSWORD, P.FULL_NAME");
    SELECT("P.LAST_NAME, P.CREATED_ON, P.UPDATED_ON");
    FROM("PERSON P");
    FROM("ACCOUNT A");
    INNER_JOIN("DEPARTMENT D on D.ID = P.DEPARTMENT_ID");
    INNER_JOIN("COMPANY C on D.COMPANY_ID = C.ID");
    WHERE("P.ID = A.ID");
    WHERE("P.FIRST_NAME like ?");
    OR();
    WHERE("P.LAST_NAME like ?");
    GROUP_BY("P.ID");
    HAVING("P.LAST_NAME like ?");
    OR();
    HAVING("P.FIRST_NAME like ?");
    ORDER_BY("P.ID");
    ORDER_BY("P.FULL_NAME");
  }}.toString();
}


  • 这样做的好处是咱们不必担心偶然出现的 "AND" 关键字,或者在 "WHERE" 和 "AND" 之间的选择,抑或者什么都不用选。它已经帮我们完美的解决了。


SQL类


这里给出一些示例,


//Provider
public String insertSql() {
    return new SQL()
            .INSERT_INTO("blog")
            .INTO_COLUMNS("id", "name", "title", "content")
            .INTO_VALUES("#{id}", "#{name}", "#{title}", "#{content}")
            .toString();
}
public String updateSql() {
    return new SQL()
            .UPDATE("blog")
            .SET("name = #{name}")
            .SET("title = #{title}")
            .SET("content = #{content}")
            .WHERE("id = #{id}")
            .toString();
}
public String findAllSql() {
    return new SQL() {{
        SELECT("name, title, content");
        FROM("blog");
    }}.toString();
}
public String findBlogLikeSql(@Param("name") String name, @Param("title") String title,
                                @Param("content") String content) {
    return new SQL() {{
        SELECT("name, title, content");
        FROM("blog");
        if (name != null) {
            WHERE("name like #{name}");
        }
        if (title != null) {
            WHERE("title like #{title}");
        }
        if (content != null) {
            WHERE("content like #{content}");
        }
    }}.toString();
}
//Mapper
public interface BlogMapper {
    @SelectProvider(type = BlogProvider.class, method = "findAllSql")
    @Results(id = "resultMap", value = {
            @Result(id = true, column = "id", property = "id"),
            @Result(column = "author_id", property = "authorId"),
            @Result(column = "name", property = "name"),
            @Result(column = "title", property = "title"),
            @Result(column = "content", property = "content"),
    })
    List<Blog> finAll();
    @SelectProvider(type = BlogProvider.class, method = "findBlogLikeSql")
    @ResultMap(value = {"resultMap"})
    List<Blog> findBlogLike(@Param("name") String name, @Param("title") String title,
                            @Param("content") String content);
    @InsertProvider(type = BlogProvider.class, method = "insertSql")
    @Options(useGeneratedKeys = true, keyProperty = "id")
    void insert(Blog dto);
    @UpdateProvider(type = BlogProvider.class, method = "updateSql")
    void update(Blog dto);
}


参考资料




相关文章
|
2月前
|
SQL 存储 测试技术
SQL在构建系统中的应用:关键步骤与技巧
在构建基于数据库的应用系统时,SQL(Structured Query Language)作为与数据库交互的核心语言,扮演着至关重要的角色
|
21天前
|
SQL 缓存 Java
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
本文详细介绍了MyBatis的各种常见用法MyBatis多级缓存、逆向工程、分页插件 包括获取参数值和结果的各种情况、自定义映射resultMap、动态SQL
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
|
26天前
|
SQL 安全 Java
MyBatis-Plus条件构造器:构建安全、高效的数据库查询
MyBatis-Plus 提供了一套强大的条件构造器(Wrapper),用于构建复杂的数据库查询条件。Wrapper 类允许开发者以链式调用的方式构造查询条件,无需编写繁琐的 SQL 语句,从而提高开发效率并减少 SQL 注入的风险。
15 1
MyBatis-Plus条件构造器:构建安全、高效的数据库查询
|
2月前
|
SQL Java 数据库连接
mybatis使用四:dao接口参数与mapper 接口中SQL的对应和对应方式的总结,MyBatis的parameterType传入参数类型
这篇文章是关于MyBatis中DAO接口参数与Mapper接口中SQL的对应关系,以及如何使用parameterType传入参数类型的详细总结。
37 10
|
3月前
|
SQL XML Java
mybatis复习03,动态SQL,if,choose,where,set,trim标签及foreach标签的用法
文章介绍了MyBatis中动态SQL的用法,包括if、choose、where、set和trim标签,以及foreach标签的详细使用。通过实际代码示例,展示了如何根据条件动态构建查询、更新和批量插入操作的SQL语句。
mybatis复习03,动态SQL,if,choose,where,set,trim标签及foreach标签的用法
|
2月前
|
SQL 存储 数据库
SQL在构建系统中的应用:关键要素与编写技巧
在构建基于数据库的系统时,SQL(Structured Query Language)扮演着至关重要的角色
|
2月前
|
SQL
SQL使用with构建临时表
SQL使用with构建临时表
92 8
|
2月前
|
SQL 数据库管理 索引
SQL语句查询教师表:高效构建与技巧分享
在数据库管理中,查询操作是最基础也是最重要的功能之一
|
3月前
|
SQL XML Java
mybatis :sqlmapconfig.xml配置 ++++Mapper XML 文件(sql/insert/delete/update/select)(增删改查)用法
当然,这些仅是MyBatis功能的初步介绍。MyBatis还提供了高级特性,如动态SQL、类型处理器、插件等,可以进一步提供对数据库交互的强大支持和灵活性。希望上述内容对您理解MyBatis的基本操作有所帮助。在实际使用中,您可能还需要根据具体的业务要求调整和优化SQL语句和配置。
48 1
|
5月前
|
SQL Java 数据库连接
mybatis动态SQL常用语法总结
MyBatis 使用 OGNL 表达式语言处理动态SQL,如 `if` 标签进行条件判断,`choose`、`when`、`otherwise` 实现多条件选择,`where`、`set` 管理SQL关键字,`trim` 提供通用修剪功能,`foreach` 遍历集合数据。`sql` 和 `include` 用于代码重用,`selectKey` 处理插入后的返回值。参数传递支持匿名、具名、列表、Map、Java Bean和JSON方式。注意SQL转义及使用合适的jdbcType映射Java类型。
96 7
下一篇
无影云桌面