Skip to content

[Feature]对Oracle数据库和sqlite数据库的支持 #58

Description

@lijialong1313

connect.zip

这是我自己写的,对该库增加的Oracle数据库支持,和SQLite数据库支持。

已测试版本:

SpringBoot:3.4.3
database-all:6.5.4

相关依赖如下:

        <dependency>
            <groupId>org.xerial</groupId>
            <artifactId>sqlite-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>com.oracle.database.jdbc</groupId>
            <artifactId>ojdbc11</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>com.oracle.database.nls</groupId>
            <artifactId>orai18n</artifactId>
            <scope>provided</scope>
        </dependency>

因为我是尝试用Java去写Laravel框架,必不可少的就是多数据库加载功能。这是SpringBoot配置类的部分演示代码如下:

@Slf4j
@Configuration
public class Database {

    public static Map<String, Class<?>> supportBuilder = new HashMap<>();
    public static Map<String, Class<?>> supportGeneralModel = new HashMap<>();

    static {
        supportBuilder.put("mysql", GaarasonDataSourceBuilder.class);
        supportBuilder.put("sqlite", SqliteGaarasonDataSourceBuilder.class);
        supportBuilder.put("oracle", OracleGaarasonDataSourceBuilder.class);

        supportGeneralModel.put("mysql", GeneralModel.class);
        supportGeneralModel.put("sqlite", SqliteGeneralModel.class);
        supportGeneralModel.put("oracle", OracleGeneralModel.class);
    }

    //@Value("${jaravel.db.connection}")
    public static String DB_CONNECTION;
    //@Value("${spring.datasource.url}")
    public String DB_URL;
    //@Value("${spring.datasource.type}")
    public String DB_TYPE;
    //@Value("${spring.datasource.driver-class-name}")
    public String DB_DRIVER;
    //@Value("${spring.datasource.username}")
    public String DB_USERNAME;
    //@Value("${spring.datasource.password}")
    public String DB_PASSWORD;

    public Database(@Autowired Environment environment) {
        DB_CONNECTION = environment.getProperty("jaravel.db.connection");
        DB_URL = environment.getProperty("spring.datasource.url");
        DB_TYPE = environment.getProperty("spring.datasource.type");
        DB_DRIVER = environment.getProperty("spring.datasource.driver-class-name");
        DB_USERNAME = environment.getProperty("spring.datasource.username");
        DB_PASSWORD = environment.getProperty("spring.datasource.password");
    }

    @Bean
    @Primary
    public Model getGeneralModel() throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
        Class<?> modelClass = supportGeneralModel.get(DB_CONNECTION);
        if (modelClass != null) {
            Model model = (Model) modelClass.getDeclaredConstructor().newInstance();
            return model;
        }
        throw new RuntimeException("数据库类型不支持,通用模型无法创建");
    }

    @Bean
    public DataSource dataSource() {
        DruidDataSource druidDataSource = new DruidDataSource();
        druidDataSource.setUrl(DB_URL);
        druidDataSource.setDbType(DB_TYPE);
        druidDataSource.setDriverClassName(DB_DRIVER);
        druidDataSource.setUsername(DB_USERNAME);
        druidDataSource.setPassword(DB_PASSWORD);
        return druidDataSource;
    }

    @Bean
    public GaarasonDataSource gaarasonDataSource(DataSource dataSource, Container container) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        Class<?> builderClass = supportBuilder.get(DB_CONNECTION);
        if (builderClass != null) {
            GaarasonDataSource gaarasonDataSource = (GaarasonDataSource) builderClass.getDeclaredMethod("build", DataSource.class, Container.class).invoke(null, dataSource, container);
            return gaarasonDataSource;
        }
        throw new RuntimeException("数据库类型不支持,数据源无法创建");
    }
}

关键文件解释说明(以Sqlite为例,Oracle同理):

SqliteGaarasonDataSourceBuilder:仿造MySQL的builder,可以批量使用反射创建。

SqliteGeneralModel:仿造原来MySQL版本的GeneralModel,使得不需要创建表即可快速使用。由于原版的Model继承了final类MySQLBuilder,因此只能自己写一个新的。需要注意,GeneralModel生成的Bean方法需要加Primary注解,并且如果是SpringBoot获取的话,获取的应该是gaarason.database.eloquent.Model的实例(虽然可能还有其他的,但我写了这个),使用时会报警告“形参化类 'Model' 的原始使用”,不用管,能正常用。

有什么问题可以反馈一下,轻喷,我大部分都是直接基于MySQL改的,只有到错的时候才再看再写,所以肯定有很多奇怪的问题。

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions