一、#{}、${}的区别:
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.youkuaiyun.com/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);