# MuYunDatabase **Repository Path**: bridge/MuYunDatabase ## Basic Information - **Project Name**: MuYunDatabase - **Description**: No description available - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-11-27 - **Last Updated**: 2025-11-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # MuYun-Database 一个方便创建、修改表结构的工具库,依赖单纯,目前仅依赖 `jdbi` 。同时支持 `MySQL`、`Postgres`。 可以方便的结合在 `Spring` 、`Quarkus` 等生态的项目里。 既是 [MuYun](https://github.com/ximatai/MuYun) 的一部分,也可以单独使用。 ### 最新版本及兼容性 * 版本 `2.26.+` 兼容 `Java21` 及以上 * 版本 `1.26.+` 兼容 `Java8` ### 包说明 * `muyun-database-core` 纯 `Java` 项目,不依赖任何框架,主要用于定义标准接口和业务逻辑 * `muyun-database-jdbi` 基于 `jdbi` 具体实现,通常项目依赖这个包即可 * `muyun-database-jdbi-jdk8` 基于 `jdbi` 具体实现,兼容 `Java8`,仅存在于 `jdbi-jdk8` 分支 * `muyun-database-test` 准本用来跑单元测试的包,实际项目不需要依赖 ## 快速开始 1. 添加依赖 * gradle ```groovy dependencies { implementation("net.ximatai.muyun.database:muyun-database-jdbi:2.26.+") // 兼容 Java21 implementation("net.ximatai.muyun.database:muyun-database-jdbi-jdk8:1.26.+") // 兼容 Java8 } ``` * maven ```xml net.ximatai.muyun.database muyun-database-jdbi 2.26.+ net.ximatai.muyun.database muyun-database-jdbi-jdk8 1.26.+ ``` 2. 标准用法 * 准备工作 ```java // 创建数据源 (Spring 项目正常不需要自己创建,这段主要是演示原始用法) HikariConfig config = new HikariConfig(); config.setJdbcUrl(getContainer().getJdbcUrl()); config.setUsername(getContainer().getUsername()); config.setPassword(getContainer().getPassword()); config.setDriverClassName(getContainer().getDriverClassName()); DataSource dataSource = new HikariDataSource(config); // 创建 Jdbi 对象,当然也可以用其他参数的方法创建 Jdbi ,不过通常来说推荐基于数据源 DataSource 的方法 Jdbi jdbi = Jdbi.create(dataSource).setSqlLogger(new Slf4JSqlLogger()); // 本项目需要的两个对象 JdbiMetaDataLoader loader = new JdbiMetaDataLoader(jdbi); JdbiDatabaseOperations db = new JdbiDatabaseOperations(jdbi, loader); ``` * 创建表结构(方法1:命令式) ```java // 获取数据库信息 DBInfo info = loader.getDBInfo(); TableWrapper basic = TableWrapper.withName("basic") .setPrimaryKey(getPrimaryKey()) .setComment("测试表") .addColumn(Column.of("v_name").setLength(20).setIndexed().setComment("名称").setDefaultValue("test")) .addColumn(Column.of("i_age").setComment("年龄")) .addColumn(Column.of("n_price").setPrecision(10).setScale(2)) .addColumn("b_flag") .addColumn("d_date") .addColumn(Column.of("t_create").setDefaultValueAny("CURRENT_TIMESTAMP")); new TableBuilder(db).build(basic); DBTable table = info.getDefaultSchema().getTable("basic"); assertNotNull(table); ``` * 创建表结构(方法2:声明式) ```java @Table(name = "test_entity") @CompositeIndex(columns = {"name", "age"}, unique = true) @CompositeIndex(columns = {"name", "flag"}) public class TestEntityBase { @Column(length = 20, comment = "名称", defaultVal = @Default(varchar = "test_name")) public String name; @Indexed(unique = true) @Column(comment = "学号") public int code; @Column(comment = "年龄", defaultVal = @Default(number = 12)) public int age; @Column(precision = 10, scale = 2, defaultVal = @Default(decimal = 1.23)) public double price; @Column(precision = 10, scale = 2, defaultVal = @Default(decimal = 1.23)) public float price2; @Indexed @Column(defaultVal = @Default(trueVal = true)) public boolean flag; @Column(name = "create_time", defaultVal = @Default(express = "CURRENT_TIMESTAMP")) public Date creatTime; } new TableBuilder(db).build(basic); DBTable table = info.getDefaultSchema().getTable("basic"); assertNotNull(table); ``` * 插入与查询数据 ```java Map body = Map.of("v_name", "test_name", "i_age", 5, "b_flag", true, "n_price", 10.2, "d_date", "2024-01-01" ); String id = db.insertItem("basic", body); assertNotNull(id); Map item = db.getItem("basic", id); assertNotNull(item); assertEquals("test_name", item.get("v_name")); assertEquals(5, item.get("i_age")); assertEquals(true, item.get("b_flag")); assertEquals(0, BigDecimal.valueOf(10.2).compareTo((BigDecimal) item.get("n_price"))); assertEquals(LocalDate.of(2024, 1, 1), ((Date) item.get("d_date")).toLocalDate()); ``` * 整合进 `Spring` ```java import net.ximatai.muyun.database.core.IDatabaseOperations; import net.ximatai.muyun.database.jdbi.JdbiDatabaseOperations; import net.ximatai.muyun.database.jdbi.JdbiMetaDataLoader; import org.jdbi.v3.core.Jdbi; import org.jdbi.v3.core.statement.Slf4JSqlLogger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy; import org.springframework.stereotype.Service; import javax.sql.DataSource; @Service public class DBProducer { @Autowired DataSource dataSource; @Bean public IDatabaseOperations createDB() { TransactionAwareDataSourceProxy proxy = new TransactionAwareDataSourceProxy(dataSource); Jdbi jdbi = Jdbi.create(proxy) .setSqlLogger(new Slf4JSqlLogger()); JdbiMetaDataLoader loader = new JdbiMetaDataLoader(jdbi); JdbiDatabaseOperations db = new JdbiDatabaseOperations(jdbi, loader); return db; } } ``` * 更多用法可以查看单元测试用例 [MuYunDatabaseBaseTest](https://github.com/ximatai/MuYunDatabase/blob/master/muyun-database-test/src/test/java/net/ximatai/muyun/database/MuYunDatabaseBaseTest.java)