SpringBoot 整合Mybatis、Mysql自定义数据源

SpringBoot、Mybatis、Mysql整合,此SSM不是彼SSM,使用SpringBoot组件,整合Mybatis、Mysql也变得简洁起来,只需三步就可以把数据库连接配置搞定。

环境说明

SpringBoot 2.1.4
JDK 1.8
MySql 版本 6 及以上

本文探究

  1. 使用SpringBoot配置数据库自动加载及简单使用
  2. SpringBoot默认加载的数据源是哪个
  3. 解决自定义数据源找不到属性的问题
第一步,在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配置文件中,配置数据库连接参数
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
#在此版本中,数据库驱动文件com.mysql.jdbc.Driver(版本5)已由变为com.mysql.cj.jdbc.Driver(版本6及以上)
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#xml映射路径
mybatis.mapper-locations=classpath:mapper/*.xml

在pom.xml中,并没有指明mysql driver的版本,mysql driver的版本会随着maven的更新不断升级,如果项目启动时报了下面的错误,就需要把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.

关于mybatis中的xml文件的映射,如果项目启动时,找不到xml文件,则需要对xml的路径配置一下,本文的xml文件是放在src/sources下的mapper文件里面的。

第三步,在启动文件中配置扫描包
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);
    }

}

注意点:

  1. @Configuration注解,从它的源码中,可以看出它的作用等同一个component组件。


    图-1
  2. 如果不使用默认的数据库连接配置,单独对数据库连接进行配置时,就可以使用@Configuration注解进行注入。

  3. @MapperScan("com.example.demo.dao") 注解,指定mybatis需要扫描的Mapper文件包,没有这一行时,使用@Autowired获取dao文件时会报错。所以这一行还是必须有的。

三步过后,下面就可以进行测试了

为了方便测试,直接建立了一个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测试
 * @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;
    }   
}

测试结果ok,数据可以正常的增删改查。

如果还没有生成mapper和对应的xml文件,可以参考STS整合MyBatis generator 生成的两种方式
STS 整合 mybatis generator 生成文件
这两篇文章介绍了对数据库表进行文件的生成,本文是在以上基础上进行扩展的。

写到这里,心中不免有一个疑问,本文pom.xml文件中并没有加任何的数据源类型,除了mybatic和mysql的架包,也就只有spring-boot-starter-web、spring-boot-starter-test这两个架包了,SpringBoot自动装配到底使用了何种数据源类型呢?

<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>

修改启动类中的main方法如下,输出到底使用了哪种数据源类型

public static void main(String[] args) {        
        ConfigurableApplicationContext context = SpringApplication.run(SpirngMybatisDemoApplication.class,args);
        try {
            //查看使用哪个数据源
            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();
        }
    }

在没有添加任何数据源的情况下,默认使用了HikariDataSources数据源;

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

从其他的博文代码中,说默认的是DataSourceConfiguration.Tomcat.class,从截图中确认没错。本文测试下面却是HikariDataSource,这是为什么呢?打开DataSourceAutoConfiguration,可以看到如下图所示,难道这是因为SpringBoot版本的差异?

本文使用的SpringBoot版本是2.1.4,默认的数据源变成了HikariDataSource?看来要确定是哪个是默认数据源,还需要看一看源码才知道,版本不同,就有不一样的地方。


图-2

现在,需要换种数据源,不使用默认的,比如使用阿里的druid数据源

第一步,在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数据源中默认的是取druid开头的,所以这里需要设置一下前缀prefix
     * 使用com.alibaba的DruidDataSource数据源
     * @return
     *
     */
    @Bean
    @ConfigurationProperties(prefix="spring.datasource")
    public DataSource dataSource() {
        return new DruidDataSource();        
    }
}
第三步,运行测试,可以看到控制台输出了我们想要的数据源配置
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

运行Controller文件,也输出了查询内容


图-3

总结

过去遇到问题,习惯性的百度谷歌,这样就过于依赖于其他人的调查结果;有时,找了很多博文也解决不了问题,很多解决方法都是有特定环境的,环境不一致,或者有细微的差别,就有可能解决不了自己遇到的问题。

这次使用阿里的Druid作为数据源后,第一次是没有写config,启动项目报错,第二次写了config,但还是简简单单地设置了一下,又启动了,结果还是报错,错误如下:

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)

第一反应,要去百度谷歌一下;第二反应,能不能看下源码怎么回事,再去百度?跟随第二反应,进入了源码查看,源码里默认的配置属性取的是以druid开头的;


图-4

既然如此,给config加个前缀配置,再次运行,这次运行正常,没有报错了。

@ConfigurationProperties(prefix="spring.datasource")

当然,除了加个config配置文件重新设定一下前缀,也可以在application.properties直接配置前缀为druid的数据源属性。两种解决方法,任选一个。

如果在换一个数据源,遇到同样的问题,也就不再会像无头的苍蝇一样,动不动就百度了,直接看下源码,源码默认读取的属性是什么,要么改属性配置文件,要么改config配置文件,分分秒解决的事情,比百度快多了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343