SpringBoot、Mybatis、Mysql整合,此SSM不是彼SSM,使用SpringBoot组件,整合Mybatis、Mysql也变得简洁起来,只需三步就可以把数据库连接配置搞定。
环境说明
SpringBoot 2.1.4
JDK 1.8
MySql 版本 6 及以上
本文探究
- 使用SpringBoot配置数据库自动加载及简单使用
- SpringBoot默认加载的数据源是哪个
- 解决自定义数据源找不到属性的问题
第一步,在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);
}
}
注意点:
-
@Configuration注解,从它的源码中,可以看出它的作用等同一个component组件。
如果不使用默认的数据库连接配置,单独对数据库连接进行配置时,就可以使用@Configuration注解进行注入。
@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?看来要确定是哪个是默认数据源,还需要看一看源码才知道,版本不同,就有不一样的地方。
现在,需要换种数据源,不使用默认的,比如使用阿里的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文件,也输出了查询内容
总结
过去遇到问题,习惯性的百度谷歌,这样就过于依赖于其他人的调查结果;有时,找了很多博文也解决不了问题,很多解决方法都是有特定环境的,环境不一致,或者有细微的差别,就有可能解决不了自己遇到的问题。
这次使用阿里的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开头的;
既然如此,给config加个前缀配置,再次运行,这次运行正常,没有报错了。
@ConfigurationProperties(prefix="spring.datasource")
当然,除了加个config配置文件重新设定一下前缀,也可以在application.properties直接配置前缀为druid的数据源属性。两种解决方法,任选一个。
如果在换一个数据源,遇到同样的问题,也就不再会像无头的苍蝇一样,动不动就百度了,直接看下源码,源码默认读取的属性是什么,要么改属性配置文件,要么改config配置文件,分分秒解决的事情,比百度快多了。