在springBoot中使用Mapper类问题_@Mapper_@MapperScan_xml文件跟mapper分开_xml文件跟mapper在同一个目录下

文章目录

  • 背景
  • xml文件跟mapper分开
    • application.properties
    • 方式一: 主程序中@MapperScan
    • 方式二: 每个接口添加@Mapper
    • 注意点
  • xml文件跟mapper在同一个目录下
  • SpringBoot中关于@Mapper 和 @Repository 的一些疑问
      • 1. @Mapper
      • 2. @Repository
      • 3. @MapperScan(“com.xxx.xxx”)
      • 4. 总结


背景

在springBoot中使用mapper类,因为有其xml文件的存在,所以其xml文件的存放位置不同,会导致出现运行是否能够调用xml文件的问题存在;这个问题我遇到N多次了,不好好的解决一番,实在是不好继续写项目下去了;

xml文件跟mapper分开

当xml文件跟mapper文件分开的时候,也就是将xml文件放在springBoot下的src/main/resources文件下,如下所示:
在这里插入图片描述

application.properties

当分开的时候,我们需要在application.properties主配置文件中配置如下:

mybatis.mapper-locations=classpath:mapper/*.xml
  • mybatis.mapper-locations
    指明是xml文件的路径

方式一: 主程序中@MapperScan

为了让mybatis扫描到我们的包,还需要在主程序中声明Mapper包的扫描,如下:
在这里插入图片描述
也可以不配置上边的扫描,在每个Mapper文件上加上@Mapper注解,每个文件都需要写上,没有上边的方便。

按照上边的配置,不需要在Mapper类中添加注解的,当我们在Service类中直接调用就是了,因为配置文件指明了;
但是这样idea会报红!
当我们在Service中调用的时候,还是会报无法注入,如下展示:
在PermissionMapper类中:
在这里插入图片描述

之后在Service类中使用Autowired注入,如下:
在这里插入图片描述
注意了:
这样虽然报错,但是项目运行没有一点影响!

如图运行成功:
在这里插入图片描述

也就是说是无伤大雅的;

但是要想消除这个idea的报错也可以滴;无法注入,是说没有这样的Bean存在,那么我们就添加一个注解,注入Bean嘛,所以在Mapper包下的所有mapper接口添加一个
@Repository注解
或者是
@Component注解

其效果是一样的,都是告知spring管理这个类为Bean;

这样就不会有报错了,如下:
在这里插入图片描述
在这里插入图片描述

方式二: 每个接口添加@Mapper

在方式一中,我们需要在主程序类中告诉Mybatis扫描mapper包;添加@MapperScan注解
如下:
在这里插入图片描述
我们也可以在每一个mapper接口中添加@Mapper注解,这样就不需要在主程序类中添加扫描了;如下:
在这里插入图片描述

注意点

在上面的两种方式中,有一个绕不开的点,就是在resources目录下创建的目录的时候,跟在java目录下创建目录是不一样的;

在java文件中我们创建的目录可以使用

这样表示子级目录,但是在resources文件下创建使用.

idea创建的时候就会误认为是一个名字,如下这样创建:
在这里插入图片描述
在盘符系统中,是这样的:
在这里插入图片描述
点开之后就只是一个文件,如下:
在这里插入图片描述

实际上我们需要使用的是子级目录形式,也就是在application.properties中写的:
mybatis.mapper-locations=classpath:mapper/*.xml

是一个目录路径;

所以,在resources目录下创建文件,需要以/创建,如下这样的形式:

这个锅就是idea来背!!!!!当我们打开其目录结构,就可以发现,如下:
在这里插入图片描述

点开之后如下:
在这里插入图片描述
但是idea本身也可查看其到底是否是一个目录,如下:
在这里插入图片描述
这样就可以显示是否是一个目录结构了,如下:
在这里插入图片描述

xml文件跟mapper在同一个目录下

application.properties中不需要配置这个。

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

在mapper包下

将原来在resources的mapper目录下的xml文件全部剪切到mapper包下,如下:
在这里插入图片描述

主程序类

主程序类还是指明了Mybatis扫描的包,不加@MapperScan扫描,可以在mapper文件中单独加上@Mapper注解。
在这里插入图片描述
然后运行主程序类,再访问,如下:
在这里插入图片描述

报错:找不到mapper.xml

注意了

xml文件是没有问题的,其它的也没有问题的;因为按照前面分开mapper类和xml文件,运行及其功能都是没有问题的!!!

并且在Ecplise中运行,按照上面的方式去配置,运行也没问题。。。。
但是在idea中就是不行。。。。。。。

百度了好大一会儿,才解决;

在idea中,默认情况下是不会去编译src/main/java下的xml文件的!!!
在idea中,默认情况下是不会去编译src/main/java下的xml文件的!!!

所以需要我们自己配置src/main/java也可以编译资源文件,在pom.xml文件中,如下:

     <!--资源路径--><resources><resource><directory>src/main/java</directory><includes><include>**/*.xml</include></includes></resource></resources>

