本节示例代码在 mybatis-demo-006 。
示例1
我们先回顾下之前的 findById 示例。
UserMapper 接口代码:
package mapper;
import bean.User;
import org.apache.ibatis.annotations.Param;
import java.util.Map;
public interface UserMapper {
/**
* 根据 id 查询用户
*/
User findById(Long id);
}
findById
对应的 XML 映射:
<select id="findById" parameterType="Long" resultType="bean.User">
select * from blog_db.user where id=#{id}
</select>
占位符#{id}
中的id并非一定叫做id,可以随便写,比如#{123id}
、#{123}
等,都能正常执行。
简单说,只有一个变量和一个占位符的情况下,占位符的内容可以随便写。
接下来,根据 name 和 password 查询用户为目标实现更多的示例,在 UserMapper 增加新函数:
package mapper;
import bean.User;
import org.apache.ibatis.annotations.Param;
import java.util.Map;
public interface UserMapper {
/**
* 根据 id 查询用户
*/
User findById(Long id);
/**
* 下面的函数都是根据 name 和 password 查询用户
*/
User findByNameAndPasswordV1(String name, String password);
User findByNameAndPasswordV2(@Param("username") String name, @Param("password") String password);
User findByNameAndPasswordV3(Map<String,Object> data);
User findByNameAndPasswordV4(Map<String,Object> data, String password);
User findByNameAndPasswordV5(@Param("data") Map<String,Object> data, @Param("password") String password);
User findByNameAndPasswordV6(User user);
User findByNameAndPasswordV7(@Param("user") User user);
}
示例2
对于 UserMapper 接口的函数:
User findByNameAndPasswordV1(String name, String password);
对应的 XML 映射为:
<select id="findByNameAndPasswordV1" resultType="bean.User">
select * from blog_db.user where name=#{param1} and password=#{param2}
</select>
此时,占位符用#{param1}
、#{param2}
即可。
示例3
对于 UserMapper 接口的函数:
User findByNameAndPasswordV2(@Param("username") String name, @Param("password") String password);
对应的 XML 映射为:
<select id="findByNameAndPasswordV2" resultType="bean.User">
select * from blog_db.user where name=#{username} and password=#{password}
</select>
因为@Param的原因,占位符可以用#{username}
、#{password}
。此处占位符也可以用#{param1}
、#{param2}
。
示例4
对于 UserMapper 接口的函数:
User findByNameAndPasswordV3(Map<String,Object> data);
对应的 XML 映射为:
<select id="findByNameAndPasswordV3" parameterType="java.util.Map" resultType="bean.User">
select * from blog_db.user where name=#{username} and password=#{password}
</select>
运行以下代码:
try ( SqlSession sqlSession = getSqlSession() ) {
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
Map<String, Object> data = new HashMap<>();
data.put("username", "letian");
data.put("password", "123");
User user = userMapper.findByNameAndPasswordV3(data);
log.info("{}", user);
}
运行结果是:
INFO [main] - User(id=1, name=letian, email=letian@111.com, password=123)
mybatis 会自动将 Map 参数解开,所以这里的占位符可以用#{username}
、#{password}
。
这里,不能用#{param1.username}
、#{param1.password}
。函数只有一个参数的情况下,且未用 @Param
注解的情况下,mybatis不支持 param1
、param2
等。
示例5
对于 UserMapper 接口的函数:
User findByNameAndPasswordV4(Map<String,Object> data, String password);
对应的 XML 映射为:
<select id="findByNameAndPasswordV4" resultType="bean.User">
select * from blog_db.user where name=#{param1.username} and password=#{param2}
</select>
findByNameAndPasswordV4 函数有两个参数,所以需要把param1
、param2
拿出来用。
运行以下代码:
try ( SqlSession sqlSession = getSqlSession() ) {
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
Map<String, Object> data = new HashMap<>();
data.put("username", "letian");
User user = userMapper.findByNameAndPasswordV4(data, "123");
log.info("{}", user);
}
运行结果是:
INFO [main] - User(id=1, name=letian, email=letian@111.com, password=123)
示例6
对于 UserMapper 接口的函数:
User findByNameAndPasswordV5(@Param("data") Map<String,Object> data, @Param("password") String password);
对应的 XML 映射为:
<select id="findByNameAndPasswordV5" resultType="bean.User">
select * from blog_db.user where name=#{data.username} and password=#{password}
</select>
运行以下代码:
try ( SqlSession sqlSession = getSqlSession() ) {
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
Map<String, Object> data = new HashMap<>();
data.put("username", "letian");
User user = userMapper.findByNameAndPasswordV5(data, "123");
log.info("{}", user);
}
运行结果是:
INFO [main] - User(id=1, name=letian, email=letian@111.com, password=123)
这里,占位符也可以用#{param1.username}
、#{param2}
。
示例7
对于 UserMapper 接口的函数:
User findByNameAndPasswordV6(User user);
对应的 XML 映射为:
<select id="findByNameAndPasswordV6" parameterType="bean.User" resultType="bean.User">
select * from blog_db.user where name=#{name} and password=#{password}
</select>
findByNameAndPasswordV6 函数的参数 user 会被解开,所以占位符号可以用#{name}
、#{password}
。
示例8
对于 UserMapper 接口的函数:
User findByNameAndPasswordV7(@Param("user") User user);
对应的 XML 映射为:
<select id="findByNameAndPasswordV7" parameterType="bean.User" resultType="bean.User">
select * from blog_db.user where name=#{user.name} and password=#{user.password}
</select>
占位符除了可以用#{user.name}
、#{user.password}
,还可以用#{param1.name}
、#{param1.password}
。
但是,占位符不能用#{name}
、#{password}
。