千家信息网

Mybatis的SQL注入实例分析

发表于:2024-12-04 作者:千家信息网编辑
千家信息网最后更新 2024年12月04日,本文小编为大家详细介绍"Mybatis的SQL注入实例分析",内容详细,步骤清晰,细节处理妥当,希望这篇"Mybatis的SQL注入实例分析"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来
千家信息网最后更新 2024年12月04日Mybatis的SQL注入实例分析

本文小编为大家详细介绍"Mybatis的SQL注入实例分析",内容详细,步骤清晰,细节处理妥当,希望这篇"Mybatis的SQL注入实例分析"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

    前言

    MyBatis3提供了新的基于注解的配置。主要在MapperAnnotationBuilder中,定义了相关的注解:

    public MapperAnnotationBuilder(Configuration configuration, Class type) {    ...    sqlAnnotationTypes.add(Select.class);    sqlAnnotationTypes.add(Insert.class);    sqlAnnotationTypes.add(Update.class);    sqlAnnotationTypes.add(Delete.class);    ......    sqlProviderAnnotationTypes.add(SelectProvider.class);    sqlProviderAnnotationTypes.add(InsertProvider.class);    sqlProviderAnnotationTypes.add(UpdateProvider.class);    sqlProviderAnnotationTypes.add(DeleteProvider.class);}

    增删改查占据了绝大部分的业务操作,通过注解不在需要配置繁杂的xml文件,越来越多的sql交互均通过注解来实现。从MapperAnnotationBuilder可以看到Mybatis提供了以下相关的注解:

    • @Select

    • @Insert

    • @Update

    • @Delete

    • @SelectProvider

    • @InsertProvider

    • @UpdateProvider

    • @DeleteProvider

    例如如下例子,使用@Select注解直接编写SQL完成数据查询:

    @Mapperpublic interface UserMapper {    @Select("select * from t_user")    List list();}

    使用类似@SelectProvider高级注解可以指定某个工具类的方法来动态编写SQL,以应对复杂的业务需求。
    以@SelectProvider 为例,查看具体的实现,主要包含两个注解属性,其中type表示工具类,method 表示工具类的某个方法,用于返回具体的SQL:

    @Documented@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.METHOD)public @interface InsertProvider {    // 用于指定获取 sql 语句的指定类    Class type();    // 指定类中要执行获取 sql 语句的方法    String method();}

    使用方法如下,在ProjectSql类的getContentByProjectIds方法定义相关的sql即可,sql的定义可以通过org.apache.ibatis.jdbc.SQL来快速实现:
    @SelectProvider(type = ProjectSql.class, method = "getContentByProjectIds")
    List getContentByProjectIds(List projectIds);

    常见注入场景

    2.1普通注解

    实际上跟xml配置中对应的标签语法是一样的(例如@Select对应