1. 参数(#{参数名})
#{}实现的是向prepareStatement中的预处理语句中设置参数值,sql语句中#{}表示一个占位符即?
使用#{参数名},将参数的内容添加到sql语句中指定位置.
如果当前sql语句中只有一个参数,此时参数名称可以随意定义
但是,如果当前sql语句有多个参数,此时参数名称应该是与当前表关联[实体类的属性名]或则[Map集合关键字]
上述SQL语句在调用时,我们可以分别采用如下两种方式输入参数
(1)使用#{}读取实体类对象属性内容
(2)使用#{}读取map集合中关键字的值
2. #{}和${}区别#
在MyBatis中提供了两种方式读取参数的内容到SQL语句中,分别是
#{参数名} :实体类对象或则Map集合读取内容
${参数名} :实体类对象或则Map集合读取内容
为了能够看到两种方式的区别,需要看到MyBatis执行时输送的SQL情况.因此
需要借助Log4J日志进行观察
接下来,我们可以查看
输出结果
从这里我们可以看出两者的区别:
#{} : 采用预编译方式,可以防止SQL注入
${}: 采用直接赋值方式,无法阻止SQL注入攻击
在大多数情况下,我们都是采用#{}读取参数内容.但是在一些特殊的情况下,我们还是需要使用${}读取参数的.
比如 有两张表,分别是emp_2017 和 emp_2018 .如果需要在查询语句中动态指定表名,就只能使用${}
<select>
select * from emp_${year}
<select>
1 <select id="deptFind2" resultType="Dept">
2 select * from ${value}
3 </select>
再比如.需要动态的指定查询中的排序字段,此时也只能使用${}
<select>
select * from dept order by ${name}
</select>
简单来说,在JDBC不支持使用占位符的地方,都可以使用${}
2.3 resultMap
MyBatis框架中是根据表中字段名到实体类定位同名属性的.如果出现了实体类属性名与表中字段名不一致的情况,则无法自动进行对应.此时可以使用resultMap来重新建立实体类与字段名之间对应关系.
<!-- property对应实体类的属性名称,column为数据库结果集的列的名称 -->
EmpMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.sang.dao.EmpMapper">
<resultMap type="Employee" id="empMap">
<constructor>
<arg column="hireDate" javaType="java.util.Date" />
</constructor>
</resultMap>
<select id="empFind" resultMap="empMap">
select * from emp2
</select>
</mapper>
EmpMapper.java
package org.sang.dao;
import org.sang.entity.Employee;
import java.util.List;
/**
* @author: wangxiaobo
* @create: 2020-08-28 16:46
**/
public interface EmpMapper {
public List<Employee> empFind();
}
package org.sang.entity;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* @author: wangxiaobo
* @create: 2020-08-28 16:49
**/
public class Employee {
private Integer empNo;
private String ename;
private String job;
private Double sal;
private Date hireDate;
// 职员工作年限
private int workAge;
// 构造函数
public Employee(Date tempDate) {
this.hireDate = tempDate;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
this.workAge = Integer.valueOf(sdf.format(new Date())) - Integer.valueOf(sdf.format(tempDate));
}
public Integer getEmpNo() {
return empNo;
}
public void setEmpNo(Integer empNo) {
this.empNo = empNo;
}
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
public Double getSal() {
return sal;
}
public void setSal(Double sal) {
this.sal = sal;
}
public Date getHireDate() {
return hireDate;
}
public void setHireDate(Date hireDate) {
this.hireDate = hireDate;
}
public int getWorkAge() {
return workAge;
}
public void setWorkAge(int workAge) {
this.workAge = workAge;
}
}