注意这个资源是配置到build标签下的
然后当我们再运行的时候,就成功了~~~~
如下:
在这里插入图片描述
并且在编译文件中也有,如下:
在这里插入图片描述

SpringBoot中关于@Mapper 和 @Repository 的一些疑问

@Mapper 是 Mybatis 的注解,和 Spring 没有关系,@Repository 是 Spring 的注解,用于声明一个 Bean。

1. @Mapper

Mybatis 需要找到对应的 mapper,在编译的时候动态生成代理类,才能实现对数据库的一系列操作,所以我们需要在接口上添加 @Mapper 注解。

例如(这里只是为了演示并且sql不复杂,所以这里使用注解的方式来编写sql语句):

@Mapper
public interface UserMapper {@Select("select * from user where id = #{id}")User getById(Integer id);@Select("select * from user")List<User> getAll();
}

编写测试方法,可以发现加了自动装配注解的userMapper会出现报错(并不影响代码正常运行),这是因为@Mapper是Mybatis中的注解,我们没有显示的标明UserMapper是spring中的一个Bean,idea此时会认为在运行时找不到实例注入,所以会提示错误
在这里插入图片描述

虽然这个报错并不影响代码的正常运行,但是看着很不舒服,我们可以@Repository注解(也可以使用@Componet,只要注明这是一个bean就可以)来显示的说明UserMapper是一个bean

2. @Repository

@Repository 是spring提供的一个注解,用于声明 dao 层的 bean,如果我们要真正地使用 @Repository 来进行开发,那么我们需要手动实现UserMapperImpl,也就是说手写 JDBC代码!!!

@Repository
public class UserMapperImpl implements UserMapper{@Overridepublic User getById(Integer id){// 装载Mysql驱动// 获取连接// 创建Statement// 构建SQL语句// 执行SQL返回结果}
}

3. @MapperScan(“com.xxx.xxx”)

如果我们不使用@Mapper注解,还有另一种方式让Mybatis找到mapper接口,那就是 @MapperScan 注解,可以在启动类上添加该注解,自动扫描包路径下的所有mapper接口。

@SpringBootApplication
@MapperScan("com.example.springboot_mybatis.mapper")
public class SpringbootMybatisApplication {public static void main(String[] args) {SpringApplication.run(SpringbootMybatisApplication.class, args);}
}

使用@MapperScan注解之后,就不需要在mapper接口上添加任何注解了!!

4. 总结

