数据输入
实际使用时仅需考虑两种情况:
- 实体类型:接口传参是实体类,则在 SQL语句中直接使用类的属性 #{属性1},#{属性2}...
- 非实体类型:在接口传参时使用 @Param("key") value注解,则SQL语句中直接使用 #
#{}形式
Mybatis会将SQL语句中的#{}转换为问号占位符。
${}形式
${}形式传参,底层Mybatis做的是字符串拼接操作,'${xxx}'。
通常不会采用{}的方式传值。 一个特定的适用场景是:通过Java程序动态生成数据库表,表名部分需要Java程序通过参数传入;而JDBC对于表名部分是不能使用问号占位符的,此时只能使用{}。
结论:实际开发中,能用#{}实现的,肯定不用${}。
1、Mybatis总体机制概括
2、概念说明
这里数据输入具体是指上层方法(例如Service方法)调用Mapper接口时,数据传入的形式。
- 简单类型:只包含一个值的数据类型
- 基本数据类型:int、byte、short、double、……
- 基本数据类型的包装类型:Integer、Character、Double、……
- 字符串类型:String
- 复杂类型:包含多个值的数据类型
- 实体类类型:Employee、Department、……
- 集合类型:List、Set、Map、……
- 数组类型:int[]、String[]、……
- 复合类型:List
、实体类中包含集合……
3、单个简单类型参数
①Mapper接口中抽象方法的声明
Employee selectEmployee(Integer empId);
②SQL语句
<select id="selectEmployee" resultType="com.atguigu.mybatis.entity.Employee">
select emp_id empId,emp_name empName,emp_salary empSalary from t_emp where emp_id=#{empId}
</select>
单个简单类型参数,在#{}中可以随意命名,但是没有必要。通常还是使用和接口方法参数同名。
4、实体类类型参数
①Mapper接口中抽象方法的声明
int insertEmployee(Employee employee);
②SQL语句
<insert id="insertEmployee">
insert into t_emp(emp_name,emp_salary) values(#{empName},#{empSalary})
</insert>
③对应关系
④结论
Mybatis会根据#{}中传入的数据,加工成getXxx()方法,通过反射在实体类对象中调用这个方法,从而获取到对应的数据。填充到#{}解析后的问号占位符这个位置。
5、零散的简单类型数据
零散的多个简单类型参数,如果没有特殊处理,那么Mybatis无法识别自定义名称:
#{xxx} 底层翻译为 ? 即 jdbc中SQL语句中的站位符,不能区分
${xxx} 底层翻译为字符串拼接
①Mapper接口中抽象方法的声明
int updateEmployee(@Param("empId") Integer empId,@Param("empSalary") Double empSalary);
②SQL语句
<update id="updateEmployee">
update t_emp set emp_salary=#{empSalary} where emp_id=#{empId}
</update>
③对应关系
6、Map类型参数
①Mapper接口中抽象方法的声明
int updateEmployeeByMap(Map<String, Object> paramMap);
②SQL语句
<update id="updateEmployeeByMap">
update t_emp set emp_salary=#{empSalaryKey} where emp_id=#{empIdKey}
</update>
③junit测试
@Test
public void testUpdateEmpNameByMap() {
EmployeeMapper mapper = session.getMapper(EmployeeMapper.class);
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("empSalaryKey", 999.99);
paramMap.put("empIdKey", 5);
int result = mapper.updateEmployeeByMap(paramMap);
log.info("result = " + result);
}
④对应关系
#{}中写Map中的key
⑤使用场景
有很多零散的参数需要传递,但是没有对应的实体类类型可以使用。使用@Param注解一个一个传入又太麻烦了。所以都封装到Map中。
标签:语句,实体类,类型,int,获取,参数,emp,SQL,Mybatis06 From: https://www.cnblogs.com/Ashen-/p/17117800.html