MyBatis——谈谈占位符(#、$)的理解与使⽤⽂章⽬录:
1.#占位符
1.1 #占位符的特点
1. MyBatis处理 #{ } 占位符,使⽤的 JDBC 对象是 PreparedStatement 对象,执⾏sql语句的效率更⾼。
2. 使⽤ PreparedStatement 对象,能够避免 sql 注⼊,使得sql语句的执⾏更加安全。
3. #{ } 常常作为列值使⽤,位于sql语句中等号的右侧;#{ } 位置的值与数据类型是相关的。
1.2 使⽤ #{ } 对数据库执⾏ update 操作
package com.bjpowernode.dao;
import ity.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 SqlSession();
StudentDao Mapper(StudentDao.class);
Student student=new Student();
student.setId(1003);
student.setName("最强王者");
student.setEmail("123456@qq");
student.setAge(28);
int rows=studentDao.updateStudent(student);
sessionmit();
System.out.println("更新学⽣的rows === " + rows);
session.close();
}
2.$占位符
2.1 $占位符的特点
1. MyBatis处理 ${ } 占位符,使⽤的 JDBC 对象是 Statement 对象,执⾏sql语句的效率相对于 #{ } 占位符要更低。
2. ${ } 占位符的值,使⽤的是字符串连接的⽅式,有 sql 注⼊的风险,同时也存在代码安全的问题。
3. ${ } 占位符中的数据是原模原样的,不会区分数据类型。
4. ${ } 占位符常⽤作表名或列名,这⾥推荐在能保证数据安全的情况下使⽤ ${ }。
2.2 使⽤ ${ } 对数据库执⾏ select 操作
package com.bjpowernode.dao;
import ity.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="ity.Student">
select * from student where name=${studentName}
</select>
param name
@Test
public void testQueryStudent() {
SqlSession session= SqlSession();
StudentDao Mapper(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 ity.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="ity.Student">
select * from ${tableName} where name=#{myName} order by ${colName} desc
</select>
@Test
public void testQueryStudentOrderByColName() {
SqlSession session= SqlSession();
StudentDao Mapper(StudentDao.class);
List<Student> students=studentDao.queryStudentOrderByColName("张起灵","id","student");
for(Student stu : students) {
System.out.println("stu === " + stu);
}
session.close();
}
上述sql语句的意思是:从 student 表中查询 name="张起灵" 的所有字段内容,并把结果按照 id 列进⾏降序排序。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论