SQL模板支持默认值

This commit is contained in:
redkale
2024-06-29 19:18:45 +08:00
parent 8136345484
commit ff76c698f4
2 changed files with 29 additions and 16 deletions

View File

@@ -4,7 +4,7 @@
## SQL模板 ## SQL模板
  Redkale中的SQL模板与Mybatis里的SQL模板用法类似 最大区别在于不需要写很多```if/else```判断语句,也不用写xml文件 框架会根据参数存在与否动态生成sql语句 查询结果时下划线式sql字段名和驼峰式类字段名会自动匹配。   Redkale中的SQL模板与Mybatis里的SQL模板用法类似 最大区别在于不需要写很多```if/else```判断语句,也不用写xml文件 框架会根据参数存在与否动态生成sql语句 查询结果时下划线式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=nullbean.userName='hello'时sql语句转换成:   当bean.userIds=nullbean.userName='hello'时sql语句转换成:
```sql ```sql
@@ -18,9 +18,20 @@
```sql ```sql
SELECT * FROM user WHERE 1=2 OR user_name = 'hello' SELECT * FROM user WHERE 1=2 OR user_name = 'hello'
``` ```
  有些场景要求参数是必需的,就需要使用$${}来校验参数是否必需。   参数支持默认值,用逗号隔开,非String参数类型主要指定数据类型目前支持(int)、(long)、(short)、(float)、(double), 参数不存在会使用默认值aaa:
```sql ```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```   当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 " private static final String findSql = "SELECT f.forum_groupid, s.forum_section_color "
+ "FROM forum_info f, forum_section s " + "FROM forum_info f, forum_section s "
+ " WHERE f.forumid = s.forumid AND " + " WHERE f.forumid = s.forumid AND "
+ "s.forum_sectionid = ${bean.forumSectionid} AND " + "s.forum_sectionid = #{bean.forumSectionid} AND "
+ "f.forumid = ${bean.forumid} AND s.forum_section_color = ${bean.forumSectionColor}"; + "f.forumid = #{bean.forumid} AND s.forum_section_color = #{bean.forumSectionColor}";
//查询列表记录的sql //查询列表记录的sql
private static final String querySql = "SELECT f.forum_groupid, s.forum_section_color " private static final String querySql = "SELECT f.forum_groupid, s.forum_section_color "
+ "FROM forum_info f, forum_section s " + "FROM forum_info f, forum_section s "
+ " WHERE f.forumid = s.forumid AND " + " WHERE f.forumid = s.forumid AND "
+ "s.forum_sectionid = ${bean.forumSectionid} AND " + "s.forum_sectionid = #{bean.forumSectionid} AND "
+ "f.forumid = ${bean.forumid} AND s.forum_section_color = ${bean.forumSectionColor}"; + "f.forumid = #{bean.forumid} AND s.forum_section_color = #{bean.forumSectionColor}";
@Resource @Resource
private DataSqlSource source; private DataSqlSource source;
@@ -68,17 +79,17 @@ public interface ForumInfoMapper extends BaseMapper<ForumInfo> {
@Sql("SELECT f.forum_groupid, s.forum_section_color " @Sql("SELECT f.forum_groupid, s.forum_section_color "
+ "FROM forum_info f, forum_section s " + "FROM forum_info f, forum_section s "
+ "WHERE f.forumid = s.forumid " + "WHERE f.forumid = s.forumid "
+ "AND s.forum_sectionid = ${bean.forumSectionid} " + "AND s.forum_sectionid = #{bean.forumSectionid} "
+ "AND f.forumid = ${bean.forumid} " + "AND f.forumid = #{bean.forumid} "
+ "AND s.forum_section_color = ${bean.forumSectionColor}") + "AND s.forum_section_color = #{bean.forumSectionColor}")
public ForumResult findForumResultOne(ForumBean bean); public ForumResult findForumResultOne(ForumBean bean);
@Sql("SELECT f.forum_groupid, s.forum_section_color " @Sql("SELECT f.forum_groupid, s.forum_section_color "
+ "FROM forum_info f, forum_section s " + "FROM forum_info f, forum_section s "
+ "WHERE f.forumid = s.forumid AND " + "WHERE f.forumid = s.forumid AND "
+ "s.forum_sectionid = ${bean.forumSectionid} " + "s.forum_sectionid = #{bean.forumSectionid} "
+ "AND f.forumid = ${bean.forumid} " + "AND f.forumid = #{bean.forumid} "
+ "AND s.forum_section_color = ${bean.forumSectionColor}") + "AND s.forum_section_color = #{bean.forumSectionColor}")
public CompletableFuture<ForumResult> findForumResultOneAsync(ForumBean bean); public CompletableFuture<ForumResult> findForumResultOneAsync(ForumBean bean);
//翻页查询 //翻页查询
@@ -91,7 +102,7 @@ public interface ForumInfoMapper extends BaseMapper<ForumInfo> {
@Sql("UPDATE forum_section s " @Sql("UPDATE forum_section s "
+ " SET s.forum_sectionid = '' " + " 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); public int updateForumResult(@Param("bean") ForumBean bean0);
} }
``` ```

View File

@@ -11,8 +11,10 @@ import org.redkale.util.RedkaleClassLoader;
/** /**
* 原生的sql解析器 <br> * 原生的sql解析器 <br>
* 参数变量有三种方式(与Mybatis的占位符类似): <br> * 参数变量有三种方式(与Mybatis的占位符类似): <br>
* ${xx.xx}: 用于直接拼接sql的变量不做任何转义 变量值必需的 #{xx.xx}: 用于预编译的sql的参数变量, UPDATE SET中的#{xx.xx}变量自动转成必需的 ##{xx.xx}: * ${xx.xx}: 用于直接拼接sql的变量不做任何转义 变量值必需的 <br>
* 用于预编译的sql的参数变量 变量值必需的 * #{xx.xx}: 用于预编译的sql的参数变量, UPDATE SET中的#{xx.xx}变量自动转成必需的 <br>
* ##{xx.xx}: 用于预编译的sql的参数变量 变量值必需的
* #{xx.xx,yyy}: 用于预编译的sql的带默认值的参数变量, yyy为默认值当参数不存在时使用默认值 <br>
* *
* <p>详情见: https://redkale.org * <p>详情见: https://redkale.org
* *