Explicar el problema de paso de parámetros de Mybatis en detalle

Software de compilación: IntelliJ IDEA 2019.2.4 x64
Sistema operativo: win10 x64-bit Home Edition
Versión Maven: apache-maven-3.6.3
Versión Mybatis: 3.5.6



1. Problema de paso de parámetros en Mybatis

1.1 Pasar un único parámetro común

Para un solo parámetro común, siempre que su tipo de datos sea un tipo de datos básico de Java, un tipo contenedor, un tipo de cadena, etc. Siéntase libre de usarlo con valentía para aprobar, porque MyBatis puede usar este parámetro directamente sin ningún procesamiento. Y no está restringido por el nombre del parámetro , es decir, puede nombrarlo arbitrariamente, pero generalmente sigue el principio de ver el nombre y conocer el significado.

El código de ejemplo es el siguiente:

<select id="selectUsers" resultType="User">
  select id, username, password
  from users
  where id = #{id}
</select>

En el código anterior, la identificación en "#{id}" se puede nombrar arbitrariamente y el parámetro se puede pasar a la identificación en el programa, siempre que su tipo de datos se ajuste a (tipo de datos básicos de Java, tipo de paquete, tipo de cadena) entre En primer lugar, MyBatis puede utilizar directamente este parámetro para pasarlo a la sentencia SQL.

1.2 Pasar múltiples parámetros comunes

Para cualquier número de parámetros, MyBatis lo reempaquetará en un Mapa. La clave de Map es param1, param2 o arg0, arg1. El valor correspondiente es el valor del parámetro.

Caso de uso: encuentre la información del empleado correspondiente en la base de datos de acuerdo con el nombre y el salario del empleado

① Primero defina el método para encontrar la información del empleado correspondiente según el nombre y el salario del empleado en la interfaz del Mapeador

El ejemplo de código es el siguiente:

//根据员工姓名与员工薪资来查查找相应的员工
public Employee selectEmployeeByNameandSalary(String lastName,double salary);

② Definir sql relacionado en el archivo de mapeo

<select id="selectEmployeeByNameandSalary" resultType="mybatis.pojo.Employee">
    select
        id,
        last_name ,
        email,
        salary
    from
        tbl_employee
    where last_name=#{param1}
          and
          salary=#{param2}
</select>

③ prueba

@Test
public void test2(){
    
    
    try {
    
    
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //通过SqlSessionFactory对象调用openSession();
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //获取EmployeeMapper的代理对象
        EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);

        Employee employee = employeeMapper.selectEmployeeByNameandSalary("李四", 9000);
        System.out.println(employee);

    } catch (IOException e) {
    
    
        e.printStackTrace();
    }
}

inserte la descripción de la imagen aquí

1.3 Parámetros con nombre

gramática:

@Param(value="参数名")
@Param("参数名")

Ubicación:

Declarado antes de los parámetros formales del método en la interfaz XXXMapper

Aviso:

  • Su paquete subyacente es la estructura Map
  • Los parámetros con nombre admiten parámetros [param1, param2, ...], pero no [arg0, arg1 ...]

Código de muestra:

①Escritura de código correspondiente de la interfaz del mapeador

//根据员工姓名与员工薪资来查查找相应的员工
public List<Employee> showEmpByName(@Param("lName") String lastName,@Param("salary") double salary);

② SQL escrito en el archivo de mapeo correspondiente a la interfaz

Versión 1 (los parámetros no usan param1, param2):

<select id="showEmpByName" resultType="mybatis.pojo.Employee">
    select
    id,
        last_name ,
        email,
        salary
    from
        tbl_employee
    //#{lName}里是Mapepr接口中对应方法形参中@Param("lName")里的值    
    where 
    	last_name=#{lName}
    and
        salary=#{salary}
</select>

Versión 2 (use param1, param2 como parámetros):

 <select id="showEmpByName" resultType="mybatis.pojo.Employee">
        select
            id,
            last_name ,
            email,
            salary
        from
            tbl_employee
        where
            last_name=#{param1}
        and
            salary=#{param2}
    </select>

Versión 3 (los parámetros usan arg0, arg1)

 <select id="showEmpByName" resultType="mybatis.pojo.Employee">
        select
        id,
            last_name ,
            email,
            salary
        from
            tbl_employee
        where
            last_name=#{arg0}
        and
            salary=#{arg1}
    </select>

