一、参考

  1. SpringBoot项目整合Mybatis时Mapper.xml文件的存放位置

二、问题描述

最近在学习 mybatis 与 springboot 集成的时候,将 mapper.xml 文件放在了 mapping目录下,即mybatis-study/src/main/resources/mapping/StudentMapper.xml, 结果运行一直报错,提示没有找到对应的方法,自己反复检查代码,最后请同事发现,需要将mapping目录改为mapper目录即可,即mybatis-study/src/main/resources/mapper/StudentMapper.xml, 问题解决,写这篇博客,方便自己学习

三、MyBatis中Mapper.xml文件的三种存放位置

方式一:放在与Mapper接口同级目录
方式二:在resources创建Mapper接口同名文件夹用来存放Mapper.xml文件
方式三:在resources目录下创建mapper文件夹存放mapper.xml(推荐)

3.1 放在与Mapper接口同级目录

在这里插入图片描述
在pom.xml中 节点添加如下配置,用于加载资源:

<build>
    <resources>
        <!-- 扫描src/main/java下所有xx.xml文件 -->
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.xml</include>
            </includes>
        </resource>
        <!-- 扫描resources下所有资源 -->
        <resource>
            <directory>src/main/resources</directory>
        </resource>
    </resources>
</build>

3.2 在resources创建Mapper接口同名文件夹用来存放Mapper.xml文件

在这里插入图片描述

3.3 在resources目录下创建mapper文件夹存放mapper.xml(推荐)

在这里插入图片描述

在application.properties中做如下配置:

mybatis.mapper-locations=classpath:/mapper/*.xml

四、项目案例介绍

在这里插入图片描述

maven 引入依赖

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.hb</groupId>
        <artifactId>alibaba-cloud-study</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <artifactId>mybatis-study</artifactId>
    <packaging>jar</packaging>

    <name>mybatis-study</name>
    <url>http://maven.apache.org</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
        </dependency>
        <!-- spring -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus</artifactId>
        </dependency>

        <!-- pagehelper 分页插件 -->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
        </dependency>

        <!-- jdk 8+ 引入可选模块 pagehelper 依赖 -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-jsqlparser-4.9</artifactId>
        </dependency>
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper</artifactId>
            <version>6.0.0</version>
        </dependency>

        <!--此依赖默认使用Hikari连接池-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>

        <!-- 默认版本是 8.0.22-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.22</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </dependency>

        <dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>knife4j-openapi2-spring-boot-starter</artifactId>
            <version>4.4.0</version>
        </dependency>

    </dependencies>
    <build>
        <resources>
            <!-- 扫描src/main/java下所有xx.xml文件 -->
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
            </resource>
            <!-- 扫描resources下所有资源 -->
            <resource>
                <directory>src/main/resources</directory>
            </resource>
        </resources>
    </build>
</project>

  1. 创建数据库

在这里插入图片描述

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for jobs
-- ----------------------------
DROP TABLE IF EXISTS `jobs`;
CREATE TABLE `jobs`  (
  `job_id` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '',
  `job_title` varchar(35) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `min_salary` int(6) NULL DEFAULT NULL,
  `max_salary` int(6) NULL DEFAULT NULL,
  PRIMARY KEY (`job_id`) USING BTREE,
  UNIQUE INDEX `job_id_pk`(`job_id` ASC) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of jobs
-- ----------------------------
INSERT INTO `jobs` VALUES ('AC_ACCOUNT', 'Public Accountant', 4200, 9000);
INSERT INTO `jobs` VALUES ('AC_MGR', 'Accounting Manager', 8200, 16000);
INSERT INTO `jobs` VALUES ('AD_ASST', 'Administration Assistant', 3000, 6000);
INSERT INTO `jobs` VALUES ('AD_PRES', 'President', 20000, 40000);
INSERT INTO `jobs` VALUES ('AD_VP', 'Administration Vice President', 15000, 30000);
INSERT INTO `jobs` VALUES ('FI_ACCOUNT', 'Accountant', 4200, 9000);
INSERT INTO `jobs` VALUES ('FI_MGR', 'Finance Manager', 8200, 16000);
INSERT INTO `jobs` VALUES ('HR_REP', 'Human Resources Representative', 4000, 9000);
INSERT INTO `jobs` VALUES ('IT_PROG', 'Programmer', 4000, 10000);
INSERT INTO `jobs` VALUES ('MK_MAN', 'Marketing Manager', 9000, 15000);
INSERT INTO `jobs` VALUES ('MK_REP', 'Marketing Representative', 4000, 9000);
INSERT INTO `jobs` VALUES ('PR_REP', 'Public Relations Representative', 4500, 10500);
INSERT INTO `jobs` VALUES ('PU_CLERK', 'Purchasing Clerk', 2500, 5500);
INSERT INTO `jobs` VALUES ('PU_MAN', 'Purchasing Manager', 8000, 15000);
INSERT INTO `jobs` VALUES ('SA_MAN', 'Sales Manager', 10000, 20000);
INSERT INTO `jobs` VALUES ('SA_REP', 'Sales Representative', 6000, 12000);
INSERT INTO `jobs` VALUES ('SH_CLERK', 'Shipping Clerk', 2500, 5500);
INSERT INTO `jobs` VALUES ('ST_CLERK', 'Stock Clerk', 2000, 5000);
INSERT INTO `jobs` VALUES ('ST_MAN', 'Stock Manager', 5500, 8500);

SET FOREIGN_KEY_CHECKS = 1;

  1. 创建Entity 实体类
package com.hb.pojo;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

@Data
@TableName("`jobs`")
public class Jobs {
    /**
     * 主键
     * @TableId中可以决定主键的类型,不写会采取默认值,默认值可以在yml中配置
     * AUTO: 数据库ID自增
     * INPUT: 用户输入ID
     * ID_WORKER: 全局唯一ID,Long类型的主键
     * ID_WORKER_STR: 字符串全局唯一ID
     * UUID: 全局唯一ID,UUID类型的主键
     * NONE: 该类型为未设置主键类型
     */
    @TableId(value = "job_id",type = IdType.AUTO)
    String jobId;
    @TableField(value = "job_title")
    String jobTitle;
    @TableField(value = "min_salary")
    int minSalary;
    @TableField(value = "max_salary")
    int maxSalary;
}
  1. 创建 Mapper 接口,以及对应的
