MyBatis作为一个高性能的ORM框架,除了SQL语句的编写,还有一个重要且常被忽略的部分就是参数的传递。本攻略将深入讲解MyBatis中参数的使用方法,带你彻底掌握参数传递的技巧。
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对象时,可以使用#{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}方式,在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);
可以使用${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);
在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的“动态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);
假设我们需要以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