小工具      在线工具  汉语词典  dos游戏  css  js  c++  java

mybatis使用mapper代理开发

# MyBatis,mybatis,xml,mysql,javaweb 额外说明

收录于:18天前

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)结果集。该接口的主要作用就是继承该方法,并对结果集进行处理。使用列表集合来存储结果集。满足第三条规则

修改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的参数类型:可以直接使用。对象的属性名和参数占位符可以保持一致。上面使用的resultType手势javabean对象可以相应定位。

Map集合 :map的键和参数占位符一致也直接使用。
在这里插入图片描述
(上面的数据类型可以直接传递,位置对应即可)

array,list当数据类型都要加注解@param。
在这里插入图片描述
实际上sql的占位符会接收该方法传递的参数,mybatis是将参数封装为一个map集合,占位符的名称就
是key,但是系统默认的key并不是,需要用@param将默认的key改为占位符的名称就可以了。具体操作就是@param中的值与xml文件的占位符一致就可以了,紧跟着就是参数了。调用也是按位置传参。
在这里插入图片描述

在这里插入图片描述

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

. . .

相关推荐

额外说明

mysql源码安装

Linux环境 1、mysql下载地址:https://dev.mysql.com/downloads/mysql/5.7.html#downloads 下载参考: 2、把下载的 MySQL 压缩包上传到 Linux 服务器 3、解压mysql-5.7.

额外说明

SpringMVC @RequestBody 日期类型Json转换

正常使用Json或Gson对Date类型序列化成字符串时,得到的是类似”Dec 5, 2017 8:03:34 PM”这种形式的字符串,前端得到了这种格式的很难明白这个具体是什么时间,可读性很低。同时如果用这种形式的字符串来反序列化为Date对象,也会失

额外说明

DDR3内存详解

https://blog.csdn.net/a_chinese_man/article/details/73381338 添加链接描述

额外说明

直接下载Windows和office安装包的链接,这个网站值得收藏

前面分享了一个下载Windows和office官方安装包的网站:我告诉你! 这个网站是通过磁力链接下载的,所以有时候会发现某些磁力链接下载非常慢。本期分享一个直链下载Windows和office官方安装包的网站。 网站名称:TechBench官方网址:h

额外说明

【Mybatis】MyBatis的各种查询功能(查实体类对象,查集合,查单个数据,查询结果为map集合)

MyBatis的各种查询功能 1.查询一个实体类对象 2.查询一个list集合 3.查询单个数据 4.查询一条数据为map集合 5.查询多条数据为map集合 1.查询一个实体类对象 /* * 根据用户id查询 * */ User

额外说明

【Java 进阶篇】JDBC(Java Database Connectivity)详解

JDBC(Java Database Connectivity)是 Java 中用于连接和操作数据库的标准 API。它允许 Java 应用程序与不同类型的数据库进行交互,执行查询、插入、更新和删除等操作。本文将详细介绍 JDBC 的各个类及其用法,以帮助

额外说明

2020前端面试题含解析汇总——基础篇(四)

 您的关注收藏是我持续更新总结的动力!  欢迎各位大佬不吝才华补充更全面的解析供大家参考~  2020前端面试题含解析汇总——基础篇(一)  2020前端面试题含解析汇总——基础篇(二)  2020前端面试题含解析汇总——基础篇(三)  2020前端面试

额外说明

问题随记 —— 最新版 Android Studio 项目配置 repositories

文章目录 问题描述 解决方法 问题描述 在 AS 项目中配置 allprojects {} 发现报错。 (time:2022.09) 解决方法 此时的 AS 项目该配置已经迁移到 settings.gradle ,repositories 相关配置可以到

额外说明

Java Web应用小案例:实现用户登录功能

文章目录 零、本节学习目标 一、纯JSP方式实现用户登录功能 (一)实现思路 (二)实现步骤 1、创建Web项目 2、创建登录页面 3、创建登录处理页面 4、创建登录成功页面 5、创建登录失败页面 6、编辑项目首页 (三)测试结果 二、JSP+Servl

额外说明

Java学习笔记2.3.6 运算符与表达式 - 条件运算符

文章目录 零、本讲学习目标 一、条件运算符概念 二、条件运算符使用 (一)语法格式 (二)案例演示 任务1、计算分段函数值 思考题:不用条件运算符怎么计算分段函数值? 任务2、根据输入年龄提示不同信息 零、本讲学习目标 理解条件运算符的作用 能正确使用条

ads via 小工具