# 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)