mybatis使用mapper代理开发方式

 更新时间:2024年10月19日 09:50:11   作者:xvwen  
使用MyBatis代理开发模式时,需要注意定义与映射配置文件同名的接口类,确保namespace属性与接口路径一致,接口方法名和映射文件中的id名称相同,返回类型保持一致,在mybatis-config.xml中配置映射文件路径,保证结构一致,可通过注解@Param传递多个参数

mapper代理开发规则

使用mybatis的代理开发,不仅可以用来管理冗多的xml配置文件,还可以解决硬编码,传递多个参数,简化执行sql的优点。

主要有以下注意事项:

  1. 定义与映射的配置文件(UserMapper.xml)同名的接口类,并且要在同一目录下。
  2. 映射文件中的namspace属性为接口类的路径。
  3. 在接口类中实现映射的配置文件方法时,方法名和映射文件的id属性的名称一样。返回数据类型也一样。
  4. mybatis-config.xml的映射配置文件的路径要一一对应。

对上面有疑惑的可以看我之前的文章 mybatis基础

创建mapper目录结构和映射接口类

根据上面的规则来具体实现,在java目录下创建mapper软件包,将UserMapper接口放在该目录下。

在resources下创建mapper目录,将隐射配置文件放在该目录下。

可以下载mybatisX插件将两者联系起来。

maven目录结构下,java和resources编译后在同一目录下,他们里面的包也是。

所以满足规则但是层级结构必须一样。

当然也可以直接将xml放在java目录下的mapper包中即和UserMapper在一起,就不需要考虑其他问题了。满足第一个规则。

修改映射配置文件的namespace属性

使用mapper映射代理开发,这个属性就显得尤为重要,UserMapper接口(映射接口类)和UserMapper.xml

(映射配置文件)的联系都是产生于namespace属性。

<?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="mapper.UserMapper">
        <select id="selectAll" resultType="model.User">
            select * from user
        </select>

        <select id="selectById" resultType="model.User">
            select  * from user where id=#{id}
        </select>
</mapper>

将namespace的内容由test(自定义)改为mapper.UserMapper(映射接口所在的路径)。满足第二个规则。

编写映射接口类的方法

package mapper;

import model.User;
import java.util.List;

public interface UserMapper {
    List<User> selectAll();  //默认public关键字修饰,selectAll对应xml的id属性

}

前面我们知道xml配置文件的id属性本身时一个方法,可以看作mybatis将其封装为一个resultSet(jdbc)的结果集,接口的作用主要是继承该方法并处理结果集。

用list集合存储结果集。满足第三个规则

修改mybatis-config.xml的映射配置文件的路径

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
  <environments default="development">
    <environment id="development">
      <transactionManager type="JDBC"/>
      <dataSource type="POOLED">
      <!--连接配置->
        <property name="driver" value="${driver}"/>
        <property name="url" value="${url}"/>
        <property name="username" value="${username}"/>
        <property name="password" value="${password}"/>
      </dataSource>
    </environment>
  </environments>
  <mappers>
 	<!--mappper映射路径-->
    <mapper resource="UserMapper.xml"/>
  </mappers>
</configuration>

要修改的只有mapper标签下颚resource属性,内容为映射配置文件的路径:mapper/UserMapper.xml

这是我的目录结构每个人的不一样。

当然你的映射配置文件较多时直接用packge标签把整个mapper包直接加载进来(包扫描)

如果时直接把包导入的话,就不是/来展现目录的层级了,而是.来体现。如util.chapter.mapper。实现规则四。

编写测试类调用方法

package mybatis;
import mapper.UserMapper;
import model.User;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class MybatisTest {

    @Test
    public void method() throws IOException {     //单元测试不能要static
        //mybatis框架都在xml配置文件中加载配置文件
        //从 XML 文件中构建 SqlSessionFactory 的实例
        String resource = "mybatis-config.xml";
        InputStream inputStream = null;

        inputStream = Resources.getResourceAsStream(resource);

        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        //从 SqlSessionFactory 中获取 SqlSession
        SqlSession session = sqlSessionFactory.openSession();


        //执行sql
        //List<User> users=session.selectList("test.selectAll");
        //System.out.println(users);

        //mapper代理执行sql
        UserMapper userMapper=session.getMapper(UserMapper.class);
        List<User> users= userMapper.selectAll();  //UserMapper接口的实现方法
        System.out.println(users);

        //释放资源
        session.close();

    }
}

