请教Mybatis中如何在程序中获取Mapper中定义的SQL语句

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请教Mybatis中如何在程序中获取Mapper中定义的SQL语句相关的知识,希望对你有一定的参考价值。

参考技术A 编写一个mybatis的拦截器(对应的拦截器接口:Interceptor),对执行的sql进行拦截即可

如何使用 MyBatis Mapper 在 POJO 中获取 List<String>?

【中文标题】如何使用 MyBatis Mapper 在 POJO 中获取 List<String>?【英文标题】:How to get List<String> inside of a POJO with MyBatis Mapper? 【发布时间】:2021-06-09 04:14:20 【问题描述】:

我的目标是使用 'UsersMapper' MyBatis Mapper 填充 UserDto POJO。

public class UserDto 
  private String username;
  private String password;
  private List<String> authorities;

  public String getUsername() 
    return username;
  

  public String getPassword() 
    return password;
  

  public Set<SimpleGrantedAuthority> getAuthorities() 
    return authorities.stream()
            .map(SimpleGrantedAuthority::new)
            .collect(Collectors.toSet());
  

@Mapper
public interface UsersMapper 
  @Select("SELECT users.username, users.password, role_authorities.authority " +
          "FROM users " +
          "JOIN role_members ON role_members.username = users.username " +
          "AND users.username=#username " +
          "JOIN role_authorities ON role_authorities.role_uuid = role_members.role_uuid")
  Optional<UserDto> getUsers(String username);

这就是我直接运行 SQL 语句时的样子。

我的预期结果是:MyBatis 成功填充UserDto POJO。

我的实际结果是我遇到了异常

org.springframework.security.authentication.InternalAuthenticationServiceException: nested exception is org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 3

【问题讨论】:

见FAQ entry。 【参考方案1】:

此 POJO 有一个类型为 List 的字段。 @Select 还不够,你有两种方法可以解决这个问题:

    添加@Results声明此查询返回的所有字段,然后使用@Resultmany属性链接另一个子查询。 通过 XML,在您的“ResultMap”XML 标记中使用 &lt;Collection&gt; 标记。

【讨论】:

以上是关于请教Mybatis中如何在程序中获取Mapper中定义的SQL语句的主要内容,如果未能解决你的问题,请参考以下文章

请教Mybatis中如何在程序中获取Mapper中定义的SQL语句

如何使用 MyBatis Mapper 在 POJO 中获取 List<String>?

Mybatis源码分析1-如何获取Mapper实现类

请教mysql spring mvc +mybatis中批量插入的问题

Mybatis Mapper接口是如何找到实现类的-源码分析

Mybatis之Mapper调用源码分析