1、SQL语句中获取参数的两种方式
1)#{key}:获取参数的值,预编译到SQL中。安全。相当于PreparedStatement,利用通配符.
2) ${key}:获取参数的值,拼接到SQL中。有SQL注入问题🔗。相当于Statement,涉及到字符串的拼接,字符串部分一定要注意单引号问题。
select eid,ename,age,sex from emp where eid = ${eid} and ename ='${ename}'
2、不同的参数类型 #{} 和 ${} 的不同取值方式:
1)当传输参数为单个String或者基本数据类型和其包装类
#{}:可以以任意的名字获取参数;
${}:只能以${value}或者${_parameter}获取
select eid,ename,age,sex from emp where eid = ${_parameter}
2)当传输参数为JavaBean时
#{} 和${} 都能够通过属性名直接获取属性值,但还是要注意${} 的单引号问题。
insert into emp values(null, '${ename}', ${age}, '${sex}')
3)当传输多个参数时(以两个参数为例子),mybatis会默认将这些参数放在map集合中:
①键为0,1,2,3...,N-1,以参数为值
②键为param1,param2,param3,....,paramN,以参数为值
#{}:#{0} 、#{1}; 或者 #{param1}、#{param2};
${}:${param1}、${param2},注意${} 的单引号问题
select eid,ename,age,sex from emp where eid = ${param1} and ename = '${param2}'
4)当传输Map参数时
#{}和${} 都可以通过键的名字直接获取值,但注意${} 的单引号问题(需要手动创建map键值对传入)
select eid,ename,age,sex from emp where eid = ${eid} and ename = '${ename}'
5)命名参数
可以通过 @Param("key") 在参数上加上注解,指定键的名字。
#{}和${} 都可以通过键的名字直接获取值,但注意${} 的单引号问题。
select eid,ename,age,sex from emp where eid = #{eid} and ename = #{ename}
6)Collection/Array
会被MyBatis封装成一个map传入, Collection对应的key是collection,Array对应的key是array. 如果确定是List集合,key还可以是list.
packagecom.atguigu.mapper;importjava.util.Map;importorg.apache.ibatis.annotations.Param;importcom.atguigu.bean.Emp;public interfaceParamMapper {//添加员工信息
voidinsertEmp(Emp emp);//根据eid获取员工信息
Emp getEmpByEid(String eid);//根据eid和ename查询员工信息
Emp getEmpByEidAndEname(String eid, String ename);//根据map查询员工信息
Emp getEmpByMap(Mapmap);//根据eid和ename查询员工信息
Emp getEmpByEidAndEnameByParam(@Param("eid")String eid, @Param("ename")String ename);
}
packagecom.atguigu.test;importjava.io.IOException;importjava.io.InputStream;importjava.util.HashMap;importjava.util.List;importjava.util.Map;importorg.apache.ibatis.io.Resources;importorg.apache.ibatis.session.SqlSession;importorg.apache.ibatis.session.SqlSessionFactory;importorg.apache.ibatis.session.SqlSessionFactoryBuilder;importorg.junit.Test;importcom.atguigu.bean.Emp;importcom.atguigu.mapper.EmpMapper;importcom.atguigu.mapper.ParamMapper;public classTestParam {
@Testpublic void testCRUD() throwsIOException {
InputStream is= Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory= newSqlSessionFactoryBuilder().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 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);
}
}