diff --git a/docs/sqlsource.md b/docs/sqlsource.md index 1bee67521..045186228 100644 --- a/docs/sqlsource.md +++ b/docs/sqlsource.md @@ -4,7 +4,7 @@ ## SQL模板   Redkale中的SQL模板与Mybatis里的SQL模板用法类似, 最大区别在于不需要写很多```if/else```判断语句,也不用写xml文件, 框架会根据参数存在与否动态生成sql语句, 查询结果时下划线式sql字段名和驼峰式类字段名会自动匹配。 ```sql - SELECT * FROM user WHERE user_id IN ${bean.userIds} OR user_name = ${bean.userName} + SELECT * FROM user WHERE user_id IN #{bean.userIds} OR user_name = #{bean.userName} ```   当bean.userIds=null,bean.userName='hello'时,sql语句转换成: ```sql @@ -18,9 +18,20 @@ ```sql SELECT * FROM user WHERE 1=2 OR user_name = 'hello' ``` -  有些场景要求参数是必需的,就需要使用$${}来校验参数是否必需。 +  参数支持默认值,用逗号隔开,非String参数类型主要指定数据类型,目前支持(int)、(long)、(short)、(float)、(double), 参数不存在会使用默认值aaa: ```sql - DELETE FROM user WHERE user_name = $${bean.userName} + DELETE FROM user WHERE user_name = #{bean.userName,aaa} +``` +  IN参数也支持默认值: +```sql + DELETE FROM user WHERE type IN #{types,(1, 2, 3)} + DELETE FROM user WHERE type IN (1, 2, #{type, (int)3}) + DELETE FROM user WHERE user_name IN #{name, ('aa','bb','cc')} + DELETE FROM user WHERE user_name ('aa', 'bb', #{type,cc}) +``` +  有些场景要求参数是必需的,就需要使用##{}来校验参数是否必需。 +```sql + DELETE FROM user WHERE user_name = ##{bean.userName} ```   当bean=null或者bean.userName=null时,执行sql会报错 ```Missing parameter bean.userName``` @@ -32,15 +43,15 @@ public class ForumInfoService extends AbstractService { private static final String findSql = "SELECT f.forum_groupid, s.forum_section_color " + "FROM forum_info f, forum_section s " + " WHERE f.forumid = s.forumid AND " - + "s.forum_sectionid = ${bean.forumSectionid} AND " - + "f.forumid = ${bean.forumid} AND s.forum_section_color = ${bean.forumSectionColor}"; + + "s.forum_sectionid = #{bean.forumSectionid} AND " + + "f.forumid = #{bean.forumid} AND s.forum_section_color = #{bean.forumSectionColor}"; //查询列表记录的sql private static final String querySql = "SELECT f.forum_groupid, s.forum_section_color " + "FROM forum_info f, forum_section s " + " WHERE f.forumid = s.forumid AND " - + "s.forum_sectionid = ${bean.forumSectionid} AND " - + "f.forumid = ${bean.forumid} AND s.forum_section_color = ${bean.forumSectionColor}"; + + "s.forum_sectionid = #{bean.forumSectionid} AND " + + "f.forumid = #{bean.forumid} AND s.forum_section_color = #{bean.forumSectionColor}"; @Resource private DataSqlSource source; @@ -68,17 +79,17 @@ public interface ForumInfoMapper extends BaseMapper { @Sql("SELECT f.forum_groupid, s.forum_section_color " + "FROM forum_info f, forum_section s " + "WHERE f.forumid = s.forumid " - + "AND s.forum_sectionid = ${bean.forumSectionid} " - + "AND f.forumid = ${bean.forumid} " - + "AND s.forum_section_color = ${bean.forumSectionColor}") + + "AND s.forum_sectionid = #{bean.forumSectionid} " + + "AND f.forumid = #{bean.forumid} " + + "AND s.forum_section_color = #{bean.forumSectionColor}") public ForumResult findForumResultOne(ForumBean bean); @Sql("SELECT f.forum_groupid, s.forum_section_color " + "FROM forum_info f, forum_section s " + "WHERE f.forumid = s.forumid AND " - + "s.forum_sectionid = ${bean.forumSectionid} " - + "AND f.forumid = ${bean.forumid} " - + "AND s.forum_section_color = ${bean.forumSectionColor}") + + "s.forum_sectionid = #{bean.forumSectionid} " + + "AND f.forumid = #{bean.forumid} " + + "AND s.forum_section_color = #{bean.forumSectionColor}") public CompletableFuture findForumResultOneAsync(ForumBean bean); //翻页查询 @@ -91,7 +102,7 @@ public interface ForumInfoMapper extends BaseMapper { @Sql("UPDATE forum_section s " + " SET s.forum_sectionid = '' " - + " WHERE s.forum_section_color = $${bean.forumSectionColor}") + + " WHERE s.forum_section_color = ##{bean.forumSectionColor}") public int updateForumResult(@Param("bean") ForumBean bean0); } ``` \ No newline at end of file diff --git a/src/main/java/org/redkale/source/DataNativeSqlParser.java b/src/main/java/org/redkale/source/DataNativeSqlParser.java index ec62c1ddc..17fe2729e 100644 --- a/src/main/java/org/redkale/source/DataNativeSqlParser.java +++ b/src/main/java/org/redkale/source/DataNativeSqlParser.java @@ -11,8 +11,10 @@ import org.redkale.util.RedkaleClassLoader; /** * 原生的sql解析器
* 参数变量有三种方式(与Mybatis的占位符类似):
- * ${xx.xx}: 用于直接拼接sql的变量,不做任何转义, 变量值必需的 #{xx.xx}: 用于预编译的sql的参数变量, UPDATE SET中的#{xx.xx}变量自动转成必需的 ##{xx.xx}: - * 用于预编译的sql的参数变量, 变量值必需的 + * ${xx.xx}: 用于直接拼接sql的变量,不做任何转义, 变量值必需的
+ * #{xx.xx}: 用于预编译的sql的参数变量, UPDATE SET中的#{xx.xx}变量自动转成必需的
+ * ##{xx.xx}: 用于预编译的sql的参数变量, 变量值必需的 + * #{xx.xx,yyy}: 用于预编译的sql的带默认值的参数变量, yyy为默认值,当参数不存在时使用默认值
* *

详情见: https://redkale.org *