开发者社区> 游客n4jcsdeetmtbg> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

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);
}


参考资料




版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
mysql常用sql语句
本文主要介绍基本的 SQL 语句,数据的增删查改等。
73 0
MySQL系列专题(2)-MySQL的SQL语句和高级特性
MySQL系列专题(2)-MySQL的SQL语句和高级特性
93 0
MySQL关于SQL语句的一些题目
MySQL关于SQL语句的一些题目 1、用一条SQL语句查询出每门课都大于80的学生的姓名 (1)SELECT NAME FROM score GROUP BY NAME HAVING MIN(grade) > 80 (2)SELECT DISTINCT NAME FROM score WH.
1537 0
MySQl之最全且必会的sql语句
原文链接:http://blog.csdn.net/qq_32059827/article/details/51763950 创建一个名称为mydb1的数据库,如果有mydb1数据库则直接使用,如果无则创建mydb1数...
816 0
***mysql中查询今天、昨天、上个月sql语句
今天 select * from 表名 where to_days(时间字段名) = to_days(now()); 昨天Select * FROM 表名 Where TO_DAYS( NOW( ) ) - TO_DAYS( 时间字段名)
1056 0
MySQL的一些常用的SQL语句整理
安装MySQL有两种的方式,一种是解压版本,但是需要配置环境变量,相对而言比较麻烦。所以我们一般采取第二种方式,那就是到MySQL的官网上下载安装版。这样就会省去很多麻烦,在这里我就不再详细的介绍具体的安装过程了,百度一下,Google,上面有手把手的教程。
870 0
【C/C++学院】(21)Mysql数据库编程--开发简介/SQL语句
<h1><span style="line-height:1.5"><span style="font-size:18px">一.mysql安装与管理</span></span></h1> <div><span style="line-height:1.5; font-size:18px; font-family:'Microsoft YaHei UI','Microsoft YaHei
1219 0
利用tcpdump抓取mysql sql语句
这个脚本是我之前在网上无意间找个一个利用tcpdump 抓包工具获取mysql流量,并通过过滤把sql 语句输入。 脚本不是很长,但是效果很好。 #!/bin/bash #this script used montor mysql network traffic.
997 0
文章
问答
文章排行榜
最热
最新
相关电子书
更多
Blink SQL关键技术及实现原理
立即下载
用SQL做数据分析
立即下载
SQL Sever迁移PG经验
立即下载