Mybatis中表名当做变量

做业务时,有时候会遇到不同SQL语句之中,只有使用的表名不用而已,其他参数和取得值都是一样的情况。这种时候必然想到把表名当做一个变量传到共通的SQL语句中。

当然正常的传入参数的方式#{param}肯定是不行的。介绍具体的写法之前,简单回顾一下Mybatis中#{}和${}的区别。

#{}

#将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。

如:WHERE SID = #{sid},如果传入的值是s01,那么解析成SQL时的值为WHERE SID = "s01"。

#可以防止防止sql注入。

${}

$将传入的数据直接显示生成在sql中。

如:ORDER BY ${sage},如果传入的值是age,那么解析成SQL时的值为ORDER BY age。

$方式一般用于传入数据库对象,例如传入表名,字段名。

通过上面就可以知道传入普通参数时使用#{},当传入表名时,需要使用$()。

但是在这块还有一个问题就是,通过Dao层传入参数时,不能使用Map集合的方式进行赋值。如下面的SQL中,需要传入两个参数

SELECT COUNT(*)
  FROM ${tableId}
WHERE S_NO = #{sNo}

ao层的写法参数就不能是Map集合或者两个String参数,这时需要@Param 注解的方法来声明参数。

@Param注解的作用是声明参数时,如果使用 #{} 或 ${} 的方式都可以。

不使用@Param注解来声明参数时,必须使用使用 #{}方式,如果使用${} 的方式,会报错。

所以Dao层的写法应该如下:

public int getCnt(@Param("tableId") String tableId,@Param("sNo") String sNo) throws Exception;
<insert id="batchUserRole">
        insert into sys_user_role(user_id, role_id) values
        <foreach item="item" index="index" collection="list" separator=",">
            (#{item.userId},#{item.roleId})
        </foreach>
    </insert>
做业务时,有时候会遇到不同SQL语句之中,只有使用的表名不用而已,其他参数和取得值都是一样的情况。这种时候必然想到把表名当做一个变量传到共通的SQL语句中。 当然正常的传入参数的方式#{param}肯定是不行的。介绍具体的写法之前,简单回顾一下Mybatis中#{}和${}的区别。 #{} #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。 如:WHERE SID = #{sid},如果传入的值是s01,那么解析成SQL时的值为WHERE SID = "s01"。 #可以防止防止sql注入。 ${} $将传入的数据直接显示生成在sql中。 如:ORDER BY ${sage},如果传入的值是age,那么解析成SQL时的值为ORDER BY age。 $方式一般用于传入数据库对象,例如传入表名,字段名。 通过上面就可以知道传入普通参数时使用#{},当传入表名时,需要使用$()。 但是在这块还有一个问题就是,通过Dao层传入参数时,不能使用Map集合的方式进行赋值。如下面的SQL中,需要传入两个参数 SELECT COUNT(*) FROM ${tableId} WHERE S_NO = #{sNo} ao层的写法参数就不能是Map集合或者两个String参数,这时需要@Param 注解的方法来声明参数。 @Param注解的作用是声明参数时,如果使用 #{} 或 ${} 的方式都可以。 不使用@Param注解来声明参数时,必须使用使用 #{}方式,如果使用${} 的方式,会报错。 所以Dao层的写法应该如下: public int getCnt(@Param("tableId") String tableId,@Param("sNo") String sNo) throws Exception; insert into sys_user_role(user_id, role_id) values (#{item.userId},#{item.roleId})
经验分享 程序员 微信小程序 职场和发展