mybatis获取表名——mybatis动态调用表名和字段名#{},${}

一直在使用Mybatis这个ORM框架,都是使用mybatis里的一些常用功能。今天在项目开发中有个业务是需要限制各个用户对某些表里的字段查询以及某些字段是否显示,如某张表的某些字段不让用户查询到。这种情况下,就需要构建sql来动态传入表名、字段名了。现在对解决方法进行下总结,希望对遇到同样问题的伙伴有些帮助。

动态SQL是mybatis的强大特性之一,mybatis在对sql语句进行预编译之前,会对sql进行动态解析,解析为一个BoundSql对象,也是在此处对动态sql进行处理。下面让我们先来熟悉下mybatis里**#{}与${}**的用法:

在动态sql解析过程,#{}与${}的效果是不一样的:

#{ } 解析为一个 JDBC 预编译语句(prepared statement)的参数标记符。

如以下sql语句

select * from user where name = #{name};

会被解析为:

select * from user where name = ?;

可以看到#{}被解析为一个参数占位符?。

${ } 仅仅为一个纯碎的 string 替换,在动态 SQL 解析阶段将会进行变量替换

如以下sql语句:

select * from user where name = ${name};

当我们传递参数“sprite”时,sql会解析为:

select * from user where name = "sprite";

可以看到预编译之前的sql语句已经不包含变量name了。

综上所得

${ } 的变量的替换阶段是在动态 SQL 解析阶段,而 #{ }的变量的替换是在 DBMS 中。

#{}与${}的区别可以简单总结如下:

#{}将传入的参数当成一个字符串,会给传入的参数加一个双引号

${}将传入的参数直接显示生成在sql中,不会添加引号

#{}能够很大程度上防止sql注入,${}无法防止sql注入

${}在预编译之前已经被变量替换了,这会存在sql注入的风险。如下sql

select * from ${tableName} where name = ${name}

如果传入的参数tableName为user; delete user; --,那么sql动态解析之后,预编译之前的sql将变为:

select * from user; delete user; --where name = ?;

–之后的语句将作为注释不起作用,顿时我和我的小伙伴惊呆了!!!看到没,本来的查询语句,竟然偷偷的包含了一个删除表数据的sql,是删除,删除,删除!!!重要的事情说三遍,可想而知,这个风险是有多大。

${}一般用于传输数据库的表名、字段名等

能用#{}的地方尽量别用${}

进入正题,通过上面的分析,相信大家可能已经对如何动态调用表名和字段名有些思路了。示例如下:

select ${columns}  from  ${tableName}where COMPANY_REMARK =${company}

要实现动态调用表名和字段名,就不能使用预编译了,需添加statementType=“STATEMENT”" 。

statementType:STATEMENT(非预编译),PREPARED(预编译)或CALLABLE中的任意一个,这就告诉 MyBatis 分别使用Statement,PreparedStatement或者CallableStatement。默认:PREPARED。这里显然不能使用预编译,要改成非预编译。

其次,sql里的变量取值是${xxx},不是#{xxx}。

因为${}是将传入的参数直接显示生成sql,如${xxx}传入的参数为字符串数据,需在参数传入前加上引号,如:

String name = “sprite”;

name= “’” + name + “’”;

mybatis动态调用表名和字段名,还可以应用于日志的收集上,如数据库的日志表,每隔一个月动态建一个日志表,表名前缀相同(如log_201610,log_201611等),这样实现日志的分月分表存储,方便日志的分析。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/557011.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

浙大计算机学院辅导员,浙大博士应聘辅导员被指丢脸 月薪仅1000元

浙江在线05月02日讯 浙江大学动物营养与饲料科学专业博士生冯一秦这两天正在准备博士论文答辩,他已经找好了工作单位——在工商大学当大学生辅导员,一度成为浙大BBS头条新闻——高职低聘,很丢脸吗?网友跟帖:这样的博士…

html5 中 video 标签,H5页面中 video 标签的坑

兼容性差因为是原生组件层级最高iOS系统 和 安卓系统展示方式不一样整理了一些有效的方法关于 标签的 css 样式//全屏按钮video::-webkit-media-controls-fullscreen-button {display: none;}//播放按钮video::-webkit-media-controls-play-button {display: none;}//进度条vid…

男孩读计算机好还是铁路学校好,中专学计算机好还是铁路好?

随着石家庄通用交通学校春季招生火热进行中,有很多同学会在微信上咨询武老师一些学校的问题,比如说选什么专业好,将来哪个专业比较好找工作等等,最近在咨询中,有个同学想学铁路专业也想学计算机专业,就很纠…

谈谈对 Spring 的理解

认识 Spring 框架 Spring 框架是 Java 应用最广的框架,它的成功来源于理念,而不是技术本身,它的理念包括 IoC (Inversion of Control,控制反转) 和 AOP(Aspect Oriented Programming,面向切面编程)。 什么是 Spring&…

计算机与体育教育的关系,体育教学论文:健康教育与体育教育存在的问题研究...

摘要:确立“健康第一”的指导思想,使体育与健康教育相结合,使教育过程与教育目标、手段相统一,是当今世界经济发达国家学校体育工作的共同特点,也是学校体育学科发展的必然。该文通过《体育与健康》课改过程中尚存问题的研究,提出相应的对策,以实现体育教育向素质教…

