第一章 Mybatis中参数传递问题
1.1 单个普通参数
- 可以任意使用:参数数据类型、参数名称不用考虑
1.2 多个普通参数
- Mybatis底层封装Map结构,封装key为param1、param2…【支持:arg0、arg1、…】
1.3 命名参数
-
语法:
- @Param(value=“参数名”)
- @Param(“参数名”)
-
位置:参数前面
-
注意:
- 底层封装Map结构
- 命名参数,依然支持参数【param1,param2,…】
-
示例代码
/*** 通过员工姓名及薪资查询员工信息【命名参数】* @return*/ public List<Employee> selectEmpByNamed(@Param("lName")String lastName,@Param("salary") double salary);
<select id="selectEmpByNamed" resultType="employee">SELECTid,last_name,email,salaryFROMtbl_employeeWHERElast_name=#{param1}ANDsalary=#{param2} </select>
-
源码分析
-
MapperMethod对象:142行代码【命名参数底层代码入口】
-
命名参数底层封装map为ParamMap,ParamMap继承HashMap
-
ParamNameResolver对象:130行代码,命名参数底层实现逻辑
//130行 final Map<String, Object> param = new ParamMap<>(); int i = 0; for (Map.Entry<Integer, String> entry : names.entrySet()) {param.put(entry.getValue(), args[entry.getKey()]);// add generic param names (param1, param2, ...)final String genericParamName = GENERIC_NAME_PREFIX + (i + 1);// ensure not to overwrite parameter named with @Paramif (!names.containsValue(genericParamName)) {param.put(genericParamName, args[entry.getKey()]);}i++; } return param;
-
1.4 POJO参数
- Mybatis支持POJO【JavaBean】入参,参数key是POJO中属性
1.5 Map参数
- Mybatis支持直接Map入参,map的key=参数key
1.6 Collection|List|Array等参数
- 参数名:collection、list、array
第二章 Mybatis参数传递【#与$区别】
2.1 回顾JDBC
- DriverManager
- Connection
- Statement:执行SQL语句,入参使用SQL【String】拼接方式
- PreparedStatement执行SQL语句【预编译SQL】,入参使用占位符方式
- ResultSet
2.2 #与$区别
- 【#】底层执行SQL语句的对象,使用PreparedStatementd,预编译SQL,防止SQL注入安全隐患,相对比较安全。
- 【$】底层执行SQL语句的对象使用Statement对象,未解决SQL注入安全隐患,相对不安全。
2.3 #与$使用场景
查询SQL:select col,col2 from table1 where col=? and col2=? group by ?, order by ? limit ?,?
-
#使用场景,sql占位符位置均可以使用#
-
KaTeX parse error: Expected 'EOF', got '#' at position 6: 使用场景,#̲解决不了的参数传递问题,均可以…处理【如:form 动态化表名】
/*** 测试$使用场景*/ public List<Employee> selectEmpByDynamitTable(@Param("tblName") String tblName);
<select id="selectEmpByDynamitTable" resultType="employee">SELECTid,last_name,email,salaryFROM${tblName} </select>