SpringBoot 整合Mybatis、Mysql自定義數(shù)據(jù)源

SpringBoot感帅、Mybatis斗锭、Mysql整合,此SSM不是彼SSM失球,使用SpringBoot組件岖是,整合Mybatis、Mysql也變得簡(jiǎn)潔起來(lái)她倘,只需三步就可以把數(shù)據(jù)庫(kù)連接配置搞定璧微。

環(huán)境說(shuō)明

SpringBoot 2.1.4
JDK 1.8
MySql 版本 6 及以上

本文探究

  1. 使用SpringBoot配置數(shù)據(jù)庫(kù)自動(dòng)加載及簡(jiǎn)單使用
  2. SpringBoot默認(rèn)加載的數(shù)據(jù)源是哪個(gè)
  3. 解決自定義數(shù)據(jù)源找不到屬性的問(wèn)題
第一步作箍,在pom.xml配置MyBatis和MySql
<dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.0.1</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
第二步硬梁,在application.properties配置文件中,配置數(shù)據(jù)庫(kù)連接參數(shù)
spring.datasource.url=jdbc:mysql://localhost:3306/test1?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=123456
#在此版本中胞得,數(shù)據(jù)庫(kù)驅(qū)動(dòng)文件com.mysql.jdbc.Driver(版本5)已由變?yōu)閏om.mysql.cj.jdbc.Driver(版本6及以上)
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#xml映射路徑
mybatis.mapper-locations=classpath:mapper/*.xml

在pom.xml中荧止,并沒(méi)有指明mysql driver的版本,mysql driver的版本會(huì)隨著maven的更新不斷升級(jí)阶剑,如果項(xiàng)目啟動(dòng)時(shí)報(bào)了下面的錯(cuò)誤跃巡,就需要把driver改成帶cj的。

Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.

關(guān)于mybatis中的xml文件的映射牧愁,如果項(xiàng)目啟動(dòng)時(shí)素邪,找不到xml文件,則需要對(duì)xml的路徑配置一下猪半,本文的xml文件是放在src/sources下的mapper文件里面的兔朦。

第三步偷线,在啟動(dòng)文件中配置掃描包
package com.example.demo;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Configuration;
/**
 * 
 * @author 程就人生
 * @date 2019年6月28日
 */
@SpringBootApplication
@Configuration
@MapperScan("com.example.demo.dao")
public class SpirngMybatisDemoApplication {

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

}

注意點(diǎn):

  1. @Configuration注解,從它的源碼中沽甥,可以看出它的作用等同一個(gè)component組件声邦。


    圖-1
  2. 如果不使用默認(rèn)的數(shù)據(jù)庫(kù)連接配置,單獨(dú)對(duì)數(shù)據(jù)庫(kù)連接進(jìn)行配置時(shí)摆舟,就可以使用@Configuration注解進(jìn)行注入亥曹。

  3. @MapperScan("com.example.demo.dao") 注解,指定mybatis需要掃描的Mapper文件包恨诱,沒(méi)有這一行時(shí)媳瞪,使用@Autowired獲取dao文件時(shí)會(huì)報(bào)錯(cuò)。所以這一行還是必須有的照宝。

三步過(guò)后材失,下面就可以進(jìn)行測(cè)試了

為了方便測(cè)試,直接建立了一個(gè)Controller文件硫豆,service這一層先省下了龙巨。

package com.example.demo.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import com.example.demo.dao.TestMapper;
import com.example.demo.entity.Test;

/**
 * mybatis測(cè)試
 * @author 程就人生
 * @date 2019年6月26日
 */
@RestController
public class IndexController {

    @Autowired
    private TestMapper testMapper;
    
    @GetMapping("/index")
    public Object index(){
        
        Test test = new Test();
        test.setUserUid("123456");
        test.setUserName("aaa");
        test.setUserPwd("111");
        //新增
//      int effectRow = testMapper.insertSelective(test);
//      //查詢
//      Test test1 = testMapper.selectByPrimaryKey(test.getUserUid());
        test.setUserName("aaaaaaa");
        //修改
        testMapper.updateByPrimaryKeySelective(test);
        
        Test test2 = testMapper.selectByPrimaryKey(test.getUserUid());
        
        return test2;
    }   
}

測(cè)試結(jié)果ok,數(shù)據(jù)可以正常的增刪改查熊响。