③ prueba

	@Test
    public void test4(){
    
    
        try {
    
    
            //从当前类下寻找并加载mybatis-config.xml(核心配置文件)
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

            //通过SqlSessionFactory对象调用openSession()获取sqlsession对象
            SqlSession sqlSession = sqlSessionFactory.openSession();
            //sqlsession对象使用getMapper(),传入EmployeeMapper的反射对象以获取代理对象
            EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);

            //使用其代理对象调用showEmpByName()通过员工姓名与薪资去查找相应的员工
            List<Employee> jack = employeeMapper.showEmpByName("jack", 9000);
            System.out.println(jack);

        } catch (IOException e) {
    
    
            e.printStackTrace();
        }
    }

inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí

inserte la descripción de la imagen aquí

1.4 Paso de parámetros POJO (java Bean)

Mybatis admite parámetros de entrada POJO [Java Bean] y la clave de parámetro es un atributo en POjO

Caso de uso: según el caso de uso en el resumen 1.2, modifique el parámetro formal del método en la interfaz Mapper al tipo Empleado, y solo modifique el código sql y de prueba correspondiente en el archivo de mapeo

① Modifique el tipo de parámetro formal del método en la interfaz Mapper a Employee

El ejemplo de código es el siguiente:

//根据员工姓名与员工薪资来查查找相应的员工
public Employee selectEmployeeByNameandSalary(Employee employee);

② Modifique el sql correspondiente en el archivo de mapeo

<select id="selectEmployeeByNameandSalary" resultType="mybatis.pojo.Employee">
    select
        id,
        last_name ,
        email,
        salary
    from
    	tbl_employee
    where 
    	last_name=#{lastName}
   and
    	salary=#{salary}
</select>

③ prueba

@Test
public void test3(){
    
    
    try {
    
    
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //通过SqlSessionFactory对象调用openSession();
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //获取EmployeeMapper的代理对象
        EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);

        Employee employee=new Employee();
        employee.setSalary(5600.0);
        employee.setLastName("jack");

        Employee jack = employeeMapper.selectEmployeeByNameandSalary(employee);

        System.out.println(jack);

    } catch (IOException e) {
    
    
        e.printStackTrace();
    }
}

inserte la descripción de la imagen aquí

1.5 Paso de parámetros del mapa

Mybatis admite la entrada directa de elementos del tipo de colección Mapa, y la clave del mapa es la clave del parámetro

Aviso:

Mybatis no admite la sobrecarga de métodos, ya que si hay un sql con el mismo método en el archivo de mapeo correspondiente a la interfaz xxxMapper en Mybatis, su valor de id no puede permanecer único y se producirán conflictos.

Ejemplo de uso: Basado en el caso de la Sección 1.2, esta vez use la colección Map como un parámetro formal, escriba el sql correspondiente en el archivo de mapeo correspondiente y pruébelo

El ejemplo de código es el siguiente:

① Use la colección de mapas como un parámetro formal para pasar

//根据员工姓名与员工薪资来查查找相应的员工
public List<Employee> showEmpByMap(Map<String,Object> map);

② Escriba el sql correspondiente en el archivo de mapeo correspondiente

<select id="showEmpByMap" resultType="mybatis.pojo.Employee">
    select
        id,
        last_name ,
        email,
        salary
    from
    tbl_employee
    where last_name=#{lastName} and  salary=#{salary}
</select>

③ prueba

@Test
public void test5() {
    
    
    try {
    
    
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //通过SqlSessionFactory对象调用openSession();
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //获取EmployeeMapper的代理对象
        EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);

        Map<String,Object> map=new HashMap<>();
        map.put("lastName","jack");
        map.put("salary",5600);

        List<Employee> jack = employeeMapper.showEmpByMap(map);
        System.out.println(jack);

    } catch (IOException e) {
    
    
        e.printStackTrace();
    }
}

inserte la descripción de la imagen aquí

1.6 Collection, List & Array y otros parámetros de paso

Cuando el tipo de datos del parámetro de entrada es Colección, Lista o Matriz, etc., puede usar directamente el alias de tipo personalizado incorporado (colección, lista, matriz) correspondiente a mybatis en la parte sql correspondiente del archivo de mapeo correspondiente, o puede puede usar parámetros con nombre para personalizar Defina el nombre.

Caso de uso: Obtener información de empleados a través de múltiples identificaciones [EmpIds: una colección de identificaciones de empleados]

