1、MyBatis获取参数值的两种方式:${}和#{}
- ${}的本质是字符串拼接,#{}的本质是占位符赋值
- ${}使用字符串拼接的方式拼接sql,若为字符串类型或日期类型的字段进行赋值时,需要手动加单引号
- #{}使用占位符赋值的方式拼接sql,此时为字符串类型或日期类型的字段进行赋值时,可以自动添加单引号
2、${}和#{}的区别?
- 使用#{}设置参数时,MyBatis会创建预编译的SQL语句,然后在执行SQL时MyBatis会为预编译SQL中的占位符(?)赋值。预编译的SQL语句执行效率高,并且可以防止注入攻击。
- 使用${}设置参数时,MyBatis只是创建普通的SQL语句,然后在执行SQL语句时MyBatis将参数直接拼入到SQL里。这种方式在效率、安全性上均不如前者,但是可以解决一些特殊情况下的问题。例如,在一些动态表格(根据不同的条件产生不同的动态列)中,我们要传递SQL的列名,根据某些列进行排序,或者传递列名给SQL都是比较常见的场景,这就无法使用预编译的方式了。
3、单个字面量类型的参数
若mapper接口中的方法参数为单个的字面量类型,此时可以使用${}和#{}以任意的名称获取参数的值,注意${}需要手动加单引号。/**
* 根据用户名查询用户信息
*
* @param username
* @return
*/
User getUserByUsername(String username);
<!-- User getUserByUsername(String username)-->
<select id="getUserByUsername" resultType="User">
<!-- select * from t_user where username = #{username}-->
select * from t_user where username = '${username}'
</select>
4、多个字面量类型的参数
若mapper接口中的方法参数为多个时,此时MyBatis会自动将这些参数放在一个map集合中,以arg0,arg1...为键,以参数为值;以param1,param2...为键,以参数为值;因此只需要通过${}和#{}访问map集合的键就可以获取相 对应的值,注意${}需要手动加单引号。/**
* 验证登录
*
* @param username
* @param password
* @return
*/
User checkLogin(String username, String password);
<!-- User checkLogin(String username,String password)-->
<select id="checkLogin" resultType="user">
<!-- select * from t_user where username = #{arg0} and password = #{arg1}-->
select * from t_user where username = '${arg0}' and password = '${arg1}'
</select>
5、map集合类型的参数
若mapper接口中的方法需要的参数为多个时,此时可以手动创建map集合,将这些数据放在map中,只需要通过${}和#{}访问map集合的键就可以获取相对应的值,注意${}需要手动加单引号。/**
* 验证登录(以map集合作为参数)
*
* @param map
* @return
*/
User checkLoginByMap(Map<String, Object> map);
<!-- 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 testCheckLoginByMap() {
SqlSession sqlSession = SqlSessionUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
Map<String, Object> map = new HashMap<>();
map.put("username", "admin");
map.put("password", "123");
User user = mapper.checkLoginByMap(map);
System.out.println(user);
}
6、实体类类型的参数
若mapper接口中的方法参数为实体类对象时,此时可以使用${}和#{},通过访问实体类对象中的属性名获取属性值,注意${}需要手动加单引号。/**
* 添加用户信息
*
* @param user
*/
void insertUser(User user);
<!-- void insertUser(User user)-->
<insert id="insertUser">
insert into t_user values (null,#{username},#{password},#{age},#{gender},#{email})
</insert>
@Test
public void testInsertUser() {
SqlSession sqlSession = SqlSessionUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = new User(null, "root", "123456", 23, "女", "[email protected]");
mapper.insertUser(user);
}
7、使用@Param标识参数
可以通过@Param注解标识mapper接口中的方法参数 此时,会将这些参数放在map集合中,以@Param注解的value属性值为键,以参数为值;以param1,param2...为键,以参数为值;只需要通过${}和#{}访问map集合的键就可以获取相对应 的值, 注意${}需要手动加单引号。/**
* 验证登录,使用@Param注解
* @Param:命名参数
* @param username
* @param password
* @return
*/
User checkLoginByParam(@Param("username") String username, @Param("password") String password);
<!-- 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 testCheckLoginByParam() {
SqlSession sqlSession = SqlSessionUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.checkLoginByParam("admin", "123");
System.out.println(user);
}
标签:username,map,mapper,获取,参数,user,Mybatis,password From: https://www.cnblogs.com/didadida-wang/p/16751296.html