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 及以上
本文探究
- 使用SpringBoot配置數(shù)據(jù)庫(kù)自動(dòng)加載及簡(jiǎn)單使用
- SpringBoot默認(rèn)加載的數(shù)據(jù)源是哪個(gè)
- 解決自定義數(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):
-
@Configuration注解,從它的源碼中沽甥,可以看出它的作用等同一個(gè)component組件声邦。
圖-1 如果不使用默認(rèn)的數(shù)據(jù)庫(kù)連接配置,單獨(dú)對(duì)數(shù)據(jù)庫(kù)連接進(jìn)行配置時(shí)摆舟,就可以使用@Configuration注解進(jìn)行注入亥曹。
@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ù)源旧找,還需要看一看源碼才知道,版本不同麦牺,就有不一樣的地方钮蛛。
現(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)容
總結(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)頭的;
既然如此速妖,給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配置文件,分分秒解決的事情产弹,比百度快多了派歌。