SpringBoot项目整合Mybatis时Mapper.xml文件的三种存放位置方式
maven 引入依赖-- pagehelper 分页插件 --> < dependency > < groupId > com.github.pagehelper </ groupId > < artifactId > pagehelper-spring-boot-starter </ artifactId > </ dependency > <!
·
文章目录
一、参考
二、问题描述
最近在学习 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>
- 创建数据库
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;
- 创建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;
}
- 创建 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> {
}
- 修改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;
- 添加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>
- 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 {
}
- 控制器配置
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;
}
}
更多推荐
所有评论(0)