  • 总的来说,@Mapper 和 @MapperScan 这两个必须有一个,否则就会出错!
  • @Repository 可有可无,对程序正常运行没什么影响,但是可以消除idea报错的问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/556573.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

上海交大python答案_上海交通大学python期末考试样题加解析

上海交通大学python期末考试样题加解析 一、选择题: 将唯一正确的选项写在题前括号中.每题2 分. 【 】(1) 本课程的目标定位是什么? [A] 学习Python 语言 [B] 学习计算机的工作原理 [C] 学习各种算法 [D] 学习用计算机解决问题 【 】(2) 下列哪个标识符是合法的? [A] var-nam…

hbase1.1.1 连接集群_Hadoop2.7.1+Hbase1.1.2集群环境搭建(10) hadoop hbase kerberos

1.hadoop安全机制历史在Hadoop1.0.0或者CDH3 版本之前&#xff0c; hadoop并不存在安全认证一说。默认集群内所有的节点都是可靠的&#xff0c;值得信赖的。用户与HDFS或者M/R进行交互时并不需要进行验证。导致存在恶意用户伪装成真正的用户或者服务器入侵到hadoop集群上&#…

SSM框架中mapper和mapping.xml文件在同一个包下需要的配置

前言 当我们在开发过程中&#xff0c;由于maven项目本身的限制&#xff0c;我们不能直接把我们的mapper.xml文件和对应mapper.java接口文件放到一起&#xff0c;也就是不能直接放在java包中&#xff0c;如图&#xff1a; 因为maven项目在构建打包时&#xff0c;会从src/main…

mysql配置文件简易代码_MySQL配置文件my.cnf 例子最详细翻译

转的MySQL配置文件my.cnf 例子最详细翻译,可以保存做笔记用。#BEGIN CONFIG INFO#DESCR: 4GB RAM, 只使用InnoDB, ACID, 少量的连接, 队列负载大#TYPE: SYSTEM#END CONFIG INFO## 此mysql配置文件例子针对4G内存。# 主要使用INNODB#处理复杂队列并且连接数量较少的mysql服务器#…

Spring+Mybatis使用MapperScannerConfigurer简化配置__MapperScannerConfigurer的作用

SpringMybatis使用MapperScannerConfigurer简化配置 MyBatis的一大亮点就是可以不用DAO层的实现类&#xff0c;而我们知道service层调dao层 如果没有实现类&#xff0c;Spring如何为Service注入DAO的实例呢&#xff1f; 比如 现在有一个dao层的bookmapper和配置mybatis的xm…

python的property用法_在python中property怎样使用-百度经验

在python中property可以使类中的方法变为类中的属性一样来使用&#xff0c;使得类中的属性值不易暴露&#xff0c;更加安全&#xff0c;那么在python中property怎样使用呢&#xff1f;下面小编就带大家来看看详细的教程&#xff01;工具/原料 python的版本&#xff1a;python 3…

Spring AOP 实现原理

什么是AOP AOP&#xff08;Aspect-OrientedProgramming&#xff0c;面向方面编程&#xff09;&#xff0c;可以说是OOP&#xff08;Object-Oriented Programing&#xff0c;面向对象编程&#xff09;的补充和完善。OOP引入封装、继承和多态性等概念来建立一种对象层次结构&…

java string类的方法_Java-String类的常用方法总结

一、String类String类在java.lang包中&#xff0c;java使用String类创建一个字符串变量&#xff0c;字符串变量属于对象。java把String类声明的final类&#xff0c;不能有类。String类对象创建后不能修改&#xff0c;由0或多个字符组成&#xff0c;包含在一对双引号之间二、Str…

python爬虫入门实战---------一周天气预报爬取_Python爬虫入门实战--------一周天气预报爬取【转载】【没有分析...

Python爬虫入门实战--------一周天气预报爬取【转载】【没有分析 Python爬虫入门实战--------一周天气预报爬取【转载】【没有分析】 来源&#xff1a;https://blog.csdn.net/qq_40705355/article/details/83856960七天天气来源&#xff1a;http://www.weather.com.cn/weather/…

Spring IOC原理总结

Spring容器高层视图 Spring 启动时读取应用程序提供的Bean配置信息&#xff0c;并在Spring容器中生成一份相应的Bean配置注册表&#xff0c;然后根据这张注册表实例化Bean&#xff0c;装配好Bean之间的依赖关系&#xff0c;为上层应用提供准备就绪的运行环境。 Bean缓存池&…

Linux开发工具——gcc篇

gcc的使用 文章目录 gcc的使用 历史遗留问题&#xff08;普通用户sudo&#xff09; gcc编译过程 预处理&#xff08;进行宏替换&#xff09; 编译&#xff08;生成汇编&#xff09; 汇编&#xff08;生成机器可识别代码&#xff09; 链接&#xff08;生成可执行文件或库文件&a…

Spring中ioc的实现原理

学习过Spring框架的人一定都会听过Spring的IoC(控制反转) 、DI(依赖注入)这两个概念&#xff0c;对于初学Spring的人来说&#xff0c;总觉得IoC 、DI这两个概念是模糊不清的&#xff0c;是很难理解的&#xff0c;今天和大家分享网上的一些技术大牛们对Spring框架的IOC的理解以及…

如何将一个向量投影到一个平面上_CameraLidar投影:2D3D导航

点击上方“AI小白学视觉”&#xff0c;选择加"星标"或“置顶”重磅干货&#xff0c;第一时间送达图1.图像上的激光雷达点激光雷达和照相机是用于感知和理解场景的两个基本传感器。他们建立周边环境模型、提供检测和确定其他对象位置的方法&#xff0c;从而为机器人提…

JAVA中和、||和|的区别?

问题一&#xff1a;JAVA中&&和&、||和|&#xff08;短路与和逻辑与、短路或和逻辑或&#xff09;的区别&#xff1f; 首先名称是不同的 逻辑运算符&#xff1a;&#xff06;&#xff06;逻辑与  &#xff5c;&#xff5c;逻辑或  它们都是逻辑运算符 位运算…

pppoe拨号的外网ip无法ping通_【思唯网络学院】 五大网络概念:IP地址、子网掩码、网关、DHCP服务和PPPoE拨号...

5G技术的更新&#xff0c;推动了新一代的网络通信发展&#xff0c;家庭宽带上网也从最初的十几K的速度&#xff0c;提升到了现在动则上百上千兆的速度&#xff0c;很多有部署了家庭NAS的用户&#xff0c;甚至都已经更新到了10G级别的内部局域网了。在这个信息互联的时代&#x…

MySQL数据库的数据类型以及取值范围详解

主要包括以下五大类&#xff1a; 整数类型&#xff1a;BIT、BOOL、TINY INT、SMALL INT、MEDIUM INT、 INT、 BIG INT 浮点数类型&#xff1a;FLOAT、DOUBLE、DECIMAL 字符串类型&#xff1a;CHAR、VARCHAR、TINY TEXT、TEXT、MEDIUM TEXT、LONGTEXT、TINY BLOB、BLOB、MEDI…

flex布局_flex布局的 flex(felx-grow、flex-shrink、flex-basis)详解

flex布局中的flex-grow,flex-shrink,flex-basis接上篇文章&#xff0c;1. flex-grow属性flex-grow定义剩余空间的分成。默认为0&#xff0c;即如果存在剩余空间&#xff0c;也不放大。如何理解这里的剩余空间呢&#xff0c;用例子来说明吧。默认的情况(flex-grow:0)在浏览器下是…

Mina网络通信框架

认识 Mina Apache Mina Server 是一个网络通信应用框架&#xff0c;与 Netty 出自同一作者&#xff0c;Netty 借鉴了部分 Mina 的设计思路。 Mina 主要是对基于 TCP/IP、UDP/IP 协议栈的通信框架&#xff0c;Mina 可以帮助我们快速开发高性能、高扩展性的网络通信应用&#x…

每个tabpage中都有一个dategridview_每个女人,都有一个礼服梦

●今天&#xff0c;我要带着大家跟随几部经典电影&#xff0c;来开启一场关于礼服的时空穿越。01. 《爱玛》//关键词&#xff1a;19世纪初英国乡村经历了巴洛克风格的洗礼&#xff0c;服饰的整体风格变得柔和了不少&#xff0c;蕾丝、细纱、蝴蝶结这些浪漫元素&#xff0c;是这…

ssm框架sql换成MySQL_搭建ssm框架,可实现登录和数据展示以及增删改查

需求&#xff1a;后台使用ssm(spring-springMVC-mybatis)进行整合前台使用bootstrap框架前后台交互使用Ajax进行发送表结构&#xff1a;登录页面后显示所有用户信息&#xff0c;可对每条进行增删改查登录时也使用本表的user_name和user_pwd进行校验项目目录结构步骤一&#xff…