MyBatis 教程

👉 所有文章
文章列表 准备工作 回顾 JDBC 数据准备 查找id为1的用户信息 自定义连接池 不用MyBatis配置文件 查询密码为123的所有用户 如果Bean中成员变量和表中字段命名不一致 更多查询用户的方式 对查询结果排序 日志 添加、删除、修改数据 事务 动态SQL 一对一和一对多的实现 一对一和一对多的延迟加载 多对多的实现 分页查询 把SQL写在注解中 自动生成Mapper代码和映射XML mybatis generator 生成 select for update mybatis generator 支持数据版本号

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}


( 本文完 )

文章目录