MyBatis框架Mapper配置文件详解(二)

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

猜你喜欢

转载自blog.csdn.net/qq_34709784/article/details/108277663