在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報錯的問題
總結
以上是生活随笔為你收集整理的在springBoot中使用Mapper类问题_@Mapper_@MapperScan_xml文件跟mapper分开_xml文件跟mapper在同一个目录下的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python3精要(25)-lambda
- 下一篇: python3精要(26)-map