SPRING BOOT踩坑——整合Mybatis、Mysql自定义数据源

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

 


            org.mybatis.spring.boot
            mybatis-spring-boot-starter
            2.0.1
        
        
            mysql
            mysql-connector-java
        

第二步,在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组件。

     

    SPRING BOOT踩坑——整合Mybatis、Mysql自定义数据源_第1张图片

    图-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自动装配到底使用了何种数据源类型呢?

 


            org.springframework.boot
            spring-boot-starter-web
        
        
            org.mybatis.spring.boot
            mybatis-spring-boot-starter
            2.0.1
        
        
            mysql
            mysql-connector-java
                 
        
            org.springframework.boot
            spring-boot-starter-test
            test
        

修改启动类中的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?看来要确定是哪个是默认数据源,还需要看一看源码才知道,版本不同,就有不一样的地方。

 

SPRING BOOT踩坑——整合Mybatis、Mysql自定义数据源_第2张图片

图-2

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

第一步,在pom.xml,引入架包

 


            com.alibaba
            druid
            1.1.16
         

第二步,添加配置文件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文件,也输出了查询内容

 

SPRING BOOT踩坑——整合Mybatis、Mysql自定义数据源_第3张图片

图-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配置文件,分分秒解决的事情,比百度快多了。



作者:程就人生
链接:https://www.jianshu.com/p/bb3f6a57097e
来源:简书

你可能感兴趣的:(spring,boot)