springboot-mybatis-tk-mapper 通用mapper整合避坑

第一步:導(dǎo)入依賴

除了mapper-spring-boot-starter通用mapper外嬉橙,其他都是配合測試的依賴

       <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>tk.mybatis</groupId>
            <artifactId>mapper-spring-boot-starter</artifactId>
            <version>2.1.5</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
            <version>1.3.0</version>
        </dependency>
第二步:配置yml

暫時無需做通用mapper配置零如,先配置基礎(chǔ)啟動部分內(nèi)容雇寇,這里啟動類斯撮、yml自行編寫

server:
  port: 8088
spring:
  application:
    name: your-service-name
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://${MYSQL_HOST:localhost}:${MYSQL_PORT:3306}/${MYSQL_DB:your database}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true
    username: ${MYSQL-USER:root}
    password: ${MYSQL-PWD:root}
第三步:配置啟動類

要加這個包掃描路徑@MapperScan(basePackages = "com.nico.mybatis.mapper"),先注釋掉

//@MapperScan(basePackages = "com.nico.mybatis.mapper")
@SpringBootApplication
public class MyMybatisApplication {

    public static void main(String[] args) {
        SpringApplication.run(MyMybatisApplication.class,args);
    }
}

用另一種方式@Mapper綁定CastMenuConfigMapper

@Mapper
public interface CastMenuConfigMapper {

    CastMenuConfig findById(String id);

//    @Select("select * from cast_menu_config")
    List<CastMenuConfig> findAll();


    @Select("select * from cast_menu_config")
    List<CastMenuConfig> findPage();
}
第四步:準(zhǔn)備測試

看看你的實體類好了沒有熊昌,數(shù)據(jù)庫連起來沒有,好的先看實體類瞭郑,這里避免太長只貼部分字段 get set方法省略了,最好重寫個toString方法鸭你,方便控制臺打印查看

@Table(name = "cast_menu_config")
public class CastMenuConfig implements Serializable {

    @Id
    @Column(name = "id")
    private Long id;                    //主鍵

    @Column(name = "menu_name")
    private String menuName;            //菜單名稱

    @Column(name = "menu_type")
    private int menuType;               //菜單類型

    @Column(name = "menu_sort")
    private int menuSort;               //菜單順序


//get set此處省略屈张。。袱巨。

    @Override
    public String toString() {
        return "CastMenuConfig{" +
                "id=" + id +
                ", liveBasicId=" + liveBasicId +
                ", menuName='" + menuName + '\'' +
                ", menuType=" + menuType +
                ", menuSort=" + menuSort +
                '}';
    }
}

看一下數(shù)據(jù)庫


圖片.png

好的阁谆,再把CastMenuConfigMapper.xml 文件配置一下,namespace的包路徑為上面CastMenuConfigMapper 接口的包路徑,resultType="CastMenuConfig"是通過yml中這個配置的包路徑 type-aliases-package: com.nico.mybatis.entity找到對應(yīng)實體類CastMenuConfig的愉老,還有接口方法名findById和 id="findById"是對應(yīng)一致的笛厦,好了不再疑惑,繼續(xù)看

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.nico.mybatis.mapper.CastMenuConfigMapper">

    <select id="findById" parameterType="String" resultType="CastMenuConfig">
           select * from cast_menu_config where id=#{id}
        </select>
    <select id="findAll" parameterType="String" resultType="CastMenuConfig">
           select * from cast_menu_config
        </select>
</mapper>

再看看項目文件結(jié)構(gòu)俺夕,test里面的內(nèi)容是創(chuàng)建測試類生成的裳凸,當(dāng)然你可以創(chuàng)建controller和業(yè)務(wù)層service代碼,通過postman或瀏覽器發(fā)起訪問完成整個調(diào)用邏輯劝贸,但是這里通過測試來快速訪問姨谷。


圖片.png
第五步:進入測試

先創(chuàng)建一個測試類


圖片.png
圖片.png

點擊ok后就生成了測試類,由上面的文件結(jié)構(gòu)可以看到在test目錄下的文件CastMenuConfigMapperTest

@SpringBootTest
class CastMenuConfigMapperTest {

    @Autowired
    private CastMenuConfigMapper castMenuConfigMapper;
    @Test
    void findById() {
        CastMenuConfig castMenuConfig = castMenuConfigMapper.findById("1322078827776266241");
        System.out.println("查詢結(jié)果:"+castMenuConfig);
    }

    @Test
    void findAll() {
        List<CastMenuConfig> castMenuConfigList = castMenuConfigMapper.findAll();
        castMenuConfigList.forEach(item->System.out.println("查詢結(jié)果:"+item));
    }

    @Test
    void findPage() {
        PageHelper.startPage(1,2);

        List<CastMenuConfig> castMenuConfigList = castMenuConfigMapper.findPage();

        PageInfo<CastMenuConfig> castMenuConfigPageInfo = new PageInfo<>(castMenuConfigList);

        castMenuConfigPageInfo.getList().forEach(item->System.out.println("查詢結(jié)果:"+item));
    }
}