package com.hb.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.hb.pojo.Jobs;
import org.apache.ibatis.annotations.Mapper;

//@Mapper//将接口交给spring管理,接口并不能创建duixiang,管理的是UserMapper的代理对象
@Mapper
//@MapperScan("com.jt.mapper")将此注解添加到启动类,可以自动扫描mapper包下的所有注解,因此此处不用再添加@mapper
public interface JobsMapper extends BaseMapper<Jobs> {
}
  1. 修改application.properties 指明数据源、Mapper.xml 文件对应的目录
server:
  port: 8010
# NEVER:禁用ANSI-colored输出(默认项)
# DETECT:会检查终端是否支持ANSI,是的话就采用彩色输出(推荐项)
# ALWAYS:总是使用ANSI-colored格式输出,若终端不支持的时候,会有很多干扰信息,不推荐使用
spring:
  output:
    ansi:
      enabled: detect
  #配置数据源
  datasource:
    url: jdbc:mysql://localhost:33306/atguigudb?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: 123456
    type: com.zaxxer.hikari.HikariDataSource
    hikari:
      # 连接池中允许的最小连接数。缺省值:10
      minimum-idle: 10
      # 连接池中允许的最大连接数。缺省值:10
      maximum-pool-size: 100
      # 自动提交
      auto-commit: true
      # 一个连接idle状态的最大时长(毫秒),超时则被释放(retired),缺省:10分钟
      idle-timeout: 600
      # 连接池名字
      pool-name: 泡泡的HikariCP
      # 一 个连接的生命时长(毫秒),超时而且没被使用则被释放(retired),缺省:30分钟,建议设置比数据库超时时长少30秒
      max-lifetime: 1800000
      # 等待连接池分配连接的最大时长(毫秒),超过这个时长还没可用的连接则发生SQLException, 缺省:30秒
      connection-timeout: 30000
  logging:
    level:
      com.hb.order.dao.StudentMapper: debug
