
历史文章:
继续今天的内容:
第一步,还是使用上一篇创建的项目,并删除无用的内容

删除这几模块
GuessMyNumber
ResetMyNumber
WSGuessMyNumber删除这段代码
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放入额外类库目录
https://mvnrepository.com/artifact/com.mysql/mysql-connector-j/9.4.0


第四步,在Main模块引入mysql-connector-j-9.4.0.jar驱动到项目中
#AdditionalJar: mysql-connector-j-9.4.0.jar
第五步,返回MySqlHelper类模块,编写MySQL数据库连接帮助类模块代码
5.1.开始前需要先引用jSQL类库(B4J自带)

5.2.编写MySQL帮助类模块的增删改查代码
'' 模块全局变量
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请求处理模块
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请求处理模块中进行地址分离和请求方法校验,代码如下

'' 模块全局变量
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 Sub6.3.然后我们,启动服务,请求上面这几条链接看看效果,可以看到已经成功进入处理器




第七步,好了,现在可以开始测试MySQL帮助类了
7.1.在SystemHandler请求模块,添加MySQL帮助类引用,并初始化

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

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

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


好了,今天的内容到此借宿了!!下一篇,介绍jwt登录认证,不知道又有多少人感兴趣呢?
测试项目开源地址:
https://gitee.com/wxvbee/b4-j-web-api-project