spring-mybatis兩個標籤與兩個配置

1、問題描述

關於spring-mybatis,有兩個標籤:@MapperScan 、@Mapper和兩個配置:mybatis.type-aliases-package與mybatis.mapper-locations,經常在各個配置文件中看到,用於spring結合mybatis使用,有時候可能會有點弄混了,什麼情況下必須使用?簡單介紹下。

2、解決方案

2.1 @MapperScan 與@Mapper

這兩個標籤作用其實一樣,可以理解爲一個是整體配置,一個是單獨配置;

2.1.1 @MapperScan配置在springboot的啓動類上

@SpringBootApplication
@MapperScan("com.laowang.springtest.db")
public class SpringtestApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringtestApplication.class, args);
    }
}

作用是掃描指定包下面的接口類,進而生成mybatis的代理類;

多種配置,可以指定多個包:

(1)一個包:

@MapperScan("com.laowang.springtest.db")

(2)多個包:

@MapperScan({"com.laowang.springtest.db","com.laowang.springtest.db1","com.laowang.springtest.db2"}) 

(3)通配符:

一個*代表只能掃描任意單個包,無法遞歸掃描* @MapperScan("com.laowang.*.db")
兩個**代表可以掃描任意個包,可以遞歸掃描@MapperScan("com.laowang.**.db")

2.1.2 @Mapper配置在mytatis接口類上

@MapperScan是會自動掃描包下面的接口類,類似會給每個接口類自動加上@Mapper。

@Mapper可以單獨使用,不使用@MapperScan,同時使用也不會報錯;

@Mapper
public interface UserMapper {
    int deleteByExample(UserExample example);
}

2.2 mybatis.type-aliases-package與mybatis.mapper-locations

2.2.1 type-aliases-package

第一個mybatis.type-aliases-package可以不用管,它的作用是指定實體類所在包,然後在xml參數中就可以不寫包名;

例如:

  <insert id="insert" parameterType="com.laowang.springtest.db.entity.User">
    insert into user (id, name, password
      )
    values (#{id,jdbcType=INTEGER}, #{name,jdbcType=VARCHAR}, #{password,jdbcType=VARCHAR}
      )

假如配置了type-aliases-packag:

mybatis:
   type-aliases-packag: com.laowang.springtest.db.entity

parameterType就可以省去包名,直接更改爲:parameterType="User",意義不大;

2.2.2 mybatis.mapper-locations

這個配置還是很有作用的,用戶標記或者指定mybatis對應xml的路徑;

兩個情況:

第一個是使用mytatis-genarator默認生成的mybatis接口類與xml再同一目錄下,這個時候可以不設置這個配置,也能正常加載和使用,如下可以不使用這個配置;

第二種,一般項目中會把mybatis的xml集中管理,放到resources下去,就需要指定下路徑了。

如下就需要設置該配置:

mybatis的xml路徑下需要配置下:

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

2.3 mybatis常見錯誤:

org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.laowang.springtest.db.mapper.UserMapper.selectByPrimaryKey
	at org.apache.ibatis.binding.MapperMethod$SqlCommand.<init>(MapperMethod.java:235) ~[mybatis-3.5.9.jar:3.5.9]-軟件老王

這個錯誤就是沒有找到xml文件,造成該錯誤的有以下情況:

(1)springboot初始化項目,默認是沒有打包xml文件到target下面的,需要在build中指定下;

    <build>
        <resources>
            <resource>
                <directory>src/main/resources/</directory>
            </resource>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
            </resource>
        </resources>
     </build>

(2)mybatis生成xml沒有跟接口類在同一目錄下,需要配置mybatis:
mapper-locations: classpath:mapper/*.xml,否則也會報找不到執行的statement。

2.4 簡單情況

通過mybatis-generator生成的接口實體類和xml默認在同一目錄下,這個時候只需要在啓動類上配置:

@SpringBootApplication
@MapperScan("com.laowang.springtest.db")
public class SpringtestApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringtestApplication.class, args);
    }
}

@Mapper標籤、mybatis.type-aliases-package、mybatis.mapper-locations都可以不用配置;


更多信息請關注公衆號:「軟件老王」,關注不迷路,軟件老王和他的IT朋友們,分享一些他們的技術見解和生活故事。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章