解读Mapper与Mapper.xml文件之间匹配的问题

 更新时间:2023年01月09日 16:58:40   作者:实习生dc  
这篇文章主要介绍了解读Mapper与Mapper.xml文件之间匹配的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

Mapper与Mapper.xml文件之间匹配问题

这里我们做一个实例

user实体类

public class User {
    private Integer id;
    private String username;
    private String password;
    private String email;
    private String phone;

数据库user表

在这里插入图片描述

userMapper.xml

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="wdc.dao.UserMapper">
    <resultMap id="BaseResultMap" type="wdc.pojo.User">
        <!-- column为数据库字段名  property 为实体类字段名-->
        <id column="id" property="id" jdbcType="INTEGER"/>
        <result column="user_name" property="username" jdbcType="VARCHAR"/>
        <result column="user_password" property="password" jdbcType="VARCHAR"/>
        <result column="user_email" property="email" jdbcType="VARCHAR"/>
        <result column="user_phone" property="phone" jdbcType="VARCHAR"/>

    </resultMap>
    <!-- 这里 id 是数据库字段名 #{id}是实体类字段名,sql语句后面不加封号-->
    <select id="selectUser" parameterType="java.lang.Integer" resultMap="BaseResultMap">
         select *from USER where id=#{id}
    </select>
    <!--此sql用于登录查询
    #{username} 是对应mapper接口文件中 @Param注解中的参数名(防止mapper之间不匹配)-->
    <select id="login" parameterType="java.lang.String" resultMap="BaseResultMap">
        select *from user where user_name=#{username} and user_password=#{password}
    </select>
</mapper>

从上面不难看出,我们使用了resultMap作为映射集,目的是为了使得 实体类user 中的字段与数据库中的字段进行匹配。

而在查询中我们选择 使用结果集resultMap来进行数据映射

  <!-- 这里 id 是数据库字段名 #{id}是实体类字段名,sql语句后面不加封号-->
  <select id="selectUser" parameterType="java.lang.Integer" resultMap="BaseResultMap">

而在另一个查询中,我们在编写sql语句时,使用了对应userMapper文件中,@Param所对应的参数名

 <!-- #{username} 是对应mapper接口文件中 @Param注解中的参数名(防止mapper之间不匹配)-->
   <select id="login" parameterType="java.lang.String" resultMap="BaseResultMap">
       select *from user where user_name=#{username} and user_password=#{password}
   </select>

这里也是为了防止mapper 文件与 xml文件之间匹配出现异常。

userMapper

package wdc.dao;

import org.apache.ibatis.annotations.Param;
import wdc.pojo.User;

public interface UserMapper {
    User selectUser(int id)throws Exception;
    //    登录
    //    @Param中的参数名,对应.xml文件中sql语句#{}中的参数名(防止mapper之间不匹配)
    User login(@Param("username") String username, @Param("password") String password)throws Exception;
}

这里我们重点解释一下

@Param注解

这里我们应该,采用#{}的方式把@Param注解括号内的参数进行引用

对应的是使用方法,上述代码中明确标出。

这里我们也可以不使用@Param注解,前提是数据库字段与实体类字段一一对应,例如 数据库命名为user_name,而我们的实体类就应该使用 驼峰命名 userName,这样就可以使mybatis将查询的结果自发的进行一一对应填充置user 对象中。

但是由于此案例,数据库字段和实体类字段之间的命名方式,使得mybatis 从数据库中查出的字段,不能正常的识别和对应正确的实体类字段,于是,我们需要使用@Param注解来指明,我们所要引用的参数的名称,方便再mapper.xml文件中,采用#{}的方式把@Param注解括号内的参数进行引用,

这样会更方便代码的阅读,也便于避免一些未知错误的发生。

测试

关于对象判空,和空指针异常(NullPointer)

@Test
    public void testLogin() throws Exception{
        ApplicationContext ac = new ClassPathXmlApplicationContext("classpath:config/spring-mybatis.xml");
        UserMapper userMapper = (UserMapper) ac.getBean("userMapper");
        User user = null;

            user = userMapper.login("张","123");
            if(user == null)
                System.out.println("没数据");
            else
                System.out.println(user);


    }

这里测试登录接口后我们发现,当没有数据返回时,我们可以直接 使用  user==null 的方式来对 对象进行判空。

而当我们在此代码中,直接将异常使用 try catch 捕捉时,我们发现,当对象 user 为空时,控制台并不会报出异常。

而当我们在调用 user对象的toSring方法时,则会出现NullPoint的空指针异常

小结:

导致mapper 与xml之间出现不匹配的原因主要有:

  • 1. mapper 文件中 方法名与 xml 中查询语句id 进行匹配
  • 2. mapper 文件中 参数类型,与xml 文件中的参数类型匹配
  • 3. mapper 文件中 返回值类型,与xml文件中的 返回值类型匹配
  • 4. XML 文件的 namespace 指定的路径与 相应的实体类对应
  • 5. mapper 文件 和xml文件不在同一个包下的,要在配置文件中,将两个文件的包同时进行扫描

还有一些较为简单的异常不一一例举,但说明相应原因以供参考:

  • 6. 数据库密码填写错误
  • 7. 数据库服务未开启
  • 8. 数据库路径 以及乱码问题

jdbc.url=jdbc:mysql://localhost:3306/blog?characterEncoding=utf-8

Mapper和Mapper.xml的关系

Category.java

CategoryMapper.java 

这是mapper接口,面向接口编程的思想还是很重要的。也是本次博文最重要的部分。

接口定义有以下特点:

  • Mapper 接口方法名和 CategoryMapper.xml 中定义的每个 sql 的 id 同名。
  • Mapper 接口方法的输入参数类型和 CategoryMapper.xml 中定义的 sql 的parameterType 类型相同。
  • Mapper 接口的返回类型和 CategoryMapper.xml 中定义的 sql 的 resultType 类型相同

CategoryMapper.xml 

1.xml文件的namespace要写成mapper接口的路径。

2.sql的id和mapper中的方法名要对应起来,比如下面,mapper中方法名为add,insert的sql标签id也要为add

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • springboot整合shiro实现记住我功能

    springboot整合shiro实现记住我功能

    这篇文章主要介绍了springboot整合shiro实现记住我功能,配置类 ShiroConfig,通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2021-10-10
  • 解决java.util.zip.ZipException: Not in GZIP format报错问题

    解决java.util.zip.ZipException: Not in GZIP&nbs

    这篇文章主要介绍了解决java.util.zip.ZipException: Not in GZIP format报错问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • JavaWeb三大组件之监听器Listener详解

    JavaWeb三大组件之监听器Listener详解

    这篇文章主要介绍了JavaWeb三大组件之监听器Listener详解,在JavaWeb应用程序中,Listener监听器是一种机制,用于监听和响应特定的事件,它可以感知并响应与应用程序相关的事件,从而执行相应的逻辑处理,需要的朋友可以参考下
    2023-10-10
  • SpringBoot集成Seata的全过程

    SpringBoot集成Seata的全过程

    本文介绍了事务的四大特性(原子性、一致性、隔离性、持久性)以及本地事务和分布式事务的概念,本地事务是指在单个数据库级别的事务管理,而分布式事务则是跨多个数据库或服务的事务管理,感兴趣的朋友一起看看吧
    2024-11-11
  • Java 多个时间区间进行合并处理方法

    Java 多个时间区间进行合并处理方法

    用户在选择多个时间区间之后,如选择的时间区间连续或者有重叠,需要对所选的时间区间进行合并,这其实是一个区间合并问题,下面通过本文给大家介绍Java 多个时间区间进行合并处理的解决方案,一起看看吧
    2024-02-02
  • Seata AT获取数据表元数据源码详解

    Seata AT获取数据表元数据源码详解

    这篇文章主要为大家介绍了Seata AT获取数据表元数据源码详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • SpringBoot测试之@SpringBootTest与MockMvc的实战应用小结

    SpringBoot测试之@SpringBootTest与MockMvc的实战应用小结

    本文将深入探讨SpringBoot测试中两个核心工具:@SpringBootTest注解与MockMvc测试框架的实战应用,帮助开发者构建更稳健的测试体系,提高代码质量与可维护性,感兴趣的朋友一起看看吧
    2025-03-03
  • jstack报错Unable to open socket file解决

    jstack报错Unable to open socket file解决

    这篇文章主要为大家介绍了jstack报错Unable to open socket file的解决方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-02-02
  • JDBC增删改查和查唯一的完整代码解析

    JDBC增删改查和查唯一的完整代码解析

    这篇文章主要介绍了JDBC增删改查和查唯一的完整代码解析,代码分为第四部分,每部分代码都不错,对jdbc增删改查操作感兴趣的朋友一起学习吧
    2016-12-12
  • Java 通过 二三法 巧解前端数据显示

    Java 通过 二三法 巧解前端数据显示

    实践来源于理论,做开发前肯定要先了解相关的规则和原理,看到标题或许你会好奇什么是二三法。本篇文章带你深入了解,需要的朋友可以参考下
    2021-10-10

最新评论