Spring中@Autowired和@Resource的区别

一、定义 Autowired 对类成员变量、方法及构造函数进行标注,完成自动装配的工作。 Resource 在语义上被定义为通过其唯一的名称来标识特定的目标组件,其中声明的类型与匹配过程无关。 如果没有明确指定名称,则默认名称是从字段名称或设置…

全国计算机考试真考题库4,全国计算机等级考试无纸化真考题库试卷二级C--(4)资料.docx...

精品文档精品文档PAGEPAGE #欢迎下载全国计算机等级考试无纸化真考题库试卷(4)二级 C(考试时间120分钟,满分100分)一、选择题(每小题1分,共40分)(1)下列数据结构中,属于非线性结构的是()。A)循环队列B)带链队列C)二叉树D)带链栈⑵下列数据结构…

Java面试题大全

一、Java 基础 1. JDK 和 JRE 有什么区别? JDK:Java Development Kit 的简称,java 开发工具包,提供了 java 的开发环境和运行环境。JRE:Java Runtime Environment 的简称,java 运行环境,为 ja…

每个计算机系的学生都学离散数学,离散数学一阶逻辑精要.ppt

离散数学一阶逻辑精要.ppt2.谓词公式 中量词 的辖域是( ). A. B. C. D. 3.谓词公式 中变元 是( ). A. 自由变元 B. 约束变元 C. 既不是自由变元也不是约束变元 D. 既是自由变元也是约束变元 4.若个体域为整数域,下列公式中真值为1的是 ( ). A. B. C. D. 5. 设A(x):x…

压力测试软件je,Jemeter压力测试工具

![JMeter](https://img.tnblog.net/arcimg/hb/fcfd7c903b184e5e9db56360fed8c7a7.png "JMeter")>#Jemeter 压力测试工具[TOC]JMeter 简介------------>阿帕奇JMeter的?应用程序是开源软件,100%纯Java应用而设计的负载测试功能行为和测量…

Java面试题整理(附参考答案)

1、面向对象的特征有哪些方面? 抽象:将同类对象的共同特征提取出来构造类。继承:基于基类创建新类。封装:将数据隐藏起来,对数据的访问只能通过特定接口。多态性:不同子类型对象对相同消息作出不同响应。 …

沈阳药科大学计算机二级好考吗,沈阳药科大学考研难吗?一般要什么水平才可以进入?...

沈阳药科大学考考研难吗?其实并不能一概而论。要看我们每个学生的实际情况。例如:本科院校是哪个层级的,专业考取是否为跨专业?专业是否是热门学科?学校分数线是多少?历年录取人数是多少?接下来…

SpringMVC源码之参数解析绑定原理

SpringMVC源码之参数解析绑定原理 摘要 本文从源码层面简单讲解SpringMVC的参数绑定原理 SpringMVC参数绑定相关组件的初始化过程 在理解初始化之前,先来认识一个接口 HandlerMethodArgumentResolver 方法参数解析器接口,这个接口是SpringMVC参数解…

win7 找不到 计算机策略组,win7打开组策略报错:找不到资源string.Advanced_EnableSSL3Fallback...

今天要在组策略里关闭几个端口,每次打开组策略时都弹出一个错误提示框,说是找不到资源“string.Advanced_EnableSSL3Fallback”。找不到资源string.Advanced_EnableSSL3Fallback我的系统好好的,怎么会这样呢?一时间不知如何解决。…

@RequestParam 注解原理

RequestParam 注解原理 注:SpringMVC 版本 5.2.15 介绍 RequestParam 注解用于绑定请求参数。它的具体内容如下: // 该注解作用的方法形参 Target(ElementType.PARAMETER) Retention(RetentionPolicy.RUNTIME) Documented public interface RequestPar…

xbox虚拟服务器,Xbox One平台真相:原生Win8/虚拟化运行

Xbox One搭载的是Windows8吗?没错。在Build2014开发者大会上,Frank Savage介绍Xbox One平台未来的开发计划,其中他也揭秘Xbox One平台运行原生Win8系统,那些主机游戏均采用虚拟化技术加载运行。据国外wccftech科技网站透露&#x…

SpringMVC 执行流程解析

SpringMVC 执行流程解析 注:SpringMVC 版本 5.2.15 上面这张图许多人都看过,本文试图从源码的角度带大家分析一下该过程。 1. ContextLoaderListener 首先我们从 ContextLoaderListener 讲起,它继承自 ServletContextListener,用…

无线网服务器mac是什么,电脑MAC和LAN MAC以及WIRELESS MAC是什么关系?

满意答案刘义芳aaa推荐于 2017.12.14采纳率:51% 等级:12已帮助:19753人一楼和二楼的回答都是对的电脑MAC这样说不好理解的,应该说MAC电脑,MAC是Macintosh这个的前三个字母,至于它为什么只用前三个字母做…

mybatis 中 foreach collection的三种用法

foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。 foreach元素的属性主要有 item,index,collection,open,separator,close。 item表示集合中每一个元素进行迭代时的别名,i…

@RequestParam详解

RequestParam 主要用于将请求参数区域的数据映射到控制层方法的参数上 首先我们需要知道RequestParam注解主要有哪些参数 value:请求中传入参数的名称,如果不设置后台接口的value值,则会默认为该变量名。比如上图中第一个参数如果不设置va…