MyBatis——谈谈占位符(#、$)的理解与使用

简介: MyBatis——谈谈占位符(#、$)的理解与使用

文章目录:


1.#占位符

1.1 #占位符的特点 

1.2 使用 #{ } 对数据库执行 update 操作 

2.$占位符

2.1 $占位符的特点 

2.2 使用 ${ } 对数据库执行 select 操作 

3.#{ }${ } 占位符的综合使用

1.#占位符


1.1 #占位符的特点 

1.    MyBatis处理 #{ } 占位符,使用的 JDBC 对象是PreparedStatement 对象,执行sql语句的效率更高。

2.    使用PreparedStatement 对象,能够避免 sql 注入,使得sql语句的执行更加安全。

3.    #{ } 常常作为列值使用,位于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>
    @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.$占位符


2.1 $占位符的特点 

1.    MyBatis处理 ${ } 占位符,使用的 JDBC 对象是 Statement 对象,执行sql语句的效率相对于 #{ } 占位符要更低。

2.    ${ } 占位符的值,使用的是字符串连接的方式,有 sql 注入的风险,同时也存在代码安全的问题。

3.    ${ } 占位符中的数据是原模原样的,不会区分数据类型。

4.    ${ } 占位符常用作表名或列名,这里推荐在能保证数据安全的情况下使用 ${ }


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>
    @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 列进行降序排序。

相关文章
|
SQL XML Java
Mybatis占位符#和$的区别?源码解读(二)
Mybatis占位符#和$的区别?源码解读(二)
232 0
Mybatis占位符#和$的区别?源码解读(二)
|
SQL 安全 Java
MyBatis——通过占位符实现insert操作、一些重要对象(SqlSessionFactory、SqlSession)的理解
MyBatis——通过占位符实现insert操作、一些重要对象(SqlSessionFactory、SqlSession)的理解
MyBatis——通过占位符实现insert操作、一些重要对象(SqlSessionFactory、SqlSession)的理解
|
XML SQL Java
Mybatis接口参数与xml占位符的几种映射关系介绍
在 mybatis 的日常开发中,mapper 接口中定义的参数如何与 xml 中的参数进行映射呢?除了我们常用的@Param注解之外,其他的方式是怎样的呢?
510 0
Mybatis接口参数与xml占位符的几种映射关系介绍
|
SQL Java 数据库连接
MyBatis中使用#和$书写占位符有什么区别?
将传入的数据都当成一个字符串,会对传入的数据自动加上引号;将传入的数据直接显示生成在SQL中。注意:使用占位符可能会导致SQL注射攻击,能用#的地方就不要使用,写order by子句的时候应该用而不是#。
1429 0
|
5月前
|
Java 数据库连接 数据库
Spring boot 使用mybatis generator 自动生成代码插件
本文介绍了在Spring Boot项目中使用MyBatis Generator插件自动生成代码的详细步骤。首先创建一个新的Spring Boot项目,接着引入MyBatis Generator插件并配置`pom.xml`文件。然后删除默认的`application.properties`文件,创建`application.yml`进行相关配置,如设置Mapper路径和实体类包名。重点在于配置`generatorConfig.xml`文件,包括数据库驱动、连接信息、生成模型、映射文件及DAO的包名和位置。最后通过IDE配置运行插件生成代码,并在主类添加`@MapperScan`注解完成整合
1011 1
Spring boot 使用mybatis generator 自动生成代码插件
|
8月前
|
XML Java 数据库连接
微服务——SpringBoot使用归纳——Spring Boot集成MyBatis——基于注解的整合
本文介绍了Spring Boot集成MyBatis的两种方式:基于XML和注解的形式。重点讲解了注解方式,包括@Select、@Insert、@Update、@Delete等常用注解的使用方法,以及多参数时@Param注解的应用。同时,针对字段映射不一致的问题,提供了@Results和@ResultMap的解决方案。文章还提到实际项目中常结合XML与注解的优点,灵活使用两者以提高开发效率,并附带课程源码供下载学习。
685 0
|
10月前
|
前端开发 Java 数据库连接
Java后端开发-使用springboot进行Mybatis连接数据库步骤
本文介绍了使用Java和IDEA进行数据库操作的详细步骤,涵盖从数据库准备到测试类编写及运行的全过程。主要内容包括: 1. **数据库准备**:创建数据库和表。 2. **查询数据库**:验证数据库是否可用。 3. **IDEA代码配置**:构建实体类并配置数据库连接。 4. **测试类编写**:编写并运行测试类以确保一切正常。
459 2
|
Java 数据库连接 Maven
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和MyBatis Generator,使用逆向工程来自动生成Java代码,包括实体类、Mapper文件和Example文件,以提高开发效率。
597 2
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
|
SQL JSON Java
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和PageHelper进行分页操作,并且集成Swagger2来生成API文档,同时定义了统一的数据返回格式和请求模块。
515 1
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
|
前端开发 Java Apache
Springboot整合shiro,带你学会shiro,入门级别教程,由浅入深,完整代码案例,各位项目想加这个模块的人也可以看这个,又或者不会mybatis-plus的也可以看这个
本文详细讲解了如何整合Apache Shiro与Spring Boot项目,包括数据库准备、项目配置、实体类、Mapper、Service、Controller的创建和配置,以及Shiro的配置和使用。
3099 2
Springboot整合shiro,带你学会shiro,入门级别教程,由浅入深,完整代码案例,各位项目想加这个模块的人也可以看这个,又或者不会mybatis-plus的也可以看这个
下一篇
oss云网关配置