實際上,這是一個非常簡單的問題。我並沒有一口回絕他,讓他去百度。因為,新人都會經歷這個過程。好不容易,問你一次,你直接讓他百度,會打擊到他的。而且,別人會覺得你擺架子。
@Mapper 這個注解的定義如下:
@Documented
@Inherited
@Retention(RUNTIME)
@Target({ TYPE, METHOD, FIELD, PARAMETER })
public @interface Mapper {
// Interface Mapper
}
@Mapper 一般我們用在接口上,代碼如下:
@Mapper
public interface UserDAO {
@Select("select * from user where name = #{name}")
User find(String name);
@Select("select * from user where name = #{name} and pwd = #{pwd}")
/**
* 對於多個參數來說,每個參數之前都要加上@Param注解,
* 要不然會找不到對應的參數進而報錯
*/
User login(@Param("name")String name, @Param("pwd")String pwd);
}
使用 @Mapper,最終 Mybatis 會有一個攔截器,會自動的把 @Mapper 注解的接口生成動態代理類。這點可以在 MapperRegistry 類中的源代碼中查看。
@Mapper 注解針對的是一個一個的類,相當於是一個一個 Mapper.xml 文件。而一個接口一個接口的使用 @Mapper,太麻煩了,於是 @MapperScan 就應用而生了。@MapperScan 配置一個或多個包路徑,自動的掃描這些包路徑下的類,自動的為它們生成代理類。
@SpringBootApplication
@MapperScan({"com.xttblog.mapper","com.xttblog.dao"})
public class XttblogApp {
public static void main(String[] args) {
SpringApplication.run(XttblogApp.class, args);
}
}
當使用了 @MapperScan 注解,將會生成 MapperFactoryBean, 如果沒有標注 @MapperScan 也就是沒有 MapperFactoryBean 的實例,就走 @Import 里面的配置,具體可以在 AutoConfiguredMapperScannerRegistrar 和 MybatisAutoConfiguration 類中查看源代碼進行分析。
由此可見,動態代理和 AOP 知識非常的重要,各種框架都在大量的使用。