Durante el proceso de desarrollo de SpringBoot, usamos ***Mapper.xml
+ ***Mapper.java
para encapsular operaciones en tablas de bases de datos CURD
. Normalmente, cada tabla tendrá un conjunto de archivos correspondiente.
1. Uso común de Mapper
El siguiente es un ejemplo de una operación de consulta:
- Tabla de datos
t_sap_customer
con campos en la tabla.id、code、name、create_time、update_time、last_ver、is_valid
- Ahora necesitamos consultar un dato
id
basado enis_valid
Código TSapCustomerMapper.java:
package com.starcharge.repository.db1.product.mapper;
import com.starcharge.repository.db1.product.domain.TSapCustomerDO;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
@Repository
public interface TSapCustomerMapper {
TSapCustomerDO detail(String id,String isValid);
}
Código TSapCustomerMapper.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="com.abc.repository.db1.product.mapper.TSapCustomerMapper">
<!-- 创建数据库与实体类字段对应关系 -->
<resultMap id="BaseResultMap" type="com.abc.repository.db1.product.domain.TSapCustomerDO">
<result property="id" column="id"/>
<result property="name" column="name" jdbcType="VARCHAR"/>
<result property="createTime" column="create_time" jdbcType="VARCHAR"/>
<result property="updateTime" column="update_time" jdbcType="VARCHAR"/>
<result property="lastVer" column="last_ver" jdbcType="VARCHAR"/>
<result property="isValid" column="is_valid" jdbcType="VARCHAR"/>
</resultMap>
<!--查询列表-->
<select id="detail" resultMap="BaseResultMap">
select
id,code,name,last_ver,is_valid,create_time,update_time
from t_sap_customer
where is_valid = #{isValid} and id = #{id}
</select>
</mapper>
Lo anterior TSapCustomerMapper.java
y TSapCustomerMapper.xml
son un conjunto de t_sap_customer
operaciones de clase de entidad para tablas de bases de datos, *Mapper.java
responsables de definir la API externa de la clase de entidad y responsables de implementar declaraciones SQL de operaciones *Mapper.xml
específicas .CURD
Los dos usan los valores de atributo en el archivo xml id
para mapear, específicamente los métodos TSapCustomerMapper
en la interfaz , y los correspondientes se encontrarán en el archivo para su ejecución.detail
xml
id='detail'
2. Método de entrada del parámetro Mapper.xml
Un problema común aquí es que tendremos SQL
varios parámetros de entrada durante la ejecución, entonces, ¿cómo pasamos api
los parámetros de entrada xml
al archivo? Consulte la introducción a continuación.
1. Transferencia de parámetros sencilla
TSapCustomerMapper.java
Entre y TSapCustomerMapper.xml
, los parámetros se ingresan según sus nombres de forma predeterminada .
Los siguientes parámetros de entrada pueden ejecutarse normalmente:
//TSapCustomerMapper.java
@Repository
public interface TSapCustomerMapper {
TSapCustomerDO detail(String id, String isValid);
}
//TSapCustomerMapper.xml
<select id="detail" resultMap="BaseResultMap">
select
id,code,name,last_ver,is_valid,create_time,update_time
from t_sap_customer
where is_valid = #{
isValid} and id = #{
id}
</select>
2. @Param pasando parámetros
//TSapCustomerMapper.java
@Repository
public interface TSapCustomerMapper {
TSapCustomerDO detail(@Param("id1") String id, @Param("isValid1") String isValid);
}
//TSapCustomerMapper.xml
<select id="detail" resultMap="BaseResultMap">
select
id,code,name,last_ver,is_valid,create_time,update_time
from t_sap_customer
where is_valid = #{
isValid1} and id = #{
id1}
</select>
3. Parámetros de entrada del mapa
//SapCustomerImpl.java
@Service
public class SapCustomerImpl implements SapCustomerService {
@Override
public TSapCustomerDO detail(String id) {
HashMap<String,String> map=new HashMap<String,String>();
map.put("id",id);
map.put("isValid","2");
TSapCustomerDO r = sapCustomerMapper.detail(map);
return r;
}
}
//TSapCustomerMapper.java
@Repository
public interface TSapCustomerMapper {
TSapCustomerDO detail(HashMap query);
}
//TSapCustomerMapper.xml
<select id="detail" resultMap="BaseResultMap">
select
id,code,name,last_ver,is_valid,create_time,update_time
from t_sap_customer
where is_valid = #{
isValid} and id = #{
id}
</select>
4. Parámetros, parámetros de entrada arg
arg0...argN
De forma predeterminada , se pasarán param1...paramN
dos parámetros de entrada que utilizan el índice en el archivo xml. arg
A partir de 0, param
a partir de 1.
//TSapCustomerMapper.java
@Repository
public interface TSapCustomerMapper {
TSapCustomerDO detail(String id, String isValid);
}
//TSapCustomerMapper.xml
<select id="detail" resultMap="BaseResultMap">
select
id,code,name,last_ver,is_valid,create_time,update_time
from t_sap_customer
where is_valid = #{
param2} and id = #{
param1}
</select>
5. Entrada de parámetros simple + entrada de parámetros de mapa
//SapCustomerImpl.java
@Service
public class SapCustomerImpl implements SapCustomerService {
@Override
public TSapCustomerDO detail(String id) {
HashMap<String,String> map=new HashMap<String,String>();
map.put("isValid","2");
TSapCustomerDO r = sapCustomerMapper.detail(id, map);
return r;
}
}
//TSapCustomerMapper.java
@Repository
public interface TSapCustomerMapper {
TSapCustomerDO detail(String id, HashMap map);
}
//TSapCustomerMapper.xml
<select id="detail" resultMap="BaseResultMap">
select
id,code,name,last_ver,is_valid,create_time,update_time
from t_sap_customer
where is_valid = #{
map.isValid} and id = #{
id}
</select>
3. La diferencia entre #{} y ${}
En MyBatis, tanto #{ } como ${ } se pueden usar para pasar parámetros dinámicamente.
1. Diferencias
#{}
Corresponde al objeto subyacente utilizado jdbc
para PreparedStatementd
ejecutar declaraciones SQL. En SQL, es equivalente a un marcador de posición de parámetro "?", que se utiliza para completar la declaración precompilada. Cuando completa la declaración preparada, se puede entender que utiliza comillas simples en ambos extremos del valor del parámetro. #{}
Además de escribir el nombre del parámetro recibido, también puede configurar javaType
, jdbcType
, mode
etc.
${}
La ejecución de declaraciones correspondientes a los objetos utilizados en la capa inferior jdbc
es simplemente unir cadenas. La compilación y ejecución se realizarán solo después de que se complete el empalme, por lo que el rendimiento es bajo y no se puede reutilizar. Pero todavía hay algunas áreas en las que no eres competente y aún debes completarlas.Statement
sql
SQL
#{ }
${ }
2. Conclusión
#{}
Previene en gran medida la inyección sql
y mejora la seguridad del sistema. #
No lo use donde generalmente se puede usar $
.
${}
No se puede evitar la inyección. Si el contenido del parámetro de la declaración Sql
escrita debe usarse como parte de la declaración, debe usarse en este momento , como: nombre de tabla, campo de clasificación, agrupación , etc.SQL
SQL
$
order by
group by