@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "@ccms/database",
 | 
			
		||||
    "version": "0.6.7",
 | 
			
		||||
    "version": "0.7.0",
 | 
			
		||||
    "description": "MiaoScript database package",
 | 
			
		||||
    "keywords": [
 | 
			
		||||
        "miaoscript",
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										3
									
								
								packages/database/src/constants.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								packages/database/src/constants.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
			
		||||
export const METADATA_KEY = {
 | 
			
		||||
    
 | 
			
		||||
}
 | 
			
		||||
@@ -1,9 +1,33 @@
 | 
			
		||||
/// <reference types="@ccms/types/dist/typings/spring" />
 | 
			
		||||
 | 
			
		||||
import { Model } from './model'
 | 
			
		||||
 | 
			
		||||
const HikariDataSource = Java.type('com.zaxxer.hikari.HikariDataSource')
 | 
			
		||||
const HikariConfig = Java.type('com.zaxxer.hikari.HikariConfig')
 | 
			
		||||
const JdbcTemplate = Java.type('org.springframework.jdbc.core.JdbcTemplate')
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 数据库配置
 | 
			
		||||
 */
 | 
			
		||||
export interface DataBaseConfig {
 | 
			
		||||
    /**
 | 
			
		||||
     * 数据库连接串
 | 
			
		||||
     */
 | 
			
		||||
    url: string | javax.sql.DataSource
 | 
			
		||||
    /**
 | 
			
		||||
     * 数据库驱动
 | 
			
		||||
     */
 | 
			
		||||
    driverClassName?: string
 | 
			
		||||
    /**
 | 
			
		||||
     * 用户名
 | 
			
		||||
     */
 | 
			
		||||
    username?: string
 | 
			
		||||
    /**
 | 
			
		||||
     * 密码
 | 
			
		||||
     */
 | 
			
		||||
    password?: string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 数据库封装类
 | 
			
		||||
 */
 | 
			
		||||
@@ -11,24 +35,27 @@ export class DataBase {
 | 
			
		||||
    private dataSource: javax.sql.DataSource
 | 
			
		||||
    private jdbcTemplate: org.springframework.jdbc.core.JdbcTemplate
 | 
			
		||||
 | 
			
		||||
    constructor(url: string | javax.sql.DataSource, username?: string, password?: string) {
 | 
			
		||||
        if (!url) { throw new Error('DataBase url can\'t be null!') }
 | 
			
		||||
        this.createDataSource(url, username, password)
 | 
			
		||||
    constructor(dbConfig: DataBaseConfig) {
 | 
			
		||||
        if (!dbConfig.url) { throw new Error('DataBase url can\'t be null!') }
 | 
			
		||||
        this.createDataSource(dbConfig)
 | 
			
		||||
        this.initialize()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private createDataSource(url: string | javax.sql.DataSource, username?: string, password?: string) {
 | 
			
		||||
        if (typeof url === "string") {
 | 
			
		||||
            if (!username || !password) {
 | 
			
		||||
    private createDataSource(dbConfig: DataBaseConfig) {
 | 
			
		||||
        if (typeof dbConfig.url === "string") {
 | 
			
		||||
            if (!dbConfig.username || !dbConfig.password) {
 | 
			
		||||
                throw new Error('DataBase username or password can\'t be null!')
 | 
			
		||||
            }
 | 
			
		||||
            let config = new HikariConfig()
 | 
			
		||||
            config.setUsername(username)
 | 
			
		||||
            config.setPassword(password)
 | 
			
		||||
            config.setJdbcUrl(url)
 | 
			
		||||
            if (dbConfig.driverClassName) {
 | 
			
		||||
                config.setDriverClassName(dbConfig.driverClassName)
 | 
			
		||||
            }
 | 
			
		||||
            config.setUsername(dbConfig.username)
 | 
			
		||||
            config.setPassword(dbConfig.password)
 | 
			
		||||
            config.setJdbcUrl(dbConfig.url)
 | 
			
		||||
            this.dataSource = new HikariDataSource(config)
 | 
			
		||||
        } else {
 | 
			
		||||
            this.dataSource = url
 | 
			
		||||
            this.dataSource = dbConfig.url
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -41,7 +68,21 @@ export class DataBase {
 | 
			
		||||
     * @param sql SQL语句
 | 
			
		||||
     */
 | 
			
		||||
    query<T>(sql: string, ...args: any[]): Array<T> {
 | 
			
		||||
        return this.jdbcTemplate.queryForList(sql, args)
 | 
			
		||||
        let startTime = Date.now()
 | 
			
		||||
        let result = Java.from(this.jdbcTemplate.queryForList(sql, args))
 | 
			
		||||
        console.debug(java.lang.String.format(`\n[DB] query \nSQL  : ${sql.replace(/\?/ig, '%s')} \nCOST : ${Date.now() - startTime}ms`, args))
 | 
			
		||||
        return result
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 执行SQL更新
 | 
			
		||||
     * @param sql SQL语句
 | 
			
		||||
     */
 | 
			
		||||
    update(sql: string, ...args: any[]): number {
 | 
			
		||||
        let startTime = Date.now()
 | 
			
		||||
        let result = this.jdbcTemplate.update(sql, args)
 | 
			
		||||
        console.debug(java.lang.String.format(`\n[DB] update \nSQL  : ${sql.replace(/\?/ig, '%s')} \nCOST : ${Date.now() - startTime}ms`, args))
 | 
			
		||||
        return result
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    close() {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										7
									
								
								packages/database/src/decorators.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								packages/database/src/decorators.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,7 @@
 | 
			
		||||
import 'reflect-metadata'
 | 
			
		||||
 | 
			
		||||
export function id() {
 | 
			
		||||
    return (target: Object, propertyKey: string | symbol) => void {
 | 
			
		||||
        
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,11 +1,9 @@
 | 
			
		||||
import { plugin, database } from '@ccms/api'
 | 
			
		||||
import { provideSingleton, inject, postConstruct, Container, ContainerInstance } from '@ccms/container'
 | 
			
		||||
import { DataBase } from './database'
 | 
			
		||||
import { provideSingleton, inject, postConstruct } from '@ccms/container'
 | 
			
		||||
import { DataBase, DataBaseConfig } from './database'
 | 
			
		||||
 | 
			
		||||
@provideSingleton(database.DataBaseManager)
 | 
			
		||||
export class DataBaseManager {
 | 
			
		||||
    @inject(ContainerInstance)
 | 
			
		||||
    private container: Container
 | 
			
		||||
    @inject(plugin.PluginInstance)
 | 
			
		||||
    private instance: any
 | 
			
		||||
 | 
			
		||||
@@ -18,20 +16,30 @@ export class DataBaseManager {
 | 
			
		||||
        try {
 | 
			
		||||
            this.beanFactory = this.instance.getAutowireCapableBeanFactory()
 | 
			
		||||
            let mainDatasource = this.beanFactory.getBean(Packages.javax.sql.DataSource.class)
 | 
			
		||||
            this.mainDatabase = new DataBase(mainDatasource)
 | 
			
		||||
            this.mainDatabase = new DataBase({ url: mainDatasource })
 | 
			
		||||
        } catch (error) {
 | 
			
		||||
            console.ex(error)
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获得主数据库
 | 
			
		||||
     * Get MainDatabase
 | 
			
		||||
     */
 | 
			
		||||
    getMainDatabase() {
 | 
			
		||||
        return this.mainDatabase
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    createDatabase(name: string, url: string, username: string, password: string) {
 | 
			
		||||
    /**
 | 
			
		||||
     * 创建数据库
 | 
			
		||||
     * Create A Database Instance
 | 
			
		||||
     * @param name 数据库名称 用于代码 database Name use at code
 | 
			
		||||
     * @param config 数据库配置
 | 
			
		||||
     */
 | 
			
		||||
    createDatabase(name: string, config: DataBaseConfig) {
 | 
			
		||||
        Java.synchronized(() => {
 | 
			
		||||
            if (this.databases[name]) return this.databases[name]
 | 
			
		||||
            return this.databases[name] = new DataBase(url, username, password)
 | 
			
		||||
            return this.databases[name] = new DataBase(config)
 | 
			
		||||
        }, this.databases)()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										11
									
								
								packages/database/src/model.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								packages/database/src/model.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,11 @@
 | 
			
		||||
import { DataBase } from "./database"
 | 
			
		||||
 | 
			
		||||
export class Model<T> {
 | 
			
		||||
    constructor(private database: DataBase) {
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
    queryForList(): Array<T> {
 | 
			
		||||
        
 | 
			
		||||
        return []
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user