MyBatis: 更多查询用户的方式


本节示例代码在 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不支持 param1param2等。

示例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 函数有两个参数,所以需要把param1param2拿出来用。

运行以下代码:

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}



(本文完)


MyBatis 教程