参数获取和参数传递
1、SQL语句中获取参数的两种方式
1) #{key}:获取参数的值,预编译到SQL中。安全。相当于PreparedStatement,利用通配符.
2) ${key}:获取参数的值,拼接到SQL中。有SQL注入问题🔗。相当于Statement,涉及到字符串的拼接,字符串部分一定要注意单引号问题。
select eid,ename,age,sex from emp where eid = ${eid} and ename = '${ename}'
3) 建议:大部分情况下使用 #{},在特殊情况下:①批量删除;②模糊查询,需要使用 ${}
2、不同的参数类型 #{} 和 ${} 的不同取值方式:
1)当传输参数为单个String或者基本数据类型和其包装类
#{}:可以以任意的名字获取参数;
${}:只能以${value}或者${_parameter}获取
<!-- Emp getEmpByEid(String eid); --> <select id="getEmpByEid" resultType="Emp"> <!-- select eid,ename,age,sex from emp where eid = #{eid} --> select eid,ename,age,sex from emp where eid = ${_parameter} </select>
2)当传输参数为JavaBean时
#{} 和${} 都能够通过属性名直接获取属性值,但还是要注意${} 的单引号问题。
<insert id="insertEmp" useGeneratedKeys="true" keyProperty="eid"> <!-- insert into emp values(null, #{ename}, #{age}, #{sex}) --> insert into emp values(null, '${ename}', ${age}, '${sex}') </insert>
3)当传输多个参数时(以两个参数为例子),mybatis会默认将这些参数放在map集合中:
①键为0,1,2,3...,N-1,以参数为值
②键为param1,param2,param3,....,paramN,以参数为值
#{}:#{0} 、#{1}; 或者 #{param1}、#{param2};
${}:${param1}、${param2},注意${} 的单引号问题
<!-- Emp getEmpByEidAndEname(String eid, String ename); --> <select id="getEmpByEidAndEname" resultType="Emp"> select eid,ename,age,sex from emp where eid = ${param1} and ename = '${param2}' </select>
4)当传输Map参数时
#{}和${} 都可以通过键的名字直接获取值,但注意${} 的单引号问题(需要手动创建map键值对传入)
<!-- Emp getEmpByMap(Map<String, Object> map); --> <select id="getEmpByMap" resultType="emp"> select eid,ename,age,sex from emp where eid = ${eid} and ename = '${ename}' </select>
5)命名参数
可以通过 @Param("key") 在参数上加上注解,指定键的名字。
#{}和${} 都可以通过键的名字直接获取值,但注意${} 的单引号问题。
<!-- Emp getEmpByEidAndEnameByParam(@Param("eid")String eid, @Param("ename")String ename); --> <select id="getEmpByEidAndEnameByParam" resultType="Emp"> select eid,ename,age,sex from emp where eid = #{eid} and ename = #{ename} </select>
6)Collection/Array
会被MyBatis封装成一个map传入, Collection对应的key是collection,Array对应的key是array. 如果确定是List集合,key还可以是list.
package com.atguigu.mapper; import java.util.Map; import org.apache.ibatis.annotations.Param; import com.atguigu.bean.Emp; public interface ParamMapper { //添加员工信息 void insertEmp(Emp emp); //根据eid获取员工信息 Emp getEmpByEid(String eid); //根据eid和ename查询员工信息 Emp getEmpByEidAndEname(String eid, String ename); //根据map查询员工信息 Emp getEmpByMap(Map<String, Object> map); //根据eid和ename查询员工信息 Emp getEmpByEidAndEnameByParam(@Param("eid")String eid, @Param("ename")String ename); }
package com.atguigu.test; import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.Test; import com.atguigu.bean.Emp; import com.atguigu.mapper.EmpMapper; import com.atguigu.mapper.ParamMapper; public class TestParam { @Test public void testCRUD() throws IOException { InputStream is = Resources.getResourceAsStream("mybatis-config.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is); //SqlSession sqlSession = sqlSessionFactory.openSession();//需要手动处理事务 SqlSession sqlSession = sqlSessionFactory.openSession(true);//自动处理事务 ParamMapper mapper = sqlSession.getMapper(ParamMapper.class); // 1 Emp emp = mapper.getEmpByEid("1"); System.out.println(emp); // 2 Emp emp = new Emp(null, "admin", 23, "男"); mapper.insertEmp(emp); System.out.println(emp.getEid()); // 3 Emp emp = mapper.getEmpByEidAndEname("1", "张三"); System.out.println(emp); // 4 Map<String, Object> map = new HashMap<>(); map.put("eid", "1"); map.put("ename", "张三"); Emp emp = mapper.getEmpByMap(map); // 5 Emp emp = mapper.getEmpByEidAndEnameByParam("1", "张三"); System.out.println(emp); } }