网站建设需要洽谈什么,frog 网站建设,如何开发一个微网站,手机版oa系统在SpringBoot开发过程中#xff0c;我们使用 ***Mapper.xml***Mapper.java 来封装对数据库表的 CURD 操作#xff0c;正常每张表会有一组对应的文件。
一、Mapper常见用法
下面例举一个查询操作#xff1a;
数据表t_sap_customer#xff0c;表中有字段id、code、name、c…在SpringBoot开发过程中我们使用 ***Mapper.xml***Mapper.java 来封装对数据库表的 CURD 操作正常每张表会有一组对应的文件。
一、Mapper常见用法
下面例举一个查询操作
数据表t_sap_customer表中有字段id、code、name、create_time、update_time、last_ver、is_valid现在需要根据id、is_valid来查询一条数据
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);
}TSapCustomerMapper.xml 代码
?xml version1.0 encodingUTF-8 ?
!DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd
mapper namespacecom.abc.repository.db1.product.mapper.TSapCustomerMapper!-- 创建数据库与实体类字段对应关系 --resultMap idBaseResultMap typecom.abc.repository.db1.product.domain.TSapCustomerDOresult propertyid columnid/result propertyname columnname jdbcTypeVARCHAR/result propertycreateTime columncreate_time jdbcTypeVARCHAR/result propertyupdateTime columnupdate_time jdbcTypeVARCHAR/result propertylastVer columnlast_ver jdbcTypeVARCHAR/result propertyisValid columnis_valid jdbcTypeVARCHAR//resultMap!--查询列表--select iddetail resultMapBaseResultMapselectid,code,name,last_ver,is_valid,create_time,update_timefrom t_sap_customerwhere is_valid #{isValid} and id #{id}/select
/mapper上面TSapCustomerMapper.java和TSapCustomerMapper.xml就是一组针对数据库表t_sap_customer的实体类操作*Mapper.java负责定义实体类的对外Api*Mapper.xml负责实现具体的CURD操作的SQL语句。
两者使用xml文件中的id属性值来做映射对应具体来说就是TSapCustomerMapper接口中的detail方法会到xml文件中找到对应的iddetail来执行。
二、mapper.xml入参方法
这里常见的一个问题是我们在执行SQL的时候会有各种入参那么我们要如何将api中的入参传入xml文件中请看下面介绍。
1、简单传参
TSapCustomerMapper.java和TSapCustomerMapper.xml 之间默认按照参数名入参。
以下的入参都是可以正常运行的
//TSapCustomerMapper.java
Repository
public interface TSapCustomerMapper {TSapCustomerDO detail(String id, String isValid);
}//TSapCustomerMapper.xmlselect iddetail resultMapBaseResultMapselectid,code,name,last_ver,is_valid,create_time,update_timefrom t_sap_customerwhere is_valid #{isValid} and id #{id}/select2、Param传参
//TSapCustomerMapper.java
Repository
public interface TSapCustomerMapper {TSapCustomerDO detail(Param(id1) String id, Param(isValid1) String isValid);
}//TSapCustomerMapper.xmlselect iddetail resultMapBaseResultMapselectid,code,name,last_ver,is_valid,create_time,update_timefrom t_sap_customerwhere is_valid #{isValid1} and id #{id1}/select3、Map入参
//SapCustomerImpl.java
Service
public class SapCustomerImpl implements SapCustomerService { Overridepublic TSapCustomerDO detail(String id) {HashMapString,String mapnew HashMapString,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.xmlselect iddetail resultMapBaseResultMapselectid,code,name,last_ver,is_valid,create_time,update_timefrom t_sap_customerwhere is_valid #{isValid} and id #{id}/select4、param、arg入参
xml文件中默认会传入arg0...argN、param1...paramN两个使用索引的入参。arg从0开始param从1开始。
//TSapCustomerMapper.java
Repository
public interface TSapCustomerMapper {TSapCustomerDO detail(String id, String isValid);
}//TSapCustomerMapper.xmlselect iddetail resultMapBaseResultMapselectid,code,name,last_ver,is_valid,create_time,update_timefrom t_sap_customerwhere is_valid #{param2} and id #{param1}/select5、简单入参Map入参
//SapCustomerImpl.java
Service
public class SapCustomerImpl implements SapCustomerService { Overridepublic TSapCustomerDO detail(String id) {HashMapString,String mapnew HashMapString,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.xmlselect iddetail resultMapBaseResultMapselectid,code,name,last_ver,is_valid,create_time,update_timefrom t_sap_customerwhere is_valid #{map.isValid} and id #{id}/select三、#{} 和 ${} 的区别
MyBatis中 #{ }和${ }都可以用来动态传递参数。
1、不同点
#{} 对应底层使用 jdbc的PreparedStatementd 对象来执行sql语句在SQL中相当于一个参数占位符“?”用来补全预编译语句。它补全预编译语句时可以理解为在此参数值两端统统使用单引号引起来。 #{} 里除了可以写接收参数的名称外还可以设置javaTypejdbcTypemode等。
${} 对应底层使用 jdbc的Statement 对象来执行sql语句就是单纯的字符串拼接拼接完成后才会对SQL进行编译、执行所以性能较低也无法复用。但是在有些 #{ }无法胜任的地方还是会需要${ }来完成。
2、结论
#{} 很大程度防止sql注入提高系统安全一般能用#的地方就别用$。
${} 无法防止Sql注入如果写的SQL语句的参数内容应该作为SQL的一部分此时必须使用$比如表名称order by 排序字段分组 group by 等。