MyBatis——谈谈占位符(#、$)的理解与使用
文章目录:
1.#占位符
1.1 #占位符的特点
1.2 使用 #{ } 对数据库执行 update 操作
2.$占位符
2.1 $占位符的特点
2.2 使用 ${ } 对数据库执行 select 操作
3.#{ }、${ } 占位符的综合使用
1.#占位符
1.1 #占位符的特点
- MyBatis处理 #{ } 占位符,使用的 JDBC 对象是 PreparedStatement 对象,执行sql语句的效率更高。
- 使用 PreparedStatement 对象,能够避免 sql 注入,使得sql语句的执行更加安全。
- #{ } 常常作为列值使用,位于sql语句中等号的右侧;#{ } 位置的值与数据类型是相关的。
1.2 使用 #{ } 对数据库执行 update 操作
package com.bjpowernode.dao;import com.bjpowernode.entity.Student;/****/
public interface StudentDao {//更新学生信息int updateStudent(Student student);}
<!-- 更新学生信息 -->
<update id="updateStudent">update student set name=#{name},email=#{email} where id=#{id}
</update>
@Testpublic void testUpdateStudent() {SqlSession session=MyBatisUtil.getSqlSession();StudentDao studentDao=session.getMapper(StudentDao.class);Student student=new Student();student.setId(1003);student.setName("最强王者");student.setEmail("123456@qq.com");student.setAge(28);int rows=studentDao.updateStudent(student);session.commit();System.out.println("更新学生的rows === " + rows);session.close();}
2.$占位符
2.1 $占位符的特点
- MyBatis处理 ${ } 占位符,使用的 JDBC 对象是 Statement 对象,执行sql语句的效率相对于 #{ } 占位符要更低。
- ${ } 占位符的值,使用的是字符串连接的方式,有 sql 注入的风险,同时也存在代码安全的问题。
- ${ } 占位符中的数据是原模原样的,不会区分数据类型。
- ${ } 占位符常用作表名或列名,这里推荐在能保证数据安全的情况下使用 ${ }。
2.2 使用 ${ } 对数据库执行 select 操作
package com.bjpowernode.dao;import com.bjpowernode.entity.Student;
import org.apache.ibatis.annotations.Param;import java.util.List;/****/
public interface StudentDao {//${}占位符的使用,使用@Param命名参数List<Student> queryStudent(@Param("studentName") String name);}
<!-- ${}占位符的使用 -->
<select id="queryStudent" resultType="com.bjpowernode.entity.Student">select * from student where name=${studentName}
</select>
@Testpublic void testQueryStudent() {SqlSession session= MyBatisUtil.getSqlSession();StudentDao studentDao=session.getMapper(StudentDao.class);List<Student> students=studentDao.queryStudent("'张起灵'");for(Student stu : students) {System.out.println("stu === " + stu);}session.close();}
这里注意代码中通过 ${ } 占位符传值的地方,如果我们写成下面这样,代码运行一定是会报错的!!!
List<Student> students=studentDao.queryStudent("张起灵");这是因为 ${ } 占位符中的数据是原模原样的,不会区分数据类型。也就是说它会把你的mapper文件中的sql语句转换为:
select * from student where name=张起灵 (错误!!!)对sql语句有了解的人肯定都能看出这里的错误,首先我们的name字段的数据类型是 varchar,而这里 name=张起灵 显然是错误的,应该是 name= '张起灵' 这样才对,所以代码中通过 ${ } 占位符传值的地方,应该这样写:
MyBatis——谈谈占位符(#、$)的理解与使用相关推荐
- MyBatis -- 参数占位符 #{} 和 ${}
MyBatis -- 参数占位符 #{} 和 ${} 一.准备工作 二.参数占位符 #{} 和 ${} 三.特殊场景 3.1 特殊场景 1 -- String 3.1.1 使用 #{} 3.1.2 使 ...
- mybatis 注解 占位符
#{} 自动进行 java 类型和 jdbc 类型转换,#{}可以有效防止 sql 注入. select * from user where username = #{username} userna ...
- Java面试之谈谈对Volatile的理解
谈谈对Volatile的理解 Volatile在日常的单线程环境是应用不到的 Volatile是Java虚拟机提供的轻量级的同步机制(三大特性) 保证可见性 不保证原子性 禁止指令重排 可能这么说,还 ...
- python中,print()多个数据逗号分隔,打印时会以空格分隔,如果不要空格可以使用{}占位符
print()多个数据逗号分隔,打印时会以空格分隔,如果不要空格可以使用{}占位符
- 谈谈对MVVM的理解
谈谈对MVVM的理解 什么是MVVM 不管是MVC,MVP,或者MVVM,都是常见的软件架构设计模式(Architectural Pattern),它通过分离关注点来改进代码的组织方式.不同于设计模式 ...
- 谈谈对this的理解
谈谈对this的理解 什么是this 每个函数在被调用时都会创建一个执行上下文,这个上下文包含了变量环境.this.作用域链等,this就是执行上下文中的一个属性,他是在函数运行时进行绑定的,this ...
- html 空格占位符
// 空格展位符 // 使用 <span> 前面两个空格</span> 转自片段 html 空格占位符
- 什么是面向对象?谈谈对面向对象的理解?
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一.什么是面向对象?谈谈对面向对象的理解? 二.3大特征: 1.封装: 2.继承: 2.多态: 总结 一.什么是面向对象?谈 ...
- Logger 日志输出请使用占位符 {}
在工作复盘时,检查代码的过程中,发现好多代码在打印日志的时候,会用字符串拼接,这是是非常不好的现象. 对于占位符的形式而言,只有在我们需要的时候才会提取字符串,这样就会避免创建string对象的时候消 ...
最新文章
- struts2中拦截器和过滤器的比较
- 120分钟React快速扫盲教程
- u-boot分析(八)----串口初始化
- 福利 | 2018 OpenInfra Days China限量版免费票任性放出
- 优达学城深度学习之一——Anaconda
- 比较=、==、===
- 设计模式再学习之单例模式
- 1017 A除以B (20 分)—PAT (Basic Level) Practice (中文)
- SQL2008如何建立数据库
- png转iconfont_IconFont|阿里巴巴矢量图标库
- linux虚拟键盘onboard设置,求助,安装屏幕虚拟键盘onboard出错。
- 手机端和PC端开发区别
- 美团构建实时数仓的痛点是什么?如何解决?
- 日期格式化、时间差转换
- php注入过程详解,PHP注入代码详解
- ROS中EKF(扩展卡尔曼跟踪)的使用
- LEP与负载均衡—— 以PCDUINO实际案例来使用LEP提高网络带宽
- 听说一个漂亮的小姐姐图片是程序员无法抗拒的
- 无迹卡尔曼滤波UKF—目标跟踪中的应用(仿真部分)
- Ubuntu创建Eclipse桌面快捷方式
热门文章