IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Mybatis的#{}与${}与和statementType的结合 -> 正文阅读

[大数据]Mybatis的#{}与${}与和statementType的结合

#{}:以预编译的形式进行查询,所有要传的参数均用?代替,

${}:以传输值的方式查询,有SQL注入的危险。

当指定statementType属性时:

1.#{}与PREPARED

  //#{}与PREPARED
  /*
<select  statementType="PREPARED" id="selectUserById" resultType="org.example.pojo.User">
    select * from t_user WHERE id = #{id}
</select>
*/
    @Test
    public void testSelectUserById() throws Exception{

        SqlSession session = getSqlSession();//自定义方法,返回一个SqlSession对象
        try {
            UserMapper mapper = session.getMapper(UserMapper.class);
            User user = mapper.selectUserById(9);
            System.out.println(user);
        }finally {
            session.close();
        }
    }

结果:正常

?2.#{}与STATEMENT

//#{}与STATEMENT
/*<select  statementType="STATEMENT" id="selectUserById" resultType="org.example.pojo.User">
    select * from t_user WHERE id = #{id}
</select>
*/
    @Test
    public void testSelectUserById() throws Exception{

        SqlSession session = getSqlSessionFactory();
        try {
            UserMapper mapper = session.getMapper(UserMapper.class);
            User user = mapper.selectUserById(9);
            System.out.println(user);
        }finally {
            session.close();
        }
    }

结果:提示SQL语法错误,检查第一行的?号。

Error querying database. ?Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?' at line 1
### The error may exist in t_user.xml
### The error may involve org.example.dao.UserMapper.selectUserById
### The error occurred while executing a query
### SQL: select * from t_user WHERE id = ?
### Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?' at line 1

3.${}与PREPARED

//${}与PREPARED
/*<select  statementType="PREPARED" id="selectUserById" resultType="org.example.pojo.User">
    select * from t_user WHERE id = ${id}
</select>
*/
    @Test
    public void testSelectUserById() throws Exception{

        SqlSession session = getSqlSessionFactory();
        try {
            UserMapper mapper = session.getMapper(UserMapper.class);
            User user = mapper.selectUserById(9);
            System.out.println(user);
        }finally {
            session.close();
        }
    }

结果:正常

?4.${}与STATEMENT

  //${}与STATEMENT
/*<select  statementType="STATEMENT" id="selectUserById" resultType="org.example.pojo.User">
    select * from t_user WHERE id = ${id}
</select>
*/
    @Test
    public void testSelectUserById() throws Exception{

        SqlSession session = getSqlSessionFactory();
        try {
            UserMapper mapper = session.getMapper(UserMapper.class);
            User user = mapper.selectUserById(9);
            System.out.println(user);
        }finally {
            session.close();
        }
    }

结果:正常

?从3的结果我们得知,当用${}的方法传参并且指定statementType为PREPARED时,程序成功运行了。那么能不能用这种方式来解决${}的sql注入问题呢?

验证:

1.在UserMapper接口中准备根据姓名查询用户方法

List<User> selectUserByName(String username);

2.在对应的xml文件中准备该方法的select标签。(注意statementType的类型为PREPARED,sql参数为${})

<select id="selectUserByName" statementType="PREPARED" resultType="org.example.pojo.User">
        SELECT * FROM t_user WHERE username = ${0}
    </select>

3.准备

@Test
    public void testSelectUserByname() throws Exception{
        SqlSession session = getSqlSessionFactory();
        try {
            UserMapper mapper = session.getMapper(UserMapper.class);
            List<User> users = mapper.selectUserByName("admin" + "OR 1=1");
            for(User user:users){
                System.out.println(user);
            }
        }finally {
            session.close();
        }

    }

结果:编译通过

?得出结论:当使用${}并且指定statementType为PREPARED时,并不能解决sql注入问题。mybatis仍是直接将传递的参数拼接进sql中而不是用占位符代替。

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-10-25 12:36:07  更:2021-10-25 12:37:24 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 2:52:10-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码