logging:
  level:
    root: info
    #    将日志记录级别应用于特定的软件包。
    com.hb.order.controller: debug
    com.hb.order.aop: debug
#  Spring Boot官方推荐优先使用带有-spring的文件名作为你的日志配置(如使用logback-spring.xml,而不是logback.xml),
#  命名为logback-spring.xml的日志配置文件,Spring boot可以为它添加一些Spring boot特有的配置项。
#  上面是默认的命名规则,并且放在src/main/resources下面即可。
#  config: classpath:logging-config.xml
#by zhengkai.blog.csdn.net
#mybatis-plus配置控制台打印完整带参数SQL语句
mybatis-plus:
  configuration:
    # 打印 SQL 日志
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    mapper-locations: classpath:/mapper/*.xml, classpath*:/**/*Mapper.xml;
  1. 添加JobsMapper 接口对应的 JobsMapper.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="com.hb.mapper.JobsMapper">

    <resultMap id="jobsResultMap" type="com.hb.pojo.Jobs">
        <result column="job_id" jdbcType="VARCHAR" property="jobId" />
        <result column="job_title" jdbcType="VARCHAR" property="jobTitle" />
        <result column="min_salary" jdbcType="INTEGER" property="minSalary" />
        <result column="max_salary" jdbcType="INTEGER" property="maxSalary" />
    </resultMap>

    <select id="selectPageVo" resultType="com.hb.pojo.Jobs">
        SELECT * FROM jobs
    </select>
</mapper>
  1. mybatis-plus 对应的service
package com.hb.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.hb.pojo.Jobs;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Transactional
public interface JobsService extends IService<Jobs> {
}

package com.hb.service.imp;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hb.mapper.JobsMapper;
import com.hb.pojo.Jobs;
import com.hb.service.JobsService;
import org.springframework.stereotype.Service;

@Service
public class JobsServiceImp extends ServiceImpl<JobsMapper, Jobs> implements JobsService {
}

  1. 控制器配置
package com.hb.controller;


import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.pagehelper.PageHelper;
import com.hb.mapper.JobsMapper;
import com.hb.pojo.Jobs;
import com.hb.service.JobsService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@Api(tags = {"swagger 模块学习"}, value = "数据字典控制器")
public class JobsController {

    @Autowired
    private JobsMapper jobsMapper;

    @Autowired
    private JobsService jobsService;

    @ApiOperation("mybatis 测试")
    @GetMapping("/getJob/{id}")
    public String getJobById(@PathVariable int id) {
        Jobs jobs = jobsMapper.selectById("AC_ACCOUNT");
        return jobs.toString();
    }
    @GetMapping("/jobs/list")
    public List<Jobs> getJobsList() {
        //int pageNum = 2;
        //int pageSize = 5;
        //PageHelper.startPage(pageNum,pageSize);
        List<Jobs> list = jobsService.list();
        return list;
    }

    @GetMapping("/jobs/list2")
    public List<Jobs> getJobsList2() {
        Page pageParam = new Page(2, 1);
        QueryWrapper<Jobs> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("job_id", "AD_VP");
        List<Jobs> jobs = jobsMapper.selectList(queryWrapper);
        System.out.println("jobs = " + jobs);
        return jobs;
    }

    @GetMapping("/jobs/list3")
    public Page<Jobs> getJobsList3() {
        Page pageParam = new Page(2, 5);
        QueryWrapper<Jobs> queryWrapper = new QueryWrapper<>();
        queryWrapper.ne("job_id", "");
        Page<Jobs> page = jobsService.page(pageParam, queryWrapper);
        //Page<Jobs> page = jobsMapper.selectPage(pageParam, queryWrapper);
        return page;
    }

    @GetMapping("/jobs/list4")
    public Page<Jobs> getJobsList4() {
        Page pageParam = new Page(2, 5);
        QueryWrapper<Jobs> queryWrapper = new QueryWrapper<>();
        queryWrapper.ne("job_id", "");
        Page<Jobs> page = jobsMapper.selectPage(pageParam, queryWrapper);
        return page;
    }
}
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