首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【B4J】怎么用VBA/VB6写一个WebApi服务器端程序之MySQL数据库连接(二)

【B4J】怎么用VBA/VB6写一个WebApi服务器端程序之MySQL数据库连接(二)

作者头像
办公魔盒
发布2025-10-21 13:50:09
发布2025-10-21 13:50:09
990
举报
文章被收录于专栏:办公魔盒办公魔盒

历史文章:

继续今天的内容:

第一步,还是使用上一篇创建的项目,并删除无用的内容

删除这几模块

代码语言:javascript
复制
GuessMyNumber
ResetMyNumber
WSGuessMyNumber

删除这段代码

代码语言:javascript
复制
srvr.StaticFilesFolder = File.Combine(File.DirApp, "www")
srvr.AddHandler("/guessmynumber/guess", "GuessMyNumber", False)
srvr.AddHandler("/guessmynumber/reset", "ResetMyNumber", False)
srvr.AddWebSocket("/guessmynumber_ws/ws", "WSGuessMyNumber")

删除模块后,需要到项目文件夹下删除相应模块的bas文件和清空Objects文件夹

第二步,新建一个标准类模块(Standard Class),并命名为MySqlHelper

第三步,去MySQL官网或Maven下载MySQL JDBC驱动程序(这里去maven网站下载),然后把下载的mysql-connector-j-9.4.0.jar放入额外类库目录

代码语言:javascript
复制
https://mvnrepository.com/artifact/com.mysql/mysql-connector-j/9.4.0

第四步,在Main模块引入mysql-connector-j-9.4.0.jar驱动到项目中

代码语言:javascript
复制
#AdditionalJar: mysql-connector-j-9.4.0.jar

第五步,返回MySqlHelper类模块,编写MySQL数据库连接帮助类模块代码

5.1.开始前需要先引用jSQL类库(B4J自带)

5.2.编写MySQL帮助类模块的增删改查代码

代码语言:javascript
复制

'' 模块全局变量
Sub Class_Globals
	Private driverClass As String = "com.mysql.cj.jdbc.Driver" '' mysql-connector-j-9.4.0.jar数据驱动类
	Private host As String = "159.75.75.206" '' 数据库IP地址
	Private port As Int=3306 '' 数据库端口
	Private dataBase As String="db_b4j" '' 数据库名称
	Private userName As String="b4j" '' 数据库用户名
	Private password As String="admin@123" '' 数据库密码
	Private mysql As SQL '' 数据库对象
End Sub

' 初始化数据库对象
Public Sub Initialize
	Dim redisUrl As String=$"jdbc:mysql://${host}:${port}/${dataBase}?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true"$
	mysql.Initialize2(driverClass,redisUrl,userName,password)
	If mysql.IsInitialized Then
		ToolHelper.WirteLog("MySQL 初始化成功!")
		Try
			Dim rs As ResultSet
			rs = mysql.ExecQuery("SELECT SYSDATE()")
			If rs.NextRow Then
				ToolHelper.WirteLog("当前MySQL数据库时间:" & rs.GetString2(0))
			End If
		Catch
			ToolHelper.WirteLog("MySQL链接异常:" & LastException.Message)
		End Try
	End If
End Sub

' 关闭数据库连接
Public Sub Close
	If mysql.IsInitialized Then
		mysql.Close
		ToolHelper.WirteLog("MySQL连接已关闭")
End If
End Sub

' 执行查询并返回单一结果
Public Sub ExecQuerySingleResult2(sql As String,params() As Object) As String
	If Not(mysql.IsInitialized) Then Return Null
	Try
		Return mysql.ExecQuerySingleResult2(sql,params)
	Catch
		ToolHelper.WirteLog("执行查询异常: " & LastException.Message & " SQL: " & sql)
		Return Null
	End Try
End Sub

' 执行查询并返回结果集
Public Sub ExecuteQueryByList2(sql As String,params() As Object) As List
	If Not(mysql.IsInitialized) Then Return Null
	Try
		Dim rs As ResultSet= mysql.ExecQuery2(sql,params)
''---------
		Dim lst As List
		lst.Initialize
''---------
		Do While rs.NextRow
			Dim mp As Map
			mp.Initialize
			Dim colCt As Int=rs.ColumnCount
''--------
			Dim i As Int
For i =0 To colCt-1
				Dim key As String=rs.GetColumnName(i)
				Dim value As String=rs.GetString(key)
				mp.Put(key,value)
			Next
''--------
			lst.Add(mp)
		Loop
''--------
Return lst
	Catch
		ToolHelper.WirteLog("执行查询异常: " & LastException.Message & " SQL: " & sql)
