面向对象编程和数据库

3

我正在学习面向对象编程。我的应用程序基于两个MySQL数据库。因此,我经常获取一些记录并将一些数据插入到我的数据库中。

是否可以有一个名为MySQL的类?这是一个非常简单的类,只有两种方法-Connect()Disconnect()。该类如下所示:

Imports MySql.Data.MySqlClient

Public Class MySQL 
    Private csJablotron As String = My.Settings.csJablotron
    Private csBCS As String = My.Settings.csBCS
    Private _connection As MySqlConnection

    Public ReadOnly Property Connection() As MySqlConnection
        Get
            Return _connection 
        End Get
    End Property


    Public Sub Connect(shop As String)

        Select Case shop
            Case "jablotron"
                _connection = New MySqlConnection(csJablotron)
            Case "bcs"
                _connection = New MySqlConnection(csBCS)
            Case Else
                MessageBox.Show("There is no shop with this name.")
                Exit Sub
        End Select

        Try
            _connection .Open()
        Catch ex As MySqlException
            MessageBox.Show(ex.Message)
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
    End Sub


    Public Sub Disconnect()
        Try
            _connection .Dispose()
        Catch ex As MySqlException
            MessageBox.Show(ex.Message)
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
    End Sub
End Class

然后在我的主程序中,当我需要使用数据库时,我只需简单地这样做:

Try
    mySql.Connect("bcs")    'mySql is an object of MySQL class
    ... 
    'here I select some records and do something with them...
Catch
    MessageBox.Show("Error")
Finally
    mySql.Disconnect()
End Try

在面向对象编程中,这种做法是否正确?或者最好的方法是当我需要数据库连接时总是使用using语句,在那里创建连接字符串,甚至不使用这个类?我知道这是一个理论性问题,但我非常好奇哪种方式更好。


4
这与C#无关。 - itsme86
但是是的,这是一件好事。 - Nyra
1
请查看单例设计模式的相关内容:https://dev59.com/3k7Sa4cB1Zd3GeqPzwBQ - ruedi
1个回答

1

将持久性层(数据库)抽象化始终是一个好主意。因此,请保留您的类!

我建议做一些事情:

  • 仅在实现IDisposable时使用using语句才有意义。否则,您的方法很好。
  • 不要在代码后台直接使用SELECT语句等。这些应该隐藏在持久性类的方法之后。

否则,您正在正确的轨道上。


感谢您的快速回复!那么我应该添加一个类似于 ExecuteQuery() 的方法,该方法接受一个字符串查询参数?然后我可以从其他类中执行此方法并执行 SELECT、UPDATE 或 DELETE 语句。是的,这很有意义,因为 MySQL 类应该连接、断开连接和执行查询。 - XardasLord
@XardasLord 不行。你的其他类别不应该知道任何关于 SQL 的事情。你应该在 MySQL 中添加方法,比如 "GetCars",然后执行适当的 SELECT。当你需要再次执行相同的查询时,这变得特别有用。 - BradleyDotNET
哦,好的。当我需要选择整个表或一些基本操作时,这很好。但是当我需要一个特定的查询时呢?一些详细的内容?那我应该将我使用的所有带有SELECT语句的方法都添加到MySQL类中吗? - XardasLord
1
@XardasLord 是的。请记住,如果您想执行WHERE或类似查询,可以将参数传递给方法。在完美的世界中,这个类会继承一个接口,您可以替换它与其他持久层而不更改任何客户端代码。 - BradleyDotNET
我有另一个问题。我应该将这个类设为静态的还是非静态的? - XardasLord
1
@XardasLord 完全静态的类很难进行依赖注入(因此也难以对其依赖项进行单元测试)。我将其实现为继承自“IPersistence”接口的单例,然后使用服务定位器来检索单例实例。如果您不关心测试,请放心地将其设置为静态(只需确保它是线程安全的!) - BradleyDotNET

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接