寫好參數(shù)映九,好了梦湘,點擊測試


圖片.png

發(fā)現(xiàn)測試沒有通過報錯了,表示找不到綁定的mapper

org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.nico.mybatistk.mapper.CastMenuConfigMapper.findAll

試試其他方法測試,一樣報錯(此時我把CastMenuConfigMapper里findAll() 注解 // @Select("select * from cast_menu_config")注釋了)我們把注釋放開測試通過了件甥,但是字段屬性值都為null捌议,說明映射有問題

圖片.png

報錯是因為沒有在yml里配置mapper-locations: classpath:mapper/*.xml,所以找不到這個文件報錯引有,@Mapper和@MapperScan注解二選一都是支持的瓣颅,用@select(sql)這種注解方式它不需要找xml文件就可以執(zhí)行sql,然后修改yml添加配置

mybatis:
  mapper-locations: classpath:mapper/*.xml
  type-aliases-package: com.nico.mybatistk.entity
  configuration:
    #    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    map-underscore-to-camel-case: true

測試結(jié)果譬正,打印sql宫补,返回實體都有值了,一切都正常了曾我,所以如果使用xml方式映射sql那么必須配置以上內(nèi)容


圖片.png

好的粉怕,我們現(xiàn)在注釋掉這些配置,用注解的形式測試一下


圖片.png

圖片.png

注解方式是沒問題的抒巢,和我上一篇整合mybatis基本一致贫贝,通用mapper除了定義了一些增刪改查的接口其他都是兼容mybatis的所有功能的。

第六步:通用mapper提供的常用接口

通用mapper給我們封裝了許多接口可以直接調(diào)用蛉谜,其中做查詢的接口比較豐富


圖片.png

我們用selectByPrimaryKey這個接口測試一下稚晚,結(jié)果是ok的


圖片.png

使用Example構(gòu)造查詢條件凤优,進行查詢


圖片.png

總結(jié):
這個Example和MyBatis-Plus中的條件構(gòu)造器QueryWrapper是異曲同工的,下一篇會講到蜈彼,更多功能自行拓展筑辨,這里只做快速集成整合。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末幸逆,一起剝皮案震驚了整個濱河市棍辕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌还绘,老刑警劉巖楚昭,帶你破解...
    沈念sama閱讀 222,807評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異拍顷,居然都是意外死亡抚太,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評論 3 399
  • 文/潘曉璐 我一進店門昔案,熙熙樓的掌柜王于貴愁眉苦臉地迎上來尿贫,“玉大人,你說我怎么就攤上這事踏揣∏焱觯” “怎么了?”我有些...
    開封第一講書人閱讀 169,589評論 0 363
  • 文/不壞的土叔 我叫張陵捞稿,是天一觀的道長又谋。 經(jīng)常有香客問我,道長娱局,這世上最難降的妖魔是什么彰亥? 我笑而不...
    開封第一講書人閱讀 60,188評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮衰齐,結(jié)果婚禮上任斋,老公的妹妹穿的比我還像新娘。我一直安慰自己娇斩,他們只是感情好仁卷,可當(dāng)我...
    茶點故事閱讀 69,185評論 6 398
  • 文/花漫 我一把揭開白布穴翩。 她就那樣靜靜地躺著犬第,像睡著了一般。 火紅的嫁衣襯著肌膚如雪芒帕。 梳的紋絲不亂的頭發(fā)上歉嗓,一...
    開封第一講書人閱讀 52,785評論 1 314
  • 那天,我揣著相機與錄音背蟆,去河邊找鬼鉴分。 笑死哮幢,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的志珍。 我是一名探鬼主播橙垢,決...
    沈念sama閱讀 41,220評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼伦糯!你這毒婦竟也來了柜某?” 一聲冷哼從身側(cè)響起敛纲,我...
    開封第一講書人閱讀 40,167評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎淤翔,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體旁壮,經(jīng)...
    沈念sama閱讀 46,698評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡监嗜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,767評論 3 343
  • 正文 我和宋清朗相戀三年抡谐,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片童叠。...
    茶點故事閱讀 40,912評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡框喳,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出厦坛,到底是詐尸還是另有隱情五垮,我是刑警寧澤杜秸,帶...
    沈念sama閱讀 36,572評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站撬碟,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏惶傻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,254評論 3 336
  • 文/蒙蒙 一银室、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蜈敢,春花似錦、人聲如沸伯病。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽叠纹。三九已至,卻和暖如春与涡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背驼卖。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評論 1 274
  • 我被黑心中介騙來泰國打工鸿秆, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人卿叽。 一個月前我還...
    沈念sama閱讀 49,359評論 3 379
  • 正文 我出身青樓考婴,卻偏偏與公主長得像贩虾,于是被迫代替她去往敵國和親沥阱。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,922評論 2 361

推薦閱讀更多精彩內(nèi)容