如果還沒(méi)有生成mapper和對(duì)應(yīng)的xml文件旨别,可以參考STS整合MyBatis generator 生成的兩種方式
STS 整合 mybatis generator 生成文件汗茄,
這兩篇文章介紹了對(duì)數(shù)據(jù)庫(kù)表進(jìn)行文件的生成秸弛,本文是在以上基礎(chǔ)上進(jìn)行擴(kuò)展的。

寫(xiě)到這里洪碳,心中不免有一個(gè)疑問(wèn)递览,本文pom.xml文件中并沒(méi)有加任何的數(shù)據(jù)源類型,除了mybatic和mysql的架包瞳腌,也就只有spring-boot-starter-web绞铃、spring-boot-starter-test這兩個(gè)架包了,SpringBoot自動(dòng)裝配到底使用了何種數(shù)據(jù)源類型呢嫂侍?

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.0.1</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>         
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

修改啟動(dòng)類中的main方法如下儿捧,輸出到底使用了哪種數(shù)據(jù)源類型

public static void main(String[] args) {        
        ConfigurableApplicationContext context = SpringApplication.run(SpirngMybatisDemoApplication.class,args);
        try {
            //查看使用哪個(gè)數(shù)據(jù)源
            DataSource ds = context.getBean(DataSource.class);
            System.out.println(ds.getClass().getName());
            Connection connection;
            connection = ds.getConnection();
            System.out.println(connection.getCatalog()); //test
            System.out.println(context.getBean(JdbcTemplate.class));
            connection.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

在沒(méi)有添加任何數(shù)據(jù)源的情況下,默認(rèn)使用了HikariDataSources數(shù)據(jù)源挑宠;

com.zaxxer.hikari.HikariDataSource
2019-06-30 16:16:46.044  INFO 13012 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2019-06-30 16:16:46.205  INFO 13012 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
test1
org.springframework.jdbc.core.JdbcTemplate@19058533

從其他的博文代碼中菲盾,說(shuō)默認(rèn)的是DataSourceConfiguration.Tomcat.class,從截圖中確認(rèn)沒(méi)錯(cuò)各淀。本文測(cè)試下面卻是HikariDataSource懒鉴,這是為什么呢?打開(kāi)DataSourceAutoConfiguration碎浇,可以看到如下圖所示临谱,難道這是因?yàn)镾pringBoot版本的差異咆畏?

本文使用的SpringBoot版本是2.1.4,默認(rèn)的數(shù)據(jù)源變成了HikariDataSource吴裤?看來(lái)要確定是哪個(gè)是默認(rèn)數(shù)據(jù)源旧找,還需要看一看源碼才知道,版本不同麦牺,就有不一樣的地方钮蛛。


圖-2

現(xiàn)在,需要換種數(shù)據(jù)源剖膳,不使用默認(rèn)的魏颓,比如使用阿里的druid數(shù)據(jù)源

第一步,在pom.xml吱晒,引入架包
<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.16</version>
         </dependency>
第二步甸饱,添加配置文件DruidDatabaseConfig
package com.example.demo.config;

import javax.sql.DataSource;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.alibaba.druid.pool.DruidDataSource;

@Configuration
@MapperScan("com.example.demo.dao")
public class DruidDatabaseConfig {

    /**
     * DruidDataSource數(shù)據(jù)源中默認(rèn)的是取druid開(kāi)頭的,所以這里需要設(shè)置一下前綴prefix
     * 使用com.alibaba的DruidDataSource數(shù)據(jù)源
     * @return
     *
     */
    @Bean
    @ConfigurationProperties(prefix="spring.datasource")
    public DataSource dataSource() {
        return new DruidDataSource();        
    }
}
第三步仑濒,運(yùn)行測(cè)試叹话,可以看到控制臺(tái)輸出了我們想要的數(shù)據(jù)源配置
com.alibaba.druid.pool.DruidDataSource
2019-06-30 17:16:18.260  INFO 18000 --- [           main] com.alibaba.druid.pool.DruidDataSource   : {dataSource-1} inited
test1
org.springframework.jdbc.core.JdbcTemplate@11a00961

運(yùn)行Controller文件,也輸出了查詢內(nèi)容


圖-3

總結(jié)

過(guò)去遇到問(wèn)題墩瞳,習(xí)慣性的百度谷歌驼壶,這樣就過(guò)于依賴于其他人的調(diào)查結(jié)果;有時(shí)喉酌,找了很多博文也解決不了問(wèn)題热凹,很多解決方法都是有特定環(huán)境的,環(huán)境不一致泪电,或者有細(xì)微的差別般妙,就有可能解決不了自己遇到的問(wèn)題。

這次使用阿里的Druid作為數(shù)據(jù)源后相速,第一次是沒(méi)有寫(xiě)config碟渺,啟動(dòng)項(xiàng)目報(bào)錯(cuò),第二次寫(xiě)了config和蚪,但還是簡(jiǎn)簡(jiǎn)單單地設(shè)置了一下止状,又啟動(dòng)了烹棉,結(jié)果還是報(bào)錯(cuò)攒霹,錯(cuò)誤如下:

java.sql.SQLException: url not set
    at com.alibaba.druid.pool.DruidDataSource.init(DruidDataSource.java:883)
    at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:1311)
    at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:1307)
    at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:109)
    at com.example.demo.SpirngMybatisDemoApplication.main(SpirngMybatisDemoApplication.java:27)

