参数获取和参数传递
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或者基本数据类型和其包装类
#{}:可以以任意的名字获取参数;
<!-- 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};
<!-- 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参数时
#{}和
<!-- 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); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