El ejemplo de código es el siguiente:

a. Defina el método correspondiente en la interfaz de EmployeeMapper

/**
 * 通过多个id获取员工的信息 【EmpIds:员工id的集合】
 * @param EmpIds
 * @return
 */
public List<Employee> selectEmpByIds(@Param("ids") List<Integer> EmpIds);

b. Defina el sql correspondiente en el archivo de mapeo correspondiente a la interfaz de EmployeeMapper

 <select id="selectEmpByIds" resultType="employee">
        SELECT
            `id`,
            `last_name`,
            `email`,
            `salary`,
            `dept_id`
        FROM
            `tbl_employee`
        <where>
            `id` in
            (
            <foreach collection="ids" item="id" separator=",">
                #{id}
            </foreach>
            )
        </where>
    </select>

C. prueba

@Test
public void test04(){
    
    
    try {
    
    
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        //通过SqlSessionFactory对象调用openSession();
        SqlSession sqlSession = sqlSessionFactory.openSession();

        //获取EmployeeMapper的代理对象
        EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);

        List<Employee> employees = employeeMapper.selectEmpByOneOpr(1);
        System.out.println(employees);

    } catch (IOException e) {
    
    
        e.printStackTrace();
    }
}

inserte la descripción de la imagen aquí


2. El uso de # y $ en el paso de parámetros de Mybatis

2.1 La diferencia entre # y $

  • #: el objeto que ejecuta instrucciones SQL en la capa inferior usa PreparedStatementd para precompilar SQL para evitar riesgos de seguridad de inyección SQL, lo cual es relativamente seguro.
  • $: el objeto de ejecución de sentencia SQL subyacente utiliza el objeto Statementi, que no resuelve el riesgo de seguridad de la inyección de SQL y es relativamente inseguro.

2.2 Escenarios de uso de # y $

Tome la consulta SQL como ejemplo:

select col,col2 from table1 where col=? and col2=group by? order bylimit?,?

Escenas a utilizar:

  • “#”Escenario de uso: se pueden usar todas las posiciones de marcador de posición en el Sql anterior#
  • “$”Escenario de uso: #los problemas de paso de parámetros no resueltos se pueden entregar para $manejar [como un formulario dinámico]

El código de ejemplo es el siguiente:

public List<Employee> selectEmpByDynamitTable(@Param("tblName")String tblName);
<select id="selectEmpByDynamitTable" resultType="employee">
	SELECT
        id,
        last_name,
        email,
        salary
	FROM
		${tb1Name}
</select>

Nota:

En Mybatis, el símbolo $ también es un símbolo utilizado para acceder a los valores e información de varios parámetros, variables, etc., y se utiliza principalmente en escenarios como la construcción de SQL dinámico y el paso de parámetros , por ejemplo:

  • ${variable}: La parte de la instrucción dinámica utilizada para insertar variables o nombres de tablas/columnas, etc.
  • #{parameter}: declaración preparada para parámetros de marcador de posición
  • $方法名(): se utiliza para llamar al método definido en el fragmento de SQL y devolver el resultado

¿Por qué se dice que ${variable} se usa principalmente para insertar sentencias dinámicas?

analizado de manera diferente:

  • ${variable}: Muestra el valor del parámetro entrante directamente en la instrucción sql original sin comillas

    Por ejemplo, seleccione * de usuarios donde id= variable, pase {variable}, pasev a r iab l e , pase {1} => id=1

    El ejemplo de código es el siguiente:

     <select id="showEmpByMap" resultType="mybatis.pojo.Employee">
            select
                id,
                last_name ,
                email,
                salary
            from
            tbl_employee
            where last_name=${lastName} and  salary=${salary}
        </select>
    
    

    inserte la descripción de la imagen aquí
    inserte la descripción de la imagen aquí

  • #{variable}: es tratar el valor del parámetro entrante como una cadena y mostrarlo con comillas dobles

    Por ejemplo, seleccione * de usuarios donde id= variable, pase {variable}, pasev a r iab l e , pase {1} => id="1"

    El ejemplo de código es el siguiente:

     <select id="showEmpByMap" resultType="mybatis.pojo.Employee">
            select
                id,
                last_name ,
                email,
                salary
            from
            tbl_employee
            where last_name=#{lastName} and  salary=#{salary}
        </select>
    

    inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/siaok/article/details/130479856
Recomendado
Clasificación