springboot+mybatis多数据库切换功能,及如何兼容达梦等非常用数据库

    近日因项目需要,项目要求具备多数据库功能,可根据需要自由切换oracle和达梦数据库,在研究过程中了解到,可以使用mybatis的databaseId属性直接配置多数据库支持,而其中遇到了有一些网上很难找到资料的问题,再此记录成博客,方便大家少走弯路。

    注意事项:

        1、本文针对的是多数据库切换,而非多数据源切换;

        2、本文所使用的方法是在配置文件中配置好需要使用的数据库,而不是在项目运行以后随时切换,若要切换数据库,需要修改配置文件并重启项目。

    大家阅读本文前请注意以上两条事项,确定本文内容是否符合你的功能要求,再决定是否继续阅读本文。

    接下来进入正题,首先是数据库配置,直接按照常规的配法就可以了,例如:

spring.datasource.url=jdbc:mysql://localhost:3306/demo
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

    而要想使用databaseId的话,需要增加一个bean的配置,如下:

import java.util.Properties;

import org.apache.ibatis.mapping.DatabaseIdProvider;
import org.apache.ibatis.mapping.VendorDatabaseIdProvider;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class BeanConfig {
	
	@Bean
	public DatabaseIdProvider getDatabaseIdProvider() {
		DatabaseIdProvider databaseIdProvider = new VendorDatabaseIdProvider();
		Properties p = new Properties();
		p.setProperty("DM DBMS", "dm7");
		p.setProperty("MySQL", "mysql");
		databaseIdProvider.setProperties(p);
		return databaseIdProvider;
	}
}

    在这段代码中,给Properties设置了两个对象,对应着两种数据库,一个是达梦7,一个是mysql。key的值是对应的数据库的productName,value则是一个自定义的值,你可以取一个你喜欢的名字,这个名字会在mybatis的mapper里面用到。

    而在这里,也要说到文章开头时说过的问题。使用databaseId来配置多数据库的方法网上很多,但是我找到的所有文章,都没有说到,这个Properties的key和value到底是什么意思,有没有什么规范。而且网上几乎都是用oracle和mysql来做例子,但没有提到其他数据库的配置方法,这就导致我们在使用类似达梦数据库的时候,完全不知道该怎么配置。后来我找了官方资料,并结合百度到的信息,得出的结论是,Properties的key就是数据库的productName。既然知道了这一点,后面就好办了,百度到了数据库获取productName的方法后,自然也就可以获取到达梦数据库的productName值了,具体方法如下:不仅仅是达梦数据库,任何数据库都是这样获取的。

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;

public class Test {
    public static void main(String[] args) throws Exception {
        String driver = "com.mysql.jdbc.Driver";
        String url = "jdbc:mysql://localhost:3306/";
        String username = "root";
        String password = "root";
        Class.forName(driver);
        Connection con = (Connection) DriverManager.getConnection(url,username,password);
        DatabaseMetaData metaData = (DatabaseMetaData) con.getMetaData();
        System.out.println("数据库的产品名称:" + metaData.getDatabaseProductName()); 
    }
}

    

    获取到了productName,我们就可以在配置类中将我们需要的数据库配置好,然后再mapper里写sql时,加上databaseId,例如:

<?xml version="1.0" encoding="UTF-8" ?>      
<!DOCTYPE mapper    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.freddy.mfd7.test.UserMapper">

    <select id="findUsers" resultType="com.freddy.mfd7.test.UserEntity" databaseId="dm7">
		select * from "demo";
    </select>

    <select id="findUsers" resultType="com.freddy.mfd7.test.UserEntity" databaseId="mysql">
		select * from demo;
    </select>
</mapper>

    这样一来,配置就完成了,启动项目也可以正常使用了,在最后,还要提一下mybatis对databaseId的处理方式。

    mybatis在进行mapper注入时,会出现3种情况,该sql的databaseId和当前数据源的databaseId一样,该sql的databaseId和当前数据源的databaseId不一样,或者该sql没有配置databaseId。mybatis装配时,当同一方法被找到多个sql时,会优先使用databaseId相同的sql,如果没有databaseId相同的sql,再使用没有配置databaseId的sql。databaseId不对应的sql是不会使用的。

    本文就到这里了,希望对各位读者能有所帮助。

  • 9
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
1. 配置数据库连接信息 在application.properties文件中添加以下配置信息: ``` spring.datasource.url=jdbc:mysql://localhost:3306/test spring.datasource.username=root spring.datasource.password=123456 spring.datasource.driver-class-name=com.mysql.jdbc.Driver ``` 2. 添加MyBatis依赖 在pom.xml文件中添加以下依赖: ``` <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.3</version> </dependency> ``` 3. 创建数据表 创建一个名为user的数据表,包含id、name和age三个字段。 4. 创建实体类 创建一个User实体类,包含id、name和age三个属性,同时添加对应的getters和setters方法。 5. 创建Mapper层 创建一个UserMapper接口,定义一个insert方法,用于向数据库中插入User对象。 ``` @Mapper public interface UserMapper { @Insert("INSERT INTO user(name, age) VALUES (#{name}, #{age})") int insert(User user); } ``` 6. 创建Service层 创建一个UserService接口,定义一个addUser方法,用于向数据库中插入User对象。 ``` @Service public interface UserService { int addUser(User user); } ``` 在UserService接口的实现类UserServiceImpl中注入UserMapper,并实现addUser方法。 ``` @Service public class UserServiceImpl implements UserService { @Autowired private UserMapper userMapper; @Override public int addUser(User user) { return userMapper.insert(user); } } ``` 7. 创建Controller层 创建一个UserController类,注入UserService,并添加addUser方法,用于接收前端传递的User对象,并调用UserService的addUser方法插入到数据库中。 ``` @RestController @RequestMapping("/user") public class UserController { @Autowired private UserService userService; @PostMapping("/add") public int addUser(@RequestBody User user) { return userService.addUser(user); } } ``` 至此,使用SpringBoot MyBatis数据库中写入数据的整个流程完成。可以通过Postman等工具测试接口,向数据库中插入数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值