热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

mybatismysql自定义函数_SpringBoot整合Mybatis、Mysql自定义数据源

SpringBoot、Mybatis、Mysql整合,此SSM不是彼SSM,使用SpringBoot组件,整合Mybatis、Mysql也

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

环境说明

SpringBoot 2.1.4

JDK 1.8

MySql 版本 6 及以上

本文探究

使用SpringBoot配置数据库自动加载及简单使用

SpringBoot默认加载的数据源是哪个

解决自定义数据源找不到属性的问题

第一步,在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);

}

}

注意点:

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

bb3f6a57097e

图-1

如果不使用默认的数据库连接配置,单独对数据库连接进行配置时,就可以使用@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自动装配到底使用了何种数据源类型呢?

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

bb3f6a57097e

图-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文件,也输出了查询内容

bb3f6a57097e

图-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开头的;

bb3f6a57097e

图-4

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

@ConfigurationProperties(prefix="spring.datasource")

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

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



推荐阅读
author-avatar
手机用户2502921663
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有