第一反應(yīng),要去百度谷歌一下浆洗;第二反應(yīng)催束,能不能看下源碼怎么回事,再去百度伏社?跟隨第二反應(yīng)抠刺,進(jìn)入了源碼查看塔淤,源碼里默認(rèn)的配置屬性取的是以druid開(kāi)頭的;


圖-4

既然如此速妖,給config加個(gè)前綴配置高蜂,再次運(yùn)行,這次運(yùn)行正常罕容,沒(méi)有報(bào)錯(cuò)了备恤。

@ConfigurationProperties(prefix="spring.datasource")

當(dāng)然,除了加個(gè)config配置文件重新設(shè)定一下前綴锦秒,也可以在application.properties直接配置前綴為druid的數(shù)據(jù)源屬性露泊。兩種解決方法,任選一個(gè)旅择。

如果在換一個(gè)數(shù)據(jù)源惭笑,遇到同樣的問(wèn)題,也就不再會(huì)像無(wú)頭的蒼蠅一樣生真,動(dòng)不動(dòng)就百度了沉噩,直接看下源碼,源碼默認(rèn)讀取的屬性是什么柱蟀,要么改屬性配置文件屁擅,要么改config配置文件,分分秒解決的事情产弹,比百度快多了派歌。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市痰哨,隨后出現(xiàn)的幾起案子胶果,更是在濱河造成了極大的恐慌,老刑警劉巖斤斧,帶你破解...
    沈念sama閱讀 222,865評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件早抠,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡撬讽,警方通過(guò)查閱死者的電腦和手機(jī)蕊连,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,296評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)游昼,“玉大人甘苍,你說(shuō)我怎么就攤上這事『嫱悖” “怎么了载庭?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,631評(píng)論 0 364
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我囚聚,道長(zhǎng)靖榕,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,199評(píng)論 1 300
  • 正文 為了忘掉前任顽铸,我火速辦了婚禮茁计,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘谓松。我一直安慰自己簸淀,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,196評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布毒返。 她就那樣靜靜地躺著租幕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪拧簸。 梳的紋絲不亂的頭發(fā)上劲绪,一...
    開(kāi)封第一講書(shū)人閱讀 52,793評(píng)論 1 314
  • 那天,我揣著相機(jī)與錄音盆赤,去河邊找鬼贾富。 笑死,一個(gè)胖子當(dāng)著我的面吹牛牺六,可吹牛的內(nèi)容都是我干的颤枪。 我是一名探鬼主播,決...
    沈念sama閱讀 41,221評(píng)論 3 423
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼淑际,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼畏纲!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起春缕,我...
    開(kāi)封第一講書(shū)人閱讀 40,174評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤盗胀,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后锄贼,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體票灰,經(jīng)...
    沈念sama閱讀 46,699評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡骂铁,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,770評(píng)論 3 343
  • 正文 我和宋清朗相戀三年篡帕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片捐晶。...
    茶點(diǎn)故事閱讀 40,918評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡冯键,死狀恐怖惹盼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情琼了,我是刑警寧澤逻锐,帶...
    沈念sama閱讀 36,573評(píng)論 5 351
  • 正文 年R本政府宣布夫晌,位于F島的核電站雕薪,受9級(jí)特大地震影響昧诱,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜所袁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,255評(píng)論 3 336
  • 文/蒙蒙 一盏档、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧燥爷,春花似錦蜈亩、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,749評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至港华,卻和暖如春道川,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背立宜。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,862評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工冒萄, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人橙数。 一個(gè)月前我還...
    沈念sama閱讀 49,364評(píng)論 3 379
  • 正文 我出身青樓尊流,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親灯帮。 傳聞我的和親對(duì)象是個(gè)殘疾皇子崖技,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,926評(píng)論 2 361