关键词

深入学习MyBatis中的参数(推荐)

深入学习MyBatis中的参数(推荐)攻略

MyBatis作为一个高性能的ORM框架,除了SQL语句的编写,还有一个重要且常被忽略的部分就是参数的传递。本攻略将深入讲解MyBatis中参数的使用方法,带你彻底掌握参数传递的技巧。

正文

#{parameter_name}

普通类型

MyBatis中使用#{parameter_name}方式,可以直接在SQL语句中使用变量,会自动以参数形式传递。例如:

<select id="selectById" resultType="com.example.domain.User">
  SELECT * FROM user WHERE id = #{id}
</select>

在调用该方法时,传入id变量即可:

User user = userDao.selectById(1);

POJO类型

当参数是一个Pojo对象时,可以使用#{parameter_name.property_name}的方式来引用对象的属性,例如:

<select id="selectByUser" resultType="com.example.domain.User">
  SELECT * FROM user WHERE username = #{user.username} AND password = #{user.password}
</select>

在调用该方法时,传入的参数是一个Pojo对象:

User user = new User();
user.setUsername("admin");
user.setPassword("admin123");
List<User> userList = userDao.selectByUser(user);

${parameter_name}

普通类型

使用${parameter_name}方式,在SQL语句中可以直接使用传入的变量,例如:

<update id="updateUserNameById">
  UPDATE user SET username = '${username}' WHERE id = #{id}
</update>

在调用该方法时,传入的参数中必须包含username和id两个变量:

Map<String,Object> paramMap = new HashMap<>();
paramMap.put("id",1);
paramMap.put("username","admin");
userDao.updateUserNameById(paramMap);

POJO类型

可以使用${parameter_name.property_name}的方式来引用对象的属性,例如:

<select id="selectByUser" resultType="com.example.domain.User">
  SELECT * FROM user WHERE username = '${user.username}' AND password = '${user.password}'
</select>

在调用该方法时,传入的参数是一个Pojo对象:

User user = new User();
user.setUsername("admin");
user.setPassword("admin123");
List<User> userList = userDao.selectByUser(user);

@Param注解命名参数

在MyBatis 3.4之前,只支持单个参数的传递,如果需要传递多个参数,只有使用Map或者对象封装然后传递一个参数的方式。而自从MyBatis 3.4之后,使用@Param注解可以为每个参数指定一个名称,使得传递多个参数更加方便。例如:

<select id="selectByUser" resultType="com.example.domain.User">
  SELECT * FROM user WHERE username = #{username} AND password = #{password}
</select>

在调用该方法时,使用@Param注解指定传递的参数名称:

List<User> userList = userDao.selectByUser(@Param("username")String username, @Param("password")String password);

总结

深入掌握MyBatis中参数传递的技巧,可以让我们更加灵活地使用MyBatis。除了上述介绍的方式,MyBatis还提供了很多高级用法,例如动态SQL的条件拼接等,需要进一步深入学习。

示例

使用MyBatis查询不同条件下的用户列表

假设我们需要根据不同条件查询用户列表,例如按用户名查询、按性别查询、按年龄查询等等。我们可以使用MyBatis的“动态SQL”功能,根据参数动态生成SQL语句。

<select id="selectUsers" resultType="com.example.domain.User">
  SELECT * from user
  WHERE 
    <if test="username != null">
      username = #{username}
    </if>
    <if test="sex != null">
      sex = #{sex}
    </if>
    <if test="age != null">
      age = #{age}
    </if>
</select>

在调用这个方法时,传入对应的参数即可:

Map<String,Object> paramMap = new HashMap<>();
paramMap.put("username","admin");
List<User> userList = userDao.selectUsers(paramMap);

使用MyBatis插入用户的信息

假设我们需要以Map的形式插入用户信息,我们需要在DAO层使用@Param注解命名参数:

<insert id="addUserMap" parameterType="java.util.Map">
  INSERT INTO user (username,password,nickname)
  VALUES (#{username},#{password},#{nickname})
</insert>

在调用这个方法时,使用@Param注解为每个参数指定参数名:

Map<String,Object> paramMap = new HashMap<>();
paramMap.put("username","admin");
paramMap.put("password","admin123");
paramMap.put("nickname","超级管理员");
userDao.addUserMap(paramMap);

参考资料

本文链接:http://task.lmcjl.com/news/13069.html

展开阅读全文