# cjdbc-mysql **Repository Path**: Lin_Qing_Ying/cjdbc-mysql ## Basic Information - **Project Name**: cjdbc-mysql - **Description**: 仓颉语言的mysql数据库驱动 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: tls - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 1 - **Created**: 2024-08-05 - **Last Updated**: 2025-09-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README

cjdbc-mysql

## 介绍 通过仓颉数据标准接口实现mysql驱动程序的纯仓颉实现 ### 特性 - 🚀 连接管理 - 🚀 事务管理 - 🚀 数据类型映射 - 🚀 异常处理 - 💪 数据库元数据 - 🛠️ 预处理语句 - 🌍 批处理 - 💡 结果集处理 ## 架构 ### 架构图

### 源码目录 ```shell ├─doc ├─src │ ├─cjdbc │ ├─conf │ ├─exceptions │ ├─expansion │ ├─log │ ├─message │ ├─protocol │ ├─socket │ └─util └─test ``` - `doc` 存放库的设计文档、使用文档、LLT 用例覆盖报告 - `src` 是库源码目录 - `test` 存放测试文件 ## 示例 ### 详细示例查看 test/main.cj #### 使用库标准接口 ```text 1.导入驱动 import mysql.CJMySqlDriver 2.注册驱动 2.1 使用DriverUtil调用驱动注册 from mysql import com.qy.cj.DriverUtil DriverUtil.register(name) 2.2 使用DriverManager调用驱动注册 let driver = CJMySqlDriver() DriverManager.register("mysql", driver) 2.3 直接使用驱动类 let drv = CJMySqlDriver() 3.打开数据源 let opts = [ (SqlOption.Username, "root"), (SqlOption.Password, "....") ] var ds = drv.open( "cjdbc:mysql://127.0.0.1:3306/dbtest", opts ) 4.获取连接 let conn = ds.connect() 5.执行sql let stmt = conn.prepareStatement("select * from test") let u = stmt.query() 6.获取结果 var id: SqlInteger = SqlInteger(-1) var name: SqlVarchar = SqlVarchar("") //必须严格遵守查询字段的顺序和个数 while (u.next(name, id)) { println("id:${id.value} name:${name.value} ") } 7.关闭连接 conn.close() ``` #### 使用驱动扩展的接口 扩展接口查看 doc/doc.md ```text //导入依赖 import mysql.* //使用DriverUtil类的getConnection方法获取连接 try (conn = DriverUtil.getConnection("cjdbc:mysql://127.0.0.1:3072/dbtest", "root", "....")) { let stmt = conn.createStatement() println(stmt.execute("insert into test (id,name) values (1,'test')")) let res = stmt.executeQuery("select * from test") while (res.next()) { println("id:${res.getInterger("id")} name:${res.getString("name")}") println("id:${res.getInterger(1)} name:${res.getString(2)}") } conn.close() } catch (e: Exception) { println(e) } ``` ## 已完成(可能并不完善) 1. [x] 驱动注册 2. [x] 连接mysql服务器 3. [x] caching_sha2_password认证和mysql_native_password认证 4. [x] mysql通信协议的数据包解析和接收 5. [x] mysql通信协议的数据包封装和发送 6. [x] update操作(insert,update,delete) 7. [x] query操作(select) 8. [x] 满足基本的sql语法 9. [x] 多数据集查询 10. [x] 事务 11. [x] 字符集编码和解码(需charset库和mysql都支持) 12. [x] ssl加密连接 ## 未完成 1. [ ] 批量操作 2. [ ] 读写分离 3. [ ] 读取配置文件 4. [ ] 元数据查询 5. [ ] 错误处理(目前只保证驱动运行,抛出错误,没有处理) ## 问题 1. mysql5.7使用插入语句插入中文数据时,数据库中的数据为乱码,但是查询时数据正常,byte数据也一致,原因未知,初步判定为数据库字符集编码问题,但是目前没有找到解决方案,应该缺少一些参数 ## 参与贡献 [@Lin_Qing_Ying](https://gitee.com/Lin_Qing_Ying)