Return Null
End Try
End Sub

' 执行带参数的查询(防止SQL注入)
Public Sub ExecuteQuery2(sql As String, params() As Object) As ResultSet
	If Not(mysql.IsInitialized) Then Return Null
	Try
		Return mysql.ExecQuery2(sql, params)
	Catch
		ToolHelper.WirteLog("执行参数化查询异常: " & LastException.Message & " SQL: " & sql)
		Return Null
	End Try
End Sub

' 执行带参数的更新操作(防止SQL注入)
Public Sub ExecuteUpdate2(sql As String, params() As Object) As Boolean
	If Not(mysql.IsInitialized) Then Return False
	Try
		mysql.ExecNonQuery2(sql, params)
Return True
	Catch
		ToolHelper.WirteLog("执行参数化更新异常: " & LastException.Message & " SQL: " & sql)
Return False
End Try
End Sub

' 获取最后插入的ID
Public Sub GetLastInsertedId As Long
	If Not(mysql.IsInitialized) Then Return -1
	Try
		Dim rs As ResultSet = mysql.ExecQuery("SELECT LAST_INSERT_ID()")
		If rs.NextRow Then
			Dim id As Long = rs.GetLong2(0)
			rs.Close
			Return id
		End If
		rs.Close
		Return -1
	Catch
		ToolHelper.WirteLog("获取最后插入ID异常: " & LastException.Message)
		Return -1
	End Try
End Sub

第六步,创建一个请求处理模块(Server Handler)来测试MySQL连接情况,模块命名为SystemHandler用来后续处理登录注册等系统级的请求连接

6.1.添加SystemHandler请求处理模块

6.2.在Main主模块引用SystemHandler请求处理模块

代码语言:javascript
复制
srvr.AddHandler("/system/*","SystemHandler",False)

Path参数说明:path参数支持*通配符,意思是所用的 http://0.0.0.0/system/xxxxxx的连接都会经过SystemHandler这个请求模块来处理和返回结果,比如:

用户登录,http://0.0.0.0/system/login,

用户注册,http://0.0.0.0/system/register,

忘记密码,http://0.0.0.0/system/forgotpassword

这些链接均会经过这个模块来处理

6.2.在请求SystemHandler请求处理模块中进行地址分离和请求方法校验,代码如下

代码语言:javascript
复制
'' 模块全局变量
Sub Class_Globals

End Sub

Public Sub Initialize

End Sub

'' 处理方法
'' 参数:req 为前端发来的请求对象
'' 参数:resp 为当前模块需要返回给客户端的对象
Sub Handle(req As ServletRequest, resp As ServletResponse)
	Dim baseUrl As String=req.RequestURI.ToLowerCase
	Dim httpMethod As String=req.Method
''---------------返回体处理
	resp.CharacterEncoding="utf8"
	resp.ContentType="application/json"
''---------------根据请求方式和后缀路径作出对应的操作
        If httpMethod="POST" And baseUrl.EndsWith("login") Then
		AccountLogin(req,resp)
        Else If httpMethod="POST" And baseUrl.EndsWith("register") Then
		AccountRegister(req,resp)
        Else If httpMethod="POST" And baseUrl.EndsWith("forgotpassword") Then
		AccountForgotPassword(req,resp)
        Else
		resp.Write($"不支持的方法${httpMethod}"$)
        End If
End Sub


'' 用户登录
Private Sub AccountLogin(req As ServletRequest, resp As ServletResponse)
	resp.Write("用户登录返回结果")
End Sub

'' 用户注册
Private Sub AccountRegister(req As ServletRequest, resp As ServletResponse)
	resp.Write("用户注册返回结果")
End Sub

'' 忘记密码
Private Sub AccountForgotPassword(req As ServletRequest, resp As ServletResponse)
	resp.Write("忘记密码返回结果")
End Sub

6.3.然后我们,启动服务,请求上面这几条链接看看效果,可以看到已经成功进入处理器

第七步,好了,现在可以开始测试MySQL帮助类了

7.1.在SystemHandler请求模块,添加MySQL帮助类引用,并初始化

7.2.在登录login接口,我们查询一下数据库数据

数据表数据:

查询这个表数据,并转成json输出,需要引用json类库(自带):

代码语言:javascript
复制
select * from sys_user

启动项目,继续访问http://0.0.0.0/system/login,OK很成功!!!

好了,今天的内容到此借宿了!!下一篇,介绍jwt登录认证,不知道又有多少人感兴趣呢?

测试项目开源地址:

代码语言:javascript
复制
https://gitee.com/wxvbee/b4-j-web-api-project
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-10-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 办公魔盒 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档