{}和${}是MyBatis中用于参数传递的两种方式,它们虽然很相似,但实际上存在着很大的差异。下面我将详细介绍#{}和${}的区别,以及相关的传参方式和基本语法。
#{}和${}的区别
语法
{}中的内容会被预编译处理,最终生成的SQL语句中会使用占位符 "?", 占位符用于接收#{}中的值,例如:select * from user where id = ? 。这样使用的好处就是预处理语句会对SQL语句进行装载,提高执行效率,从而避免SQL注入。
${}中的内容不会被预编译处理,会直接将变量替换到SQL语句中,例如:select * from user where name = '${name}' 。这样使用的坏处就是会导致SQL注入,因为${}中的内容可以被拼接,从而对数据库进行攻击。
参数安全
以#{}代表的参数都是经过预编译处理的,能防止SQL注入,${}表示的参数拼接进SQL中,容易受到SQL注入攻击。因此,在传递参数时应该优先使用#{},杜绝SQL注入攻击。
表示
{}表示一个单一的JDBC预编译参数标记符号,mybatis会将#{}替换成?号。即使在输入参数是字符串类型时,mybatis也会对其进行自动转义和处理。因此#{}可以防止SQL注入攻击。
${}表示纯碎的字符串替换,Mybatis在将SQL语句传递给JDBC之前不会修改或替换它。在使用${}时需要注意SQL注入问题,比如拼接在一起的字符串。
传参方式
MyBatis支持多种参数传递方式,其中包括:
- POJO(Java类)参数
// User类
public class User {
// 对应user表中的字段
private Integer id;
private String name;
private Integer age;
// getter和setter方法
}
// Mapper接口
public interface UserMapper {
/**
* 根据用户ID查询用户信息
* @param id 用户ID
* @return User对象
*/
public User selectUserById(Integer id);
}
// Mapper.xml
<select id="selectUserById" parameterType="int" resultMap="userMap">
select * from user where id = #{id}
</select>
- Map参数
// Mapper接口
public interface UserMapper {
/**
* 根据用户ID查询用户信息
* @param paramMap 参数Map
* @return User对象
*/
public User selectUserById(Map<String, Object> paramMap);
}
// Mapper.xml
<select id="selectUserById" parameterType="map" resultMap="userMap">
select * from user where id = #{id}
</select>
- @Param注解参数
// Mapper接口
public interface UserMapper {
/**
* 根据用户ID查询用户信息
* @param id 用户ID
* @param name 用户名
* @return User对象
*/
public User selectUserById(@Param("id") Integer id, @Param("name") String name);
}
// Mapper.xml
<select id="selectUserById" parameterType="map" resultMap="userMap">
select * from user where id = #{id} and name like '%${name}%'
</select>
基本语法
#{}参数
- 在条件语句中使用#{}参数
// Mapper.xml
<select id="selectUserByNameAndAge" parameterType="User" resultMap="userMap">
select * from user where name = #{name} and age = #{age}
</select>
- 在foreach循环中使用#{}参数
// Mapper接口
public interface UserMapper {
/**
* 根据用户ID列表查询用户信息
* @param idList 用户ID列表
* @return 用户列表
*/
public List<User> selectUserByIdList(List<Integer> idList);
}
// Mapper.xml
<select id="selectUserByIdList" parameterType="list" resultMap="userMap">
select * from user where id in
<foreach item="id" index="index" collection="list" open="(" separator="," close=")">
#{id}
</foreach>
</select>
${}参数
- 在条件语句中使用${}参数
// Mapper.xml
<select id="selectUserByName" parameterType="User" resultMap="userMap">
select * from user where name = '${name}'
</select>
- 在foreach循环中使用${}参数
// Mapper接口
public interface UserMapper {
/**
* 根据用户ID列表查询用户信息
* @param idList 用户ID列表
* @return 用户列表
*/
public List<User> selectUserByIdList(List<Integer> idList);
}
// Mapper.xml
<select id="selectUserByIdList" parameterType="list" resultMap="userMap">
select * from user where id in
<foreach item="id" index="index" collection="list" open="(" separator="," close=")">
${id}
</foreach>
</select>
示例
#{}示例
- Mapper接口
public interface UserMapper {
/**
* 根据用户ID查询用户信息
* @param id 用户ID
* @return User对象
*/
public User selectUserById(Integer id);
}
- Mapper.xml
<select id="selectUserById" parameterType="int" resultMap="userMap">
select * from user where id = #{id}
</select>
- 调用方式
// 获取SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 获取Mapper对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
// 调用selectUserById方法
User user = userMapper.selectUserById(1);
${}示例
- Mapper接口
public interface UserMapper {
/**
* 根据用户名查询用户信息
* @param name 用户名
* @return User对象
*/
public User selectUserByName(String name);
}
- Mapper.xml
<select id="selectUserByName" parameterType="User" resultMap="userMap">
select * from user where name = '${name}'
</select>
- 调用方式
// 获取SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 获取Mapper对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
// 调用selectUserByName方法
User user = userMapper.selectUserByName("张三");
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解mybatis #{}和${}的区别、传参、基本语法 - Python技术站