专栏名称: ImportNew
伯乐在线旗下账号,专注Java技术分享,包括Java基础技术、进阶技能、架构设计和Java技术领域动态等。
目录
相关文章推荐
51好读  ›  专栏  ›  ImportNew

MyBatis 快速入门(3):动态SQL

ImportNew  · 公众号  · Java  · 2017-03-24 18:52

正文

请到「今天看啥」查看全文


(点击 上方公众号 ,可快速关注)


来源:乐百川,

www.jianshu.com/p/b25847cfa4ef

如有好文章投稿,请点击 → 这里了解详情


动态SQL


MyBatis还有一个方便的功能就是动态SQL,可以根据条件智能生成SQL语句。这里的例子全部来自MyBatis文档。


if标签


下面这个例子使用了MyBatis的if元素,在标题不为空的情况下在查询结果中包含标题的查询。


resultType="Blog">

SELECT * FROM BLOG WHERE state = ‘ACTIVE’

AND title like #{title}

AND author_name like #{author.name}

AND featured = 1


对于下面这个例子,如果state为空,无法生成合法的SQL语句。


resultType="Blog">

SELECT * FROM BLOG

state = #{state}

AND title like #{title}

AND author_name like #{author.name}


有时候where标签还不能满足需求。这时候还可以使用trim标签进行更高级的定制。trim标签中的prefix和suffix属性会被用于生成实际的SQL语句,会和标签内部的语句拼接。如果语句的前面或后面遇到prefixOverrides或suffixOverrides属性中指定的值,MyBatis会自动将它们删除。在指定多个值的时候,别忘了每个值后面都要有一个空格,保证不会和后面的SQL连接在一起。下面这个例子和where标签完全等效。


...


还有一个set标签用于智能执行更新语句。


update Author

username=#{username},

password=#{password},

email=#{email},

bio=#{bio}

where id=#{id}


与它等价的trim标签如下。


...


foreach标签


还有一个迭代标签可以生成一系列值,这个标签主要用于SQL的in语句后面。


SELECT * FROM BLOG

WHERE title LIKE #{pattern}


SQL构造类


有时候需要在Java代码中生成SQL语句。如果我们直接编写的话会是一件非常麻烦的事情。由于Java不支持跨行字符串,所以我们要么在一行里面写一个非常非常长的SQL语句,要么用加号拼接出一个笨拙的字符串。MyBatis提供了SQL构造类,我们可以方便的使用这个类构造出SQL语句。


下面这几个例子同样来自于MyBatis文档。SQL构造类有两种用法:匿名类和流式构造。构造完成之后,调用toString()方法即可生成对应的SQL语句。


// 匿名内部类

public String deletePersonSql() {

return new SQL() {{

DELETE_FROM("PERSON");

WHERE("ID = #{id}");

}}.toString();

}

// 流式构造

public String insertPersonSql() {

String sql = new SQL()

.INSERT_INTO("PERSON")

.VALUES("ID, FIRST_NAME", "#{id}, #{firstName}")

.VALUES("LAST_NAME", "#{lastName}")

.toString();

return sql;

}

// 如果需要条件构造,只能使用匿名类方式,注意匿名类要引用方法参数的话,参数必须声明为final的

public String selectPersonLike(final String id, final String firstName, final String lastName) {

return new SQL() {{

SELECT("P.ID, P.USERNAME, P.PASSWORD, P.FIRST_NAME, P.LAST_NAME");

FROM("PERSON P");

if (id != null) {

WHERE("P.ID like #{id}");

}

if (firstName != null) {

WHERE("P.FIRST_NAME like #{firstName}");

}

if (lastName != null) {

WHERE("P.LAST_NAME like #{lastName}");

}

ORDER_BY("P.LAST_NAME");

}}.toString();

}

public String deletePersonSql() {

return new SQL() {{

DELETE_FROM("PERSON");

WHERE("ID = #{id}");

}}.toString();

}


参考资料


  • MyBatis文档 动态SQL

    http://www.mybatis.org/mybatis-3/dynamic-sql.html#


本系列:



看完本文有收获?请转发分享给更多人

关注「ImportNew」,看技术干货







请到「今天看啥」查看全文


推荐文章
魔鬼心理学  ·  说说你都听过哪些最奇葩的借口?
8 年前
苏米的星座馆  ·  你适合多大的男人?
7 年前