@Mapper註解的使用

song854601134發表於2020-11-25

文章目錄

One

在用idea寫一個實現類時引用了mapper類的來呼叫dao層的處理,使用@Autowired註解時被標紅線,找不到bean。

img

解決辦法:在mapper加@mapper或者@repository註解。

這兩種註解的區別在於:

1、使用@mapper後,不需要在spring配置中設定掃描地址,通過mapper.xml裡面的namespace屬性對應相關的mapper類,spring將動態的生成Bean後注入到ServiceImpl中。

2、@repository則需要在Spring中配置掃描包地址,然後生成dao層的bean,之後被注入到ServiceImpl中


TWO

前言:

從mybatis3.4.0開始加入了@Mapper註解,目的就是為了不再寫mapper對映檔案(那個xml寫的是真的蛋疼。。。)。很噁心的一個事實是原始碼中並沒有對於這個註解的詳細解釋

現在我們通過一個簡易的maven專案去了解@Mapper註解的使用方式

完整專案請訪問我的github專案地址下載

  1. 構建一個maven的web專案,目錄結構如下:
    這裡寫圖片描述
  2. 匯入相應的依賴
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.4.5</version>
    </dependency>
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis-spring</artifactId>
        <version>1.3.1</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.0.2.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-tx</artifactId>
        <version>5.0.2.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>2.7</version>
    </dependency>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.1.6</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>5.0.2.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>6.0.6</version>
    </dependency>

這裡寫圖片描述
\3. 上程式碼

//UserDAO
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
 
import entity.User;
 
/**
 * 新增了@Mapper註解之後這個介面在編譯時會生成相應的實現類
 * 
 * 需要注意的是:這個介面中不可以定義同名的方法,因為會生成相同的id
 * 也就是說這個介面是不支援過載的
 */
@Mapper
public interface UserDAO {
 
    @Select("select * from user where name = #{name}")
    public User find(String name);
 
    @Select("select * from user where name = #{name} and pwd = #{pwd}")
    /**
      * 對於多個引數來說,每個引數之前都要加上@Param註解,
      * 要不然會找不到對應的引數進而報錯
      */
    public User login(@Param("name")String name, @Param("pwd")String pwd);
}

測試類程式碼

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
 
import dao.UserDAO;
import entity.User;
 
public class TestCase {
 
    @Test
    public void testMapper() {
        ApplicationContext ac = new ClassPathXmlApplicationContext("spring-mybatis.xml");
        UserDAO dao = ac.getBean(UserDAO.class);
        User u1 = dao.find("hehe");
        User u2 = dao.login("hehe", "123");
        System.out.println(u1.getName().equals(u2.getName()));
    }
}

測試結果:

這裡寫圖片描述

問題

我發現,Mapper註解可寫可不寫啊,你這裡不寫也不會報錯,我下載了你的專案試過了,請問這是為什麼 ?????

在SSM專案裡面,因為在你的配置檔案中注入了MapperScannerConfigurer(目的是將你的Dao變成bean),所以 不用寫@Mapper註解,但是Springboot專案中,假如你沒有寫@Mapper註解在你的Dao介面上,那麼注入dao介面是會失敗的,@Mapper就是告訴spring這是你指定的mapper

相關文章