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); } }