Minidao SQL参数用法 === > 接口方法如何传递参数 ### 注解一:@Param 参数标签 * **注解定义:** ``` /** * minidao参数注解 */ @Target(ElementType.PARAMETER) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Param { String value(); } ``` * **用法示例:** ``` Map<String,Object> getMap2(@Param("empno") String empno,@Param("name")String name); ``` ### 注解二:@Arguments 参数标签 (官方不建议使用) * **注解定义:** ``` /** *(SQL模板参数名) * 1. [注释标签参数]必须和[方法参数],保持顺序一致 * 2. [注释标签参数]的参数数目不能大于[方法参数]的参数数目 * 3. 只有在[注释标签参数]标注的参数,才会传递到SQL模板里 * 4. 如果[方法参数]只有一个,如果用户不设置 [注释标签参数],则默认参数名为miniDto */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface Arguments { String[] value() default {}; } ``` * **用法示例:** ``` @Arguments({"empno","name"}) Map getMap(String empno,String name); ``` > SQL中如何使用参数 ### 方式一: 占位符方式, 格式字段前加冒号【: 字段名】 * **优点: ** 防止sql注入;sql执行计划只解析一次;字段值根据类型自动转换,不需要手工处理 * **缺点:** 只能传参数原生态值;参数为List情况循环体不适用 * **示例:** ``` SELECT * FROM employee where 1=1 <#if employee.age ?exists> and age = :employee.age </#if> <#if employee.name ?exists> and name = :employee.name </#if> <#if employee.empno ?exists> and empno = :employee.empno </#if> ``` ### 方式二:模板语言方式,格式【${字段名}】 * **缺点:** Sql直接拼装,有SQL注入风险;参数值需根据类型手工转换; * **优点:** 可以对参数值进行脚本处理;参数为List对象,循环体对象必须用该方式; (用户体验没有变化,直接将${}改为: 即可) * **特点:**持多参数,支持参数多层,参数为list必须采用模板语言方式 * **示例:** ``` SELECT * FROM employee where 1=1 <#if employee.age ?exists> and age = '${employee.age}' </#if> <#if employee.name ?exists> and name = '${employee.name}' </#if> <#if employee.empno ?exists> and empno = '${employee.empno}' </#if> ```