文章目录:
1.#占位符
1. MyBatis处理 #{ } 占位符,使用的 JDBC 对象是PreparedStatement 对象,执行sql语句的效率更高。
2. 使用PreparedStatement 对象,能够避免 sql 注入,使得sql语句的执行更加安全。
3. #{ } 常常作为列值使用,位于sql语句中等号的右侧;#{ } 位置的值与数据类型是相关的。
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>
@Test public 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(); }
1. }
2.$占位符
1. MyBatis处理 ${ } 占位符,使用的 JDBC 对象是 Statement 对象,执行sql语句的效率相对于 #{ } 占位符要更低。
2. ${ } 占位符的值,使用的是字符串连接的方式,有 sql 注入的风险,同时也存在代码安全的问题。
3. ${ } 占位符中的数据是原模原样的,不会区分数据类型。
4. ${ } 占位符常用作表名或列名,这里推荐在能保证数据安全的情况下使用 ${ }。
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>
@Test public 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= '张起灵' 这样才对,所以代码中通过 ${ } 占位符传值的地方,应该这样写:👇👇👇
List<Student> students=studentDao.queryStudent("'张起灵'");
对参数张起灵添加引号,根据 ${ } 占位符中的数据是原模原样的,此时它会把你的mapper文件中的sql语句转换为:
select * from student where name='张起灵' (正确!!!)
3.#{ }、${ } 占位符的综合使用
上面大致介绍了一下这两种占位符的使用规则和语法,下面再用一个综合的例子来应用一下这两种占位符吧!!!
package com.bjpowernode.dao; import com.bjpowernode.entity.Student; import org.apache.ibatis.annotations.Param; import java.util.List; /** * */ public interface StudentDao { List<Student> queryStudentOrderByColName(@Param("myName") String myName, @Param("colName") String colName, @Param("tableName") String tableName); }
<!-- 按照某个列排序 --> <select id="queryStudentOrderByColName" resultType="com.bjpowernode.entity.Student"> select * from ${tableName} where name=#{myName} order by ${colName} desc </select>
@Test public void testQueryStudentOrderByColName() { SqlSession session= MyBatisUtil.getSqlSession(); StudentDao studentDao=session.getMapper(StudentDao.class); List<Student> students=studentDao.queryStudentOrderByColName("张起灵","id","student"); for(Student stu : students) { System.out.println("stu === " + stu); } session.close(); }
上述sql语句的意思是:从 student 表中查询 name="张起灵" 的所有字段内容,并把结果按照 id 列进行降序排序。



