mybatis #和$的区别及应用

一、#{}、${}的区别:

1、概念:

        (1)、#{}:

                        a).自动进行java类型和jdbc类型转换;

                        b).进行预编译,可以有效防止sql注入;

                        c).如果parameterType传输单个简单类型值,#{}括号中可以是value或其它名称。

        (2)、${}:

                        a).不进行jdbc类型转换;

                        b).拼接sql串,不进行预编译。

                        c).如果parameterType传输单个简单类型值,${}括号中只能是value。

2、例子:

        (1)、目标:查一个表的id,sex,name列。要求实现的sql结果如下:

    SELECT ID, SEX, NAME FROM TABLE

                String col = "ID, SEX, NAME"

        (2)、用#{}:SELECT #{col} FROM TABLE。sql效果:

    SELECT 'ID, SEX, NAME' FROM TABLE 

        (3)、用${}:SELECT ${col} FROM TABLE。sql效果:

    SELECT ID, SEX, NAME FROM TABLE

        (4)结论:如上所示,#{}会自动加上一对引号,而${}仅仅是拼接字符串。

3、关于sql注入,有兴趣的可了解:https://blog.csdn.net/u014590757/article/details/79637015。

二、#{}、${}的应用

1、需求一:查询一个表的某一列column,条件为condition = value。3个参数均可自定义。

a. 接口层:
List<String> selectColumnByCondition(@Param("column") String column, @Param("conditionFied") String conditionFied, @Param("value") String value);


b. xml:
SELECT ${column} FROM TABLE WHERE ${conditionFied} = #{value}


c. 调用:(查age = 25的name集合)
String column = "USER_NAME";
String conditionFied = "USER_AGE";
String value = "25";

List<String> nameList = xxMapper.selectColumnByCondition(column, conditionFied, value);

2、需求二:查询一个表的某一列column,条件不固定的几组。思路:将条件以map形式传递,sql中foreach遍历。

a. 接口层:
List<String> selectColumnByCondition(@Param("column") String column, @Param("paramMap") Map<String, String> paramMap);


b. xml:
SELECT   ${column} 
FROM     TABLE 
<where>
   <foreach collection="paramMap" item="value" index="key">
      AND ${key} = #{value}
   </foreach>
</where>


c. 调用:(查age = '25', sex = '男'的name集合)
String column = "USER_NAME";

Map<String, String> paramMap = new HashMap<>();
paramMap.put('USER_AGE', '25');
paramMap.put('USER_SEX', '男');

List<String> nameList = xxMapper.selectColumnByCondition(column, paramMap);

3、需求三:查询一个表的某几列column,条件不固定的几组。思路:同上。注:此处返回一定只能是对象或是VO或是Map。此处以返回对象为例:

a. 接口层:
List<User> selectColumnByCondition(@Param("column") String column, @Param("paramMap") Map<String, String> paramMap);


b. xml:
SELECT   ${column} 
FROM     TABLE 
<where>
   <foreach collection="paramMap" item="value" index="key">
      AND ${key} = #{value}
   </foreach>
</where>


c. 调用:(查age = '25', sex = '男'的id, name, address集合)
String column = "USER_ID, USER_NAME, USER_ADDRESS";

Map<String, String> paramMap = new HashMap<>();
paramMap.put('USER_AGE', '25');
paramMap.put('USER_SEX', '男');

List<User> nameList = xxMapper.selectColumnByCondition(column, paramMap);

猜你喜欢

转载自blog.csdn.net/qq_41306795/article/details/93852014