mybatis开发dao层时给sql传参与接收返回值注意点

2024-09-01 10:18

本文主要是介绍mybatis开发dao层时给sql传参与接收返回值注意点,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

      首先介绍一下:
            
       一.     使用映射方式时,传入Map,map里放了几个字段,还有一个list
            
            这时使用foreach时,
            注意:
            1、首先  传入的集合,collection后的命名和 Map里塞list时的
                key保持一致
            2、list是集合,不能进行 != "" 的校验,因为它不是String,类型不同
            
            3、如果Map里的list里放的是字符串,则 #{ groupCode} 里放的就是 和Item命名一致
            
            4、如果Map里的list里放的是map,则 #{ groupCode} 里放的就是 Item命名.key
               这个key和list里放的map的key保持一致
            
            讲完入参,将返回值
            
              如果要返回 List<Map<String,Object>>    ,
              写 resultType = "java.util.Map"     或者 resultMap = "resultMap"    
              特别说明:resultMap里和实体类相互对应,如果写resultMap,则返回的map里字段必须是对应关系里有的,且字段名一致
                        另外,之所以有resultMap ,也是因为mybatis封装在这个可以把返回的map转换为对应的实体类对象,
                        所以,如果不写List<Map<String,Object>>接收返回的list,也可以使用List<实体类名>来接收
                        
                        
                        
            二:传的如果是实体类对象,则 paramterType="对象实体类的引用"
            

            三:sql中 # 和 $ 的区别:  #可以防止sql注入
                    #是占位符,在DBMS才进行替换,在预编译时使用?占位,能防止sql注入;       

delete from user where name = ?;而传入的参数将会经过PreparedStatement方法的强制类型检查和安全检查等处理,最后作为一个合法的字符串传入。在#{}预处理之后可以预防SQL注入传入username 为 xiaoming‘or’1=1,使用#{},经过sql动态解析和预编译,会把单引号转义为 ’ 那么sql最终解析为:delete from user where name = "xiaoming\' or \'1=1 ";

 

 $是拼接符,在动态sql解析阶段将会进行变量替换,有可能会引发sql注入

${}这种方式只是简单的字符串替换,在动态SQL解析阶段将会进行变量替换,假如传递的参数为xiaoming,
最终处理结果如下:
delete from user where name = 'xiaoming' ;预编译之前就已经被替换,有被注入的风险。如果传入的为那么使用{} 处理后直接替换字符串的sql就解析为:
delete from user where name = 'a' or '1=1' ;

     这样整个表的数据就会被干掉引发生产事故

这篇关于mybatis开发dao层时给sql传参与接收返回值注意点的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1126658

相关文章

MySQL 筛选条件放 ON后 vs 放 WHERE 后的区别解析

《MySQL筛选条件放ON后vs放WHERE后的区别解析》文章解释了在MySQL中,将筛选条件放在ON和WHERE中的区别,文章通过几个场景说明了ON和WHERE的区别,并总结了ON用于关... 今天我们来讲讲数据库筛选条件放 ON 后和放 WHERE 后的区别。ON 决定如何 "连接" 表,WHERE

mysql_mcp_server部署及应用实践案例

《mysql_mcp_server部署及应用实践案例》文章介绍了在CentOS7.5环境下部署MySQL_mcp_server的步骤,包括服务安装、配置和启动,还提供了一个基于Dify工作流的应用案例... 目录mysql_mcp_server部署及应用案例1. 服务安装1.1. 下载源码1.2. 创建独立

VSCode开发中有哪些好用的插件和快捷键

《VSCode开发中有哪些好用的插件和快捷键》作为全球最受欢迎的编程工具,VSCode的快捷键体系是提升开发效率的核心密码,:本文主要介绍VSCode开发中有哪些好用的插件和快捷键的相关资料,文中... 目录前言1、vscode插件1.1 Live-server1.2 Auto Rename Tag1.3

Mysql中RelayLog中继日志的使用

《Mysql中RelayLog中继日志的使用》MySQLRelayLog中继日志是主从复制架构中的核心组件,负责将从主库获取的Binlog事件暂存并应用到从库,本文就来详细的介绍一下RelayLog中... 目录一、什么是 Relay Log(中继日志)二、Relay Log 的工作流程三、Relay Lo

MySQL日志UndoLog的作用

《MySQL日志UndoLog的作用》UndoLog是InnoDB用于事务回滚和MVCC的重要机制,本文主要介绍了MySQL日志UndoLog的作用,文中介绍的非常详细,对大家的学习或者工作具有一定的... 目录一、Undo Log 的作用二、Undo Log 的分类三、Undo Log 的存储四、Undo

mybatis-plus分表实现案例(附示例代码)

《mybatis-plus分表实现案例(附示例代码)》MyBatis-Plus是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生,:本文主要介绍my... 目录文档说明数据库水平分表思路1. 为什么要水平分表2. 核心设计要点3.基于数据库水平分表注意事项示例

MySQL游标和触发器的操作流程

《MySQL游标和触发器的操作流程》本文介绍了MySQL中的游标和触发器的使用方法,游标可以对查询结果集进行逐行处理,而触发器则可以在数据表发生更改时自动执行预定义的操作,感兴趣的朋友跟随小编一起看看... 目录游标游标的操作流程1. 定义游标2.打开游标3.利用游标检索数据4.关闭游标例题触发器触发器的基

Mybatis的mapper文件中#和$的区别示例解析

《Mybatis的mapper文件中#和$的区别示例解析》MyBatis的mapper文件中,#{}和${}是两种参数占位符,核心差异在于参数解析方式、SQL注入风险、适用场景,以下从底层原理、使用场... 目录MyBATis 中 mapper 文件里 #{} 与 ${} 的核心区别一、核心区别对比表二、底

MySQL查看表的历史SQL的几种实现方法

《MySQL查看表的历史SQL的几种实现方法》:本文主要介绍多种查看MySQL表历史SQL的方法,包括通用查询日志、慢查询日志、performance_schema、binlog、第三方工具等,并... 目录mysql 查看某张表的历史SQL1.查看MySQL通用查询日志(需提前开启)2.查看慢查询日志3.

MySQL底层文件的查看和修改方法

《MySQL底层文件的查看和修改方法》MySQL底层文件分为文本类(可安全查看/修改)和二进制类(禁止手动操作),以下按「查看方法、修改方法、风险管控三部分详细说明,所有操作均以Linux环境为例,需... 目录引言一、mysql 底层文件的查看方法1. 先定位核心文件路径(基础前提)2. 文本类文件(可直