注意要导入javabean和映射接口类。使用代理和不使用的区别。

如下面的映射文件的配置,那么如何调用有多个参数的方法呢?

配置文件xml

<select id="selectAll" resultType="model.User">
	select * from user
</select>

<select id="selectById" resultType="model.User">
    select  * from user where id=#{id}
</select>

<select id="selectmore" resultType="model.User">
    select * from user where id =#{id} and username=#{username}
</select>

映射接口类

List<User> selectAll();  //默认public关键字修饰
List<User> selectById(int id);
List<User> selectMore(int id,String name);

mybatis的参数传递:

当传递多个不同类型的参数时mybatis将参数封装为map集合,并默认有key,可以通过@param注解更改key的名称,value保留参数的值,通过更改后的key名称获取参数。当只有一个参数时就不用了。

javabean的参数类型:可以直接使用,对象的属性名和参数占位符保持一致即可,上面使用的reultType手势javabean对象,位置对应就可以了。

Map集合 :map的键和参数占位符一致也直接使用。

(上面的数据类型可以直接传递,位置对应即可)

array,list当数据类型都要加注解@param。

实际上sql的占位符会接收该方法传递的参数,mybatis是将参数封装为一个map集合,占位符的名称就是key,但是系统默认的key并不是,需要用@param将默认的key改为占位符的名称就可以了。

具体操作就是@param中的值与xml文件的占位符一致就可以了,紧跟着就是参数了。调用也是按位置传参。

所有数据类型的都可以用注解@Param来传参(P大写)。

总结

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

相关文章

  • JavaWeb工程web.xml基本配置过程解析

    JavaWeb工程web.xml基本配置过程解析

    这篇文章主要介绍了JavaWeb工程web.xml基本配置过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • 如何使用java给局域网的电脑发送开机数据包

    如何使用java给局域网的电脑发送开机数据包

    这篇文章主要为大家详细介绍了如何使用java给局域网的电脑发送开机数据包,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-09-09
  • 最好的Java 反编译工具的使用对比分析

    最好的Java 反编译工具的使用对比分析

    恰好最近工作中也需要用到 Java 反编译,所以这篇文章介绍目前常见的的几种 Java 反编译工具的使用,在文章的最后也会通过编译速度、语法支持以及代码可读性三个维度,对它们进行测试,分析几款工具的优缺点,感兴趣的朋友一起看看吧
    2021-05-05
  • java实现数据结构单链表示例(java单链表)

    java实现数据结构单链表示例(java单链表)

    这篇文章主要介绍了java数据结构实现单链表示例,需要的朋友可以参考下
    2014-03-03
  • @JsonSerialize注解的使用示例教程

    @JsonSerialize注解的使用示例教程

    在开发中,有时候某些字段需要特殊处理,比如我们有一个日期字段,当日期为NULL时给前端不返回NULL而返回为其他等信息,就需要自定义字段的序列化,这就是@JsonSerialize的用处,本文给大家介绍@JsonSerialize注解的使用,感兴趣的朋友一起看看吧
    2023-11-11
  • Netty + ZooKeeper 实现简单的服务注册与发现

    Netty + ZooKeeper 实现简单的服务注册与发现

    服务注册和发现一直是分布式的核心组件。本文介绍了借助 ZooKeeper 做注册中心,如何实现一个简单的服务注册和发现。,需要的朋友可以参考下
    2019-06-06
  • Servlet获取AJAX POST请求中参数以form data和request payload形式传输的方法

    Servlet获取AJAX POST请求中参数以form data和request payload形式传输的方法

    这篇文章主要介绍了Servlet获取AJAX POST请求中参数以form data和request payload形式传输的方法,结合实例形式详细分析了post数据发送及获取请求数据的原理与相关操作注意事项,需要的朋友可以参考下
    2017-11-11
  • Java Calendar类的使用总结实例

    Java Calendar类的使用总结实例

    这篇文章主要介绍了Java Calendar类的使用总结实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • 深入理解JAVA 备忘录模式

    深入理解JAVA 备忘录模式

    这篇文章主要介绍了JAVA 备忘录模式的的相关资料,文中示例代码非常细致,供大家参考和学习,感兴趣的朋友可以了解下
    2020-06-06
  • Springboot结合Mybatis-Plus实现业务撤销回滚功能

    Springboot结合Mybatis-Plus实现业务撤销回滚功能

    本文介绍了如何在Springboot结合Mybatis-Plus实现业务撤销回滚功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-12-12

最新评论