在 MyBatis 中,可以使用两种方式来获取参数值:#{} 和 ${}。
1. #{}:这是 MyBatis 推荐使用的方式。在 SQL 语句中使用 #{},MyBatis 会自动将参数值进行预编译处理,防止 SQL 注入攻击,并且可以处理各种类型的参数(如字符串、数字、日期等)。例如:
- <select id="getUserById" resultType="User">
- SELECT * FROM user WHERE id = #{id}
- </select>
在这个例子中,#{id} 表示一个参数占位符,MyBatis 会将它替换为具体的参数值。
2. ${}:这种方式会直接将参数值拼接到 SQL 语句中,不做预编译处理。这种方式适用于在 SQL 语句中引用列名、表名等无法使用 #{} 替换的情况。但需要注意的是,使用 ${} 可能会导致 SQL 注入攻击的风险,因此需要谨慎使用。例如:
- <select id="getUserByName" resultType="User">
- SELECT * FROM user WHERE name = '${name}'
- </select>
MyBatis获取参数值的两种方式:${}和#{}
${}的本质就是字符串拼接,#{}的本质就是占位符赋值
${}使用字符串拼接的方式拼接sql,若为字符串类型或日期类型的字段进行赋值时,需要手动加单引号;但是#{}使用占位符赋值的方式,此时为字符串类型或日期类型的字段进行赋值时,可以自动添加单引号
- <!--User getUserByUsername(String username);-->
- <select id="getUserByUsername" resultType="User">
- select * from t_user where username = #{username}
- </select>
- <!--User getUserByUsername(String username);-->
- <select id="getUserByUsername" resultType="User">
- select * from t_user where username = '${username}'
- </select>
若mapper接口中的方法参数为多个时,此时MyBatis会自动将这些参数放在一个map集合中。
① 以arg0,arg1…为键,以参数为值;
② 以param1,param2…为键,以参数为值;
因此只需要通过${}和#{}访问map集合的键就可以获取相对应的值,注意${}需要手动加单引号。
使用arg或者param都行,要注意的是,arg是从arg0开始的,param是从param1开始的
- <!--User checkLogin(String username,String password);-->
- <select id="checkLogin" resultType="User">
- select * from t_user where username = #{arg0} and password = #{arg1}
- </select>
- <!--User checkLogin(String username,String password);-->
- <select id="checkLogin" resultType="User">
- select * from t_user where username = '${param1}' and password = '${param2}'
- </select>
- <!--User checkLoginByMap(Map<String,Object> map);-->
- <select id="checkLoginByMap" resultType="User">
- select * from t_user where username = #{username} and password = #{password}
- </select>
- @Test
- public void checkLoginByMap() {
- SqlSession sqlSession = SqlSessionUtils.getSqlSession();
- ParameterMapper mapper = sqlSession.getMapper(ParameterMapper.class);
- Map<String,Object> map = new HashMap<>();
- map.put("usermane","admin");
- map.put("password","123456");
- User user = mapper.checkLoginByMap(map);
- System.out.println(user);
- }
-
- <insert id="insertUser">
- insert into t_user values(null,#{username},#{password},#{age},#{sex},#{email})
- insert>
- @Test
- public void insertUser() {
- SqlSession sqlSession = SqlSessionUtils.getSqlSession();
- ParameterMapper mapper = sqlSession.getMapper(ParameterMapper.class);
- User user = new User(null,"Tom","123456",12,"男","123@321.com");
- mapper.insertUser(user);
- }
可以通过@Param注解标识mapper接口中的方法参数,此时,会将这些参数放在map集合中
- <!--User CheckLoginByParam(@Param("username") String username, @Param("password") String password);-->
- <select id="CheckLoginByParam" resultType="User">
- select * from t_user where username = #{username} and password = #{password}
- </select>
- @Test
- public void checkLoginByParam() {
- SqlSession sqlSession = SqlSessionUtils.getSqlSession();
- ParameterMapper mapper = sqlSession.getMapper(ParameterMapper.class);
- mapper.CheckLoginByParam("admin","123456");
- }
- /**
- * 根据用户id查询用户信息为map集合
- * @param id
- * @return
- */
- Map<String, Object> getUserToMap(@Param("id") int id);
- <!--Map<String, Object> getUserToMap(@Param("id") int id);-->
- <select id="getUserToMap" resultType="map">
- select * from t_user where id = #{id}
- </select>
- <!--结果:{password=123456, sex=男, id=1, age=23, username=admin}-->
- /**
- * 查询所有用户信息为map集合
- * @return
- * 将表中的数据以map集合的方式查询,一条数据对应一个map;若有多条数据,就会产生多个map集合,此时可以将这些map放在一个list集合中获取
- */
- List<Map<String, Object>> getAllUserToMap();
- <!--Map<String, Object> getAllUserToMap();-->
- <select id="getAllUserToMap" resultType="map">
- select * from t_user
- </select>
- <!--
- 结果:
- [{password=123456, sex=男, id=1, age=23, username=admin},
- {password=123456, sex=男, id=2, age=23, username=张三},
- {password=123456, sex=男, id=3, age=23, username=张三}]
- -->
- /**
- * 查询所有用户信息为map集合
- * @return
- * 将表中的数据以map集合的方式查询,一条数据对应一个map;若有多条数据,就会产生多个map集合,并且最终要以一个map的方式返回数据,此时需要通过@MapKey注解设置map集合的键,值是每条数据所对应的map集合
- */
- @MapKey("id")
- Map
getAllUserToMap();
- <!--Map<String, Object> getAllUserToMap();-->
- <select id="getAllUserToMap" resultType="map">
- select * from t_user
- </select>
- <!--
- 结果:
- {
- 1={password=123456, sex=男, id=1, age=23, username=admin},
- 2={password=123456, sex=男, id=2, age=23, username=张三},
- 3={password=123456, sex=男, id=3, age=23, username=张三}
- }
- -->