zoukankan      html  css  js  c++  java
  • ADO.NET数据库编程

    ADO.NET数据库编程

    1、ADO.NET的相关概念。

    Microsoft的新一代技术,是ADO组件的后继者。

    主要目的是在.NET Framework平台存取数据。

    提供一致的对象模型,可以存取和编辑各种数据源的数据,即对这些数据源,提供了一致的数据处理方式。

    ADO.NET保存和传递数据是使用XML格式。可实现与其他平台应用程序以XML文件进行数据交换。

    2、数据访问类库的名称空间

    针对不同的数据源,使用不同名称空间的数据访问类库,即数据提供程序。常用的数据源包括四种:

    Microsoft SQL Server数据源:使用System.Data.SqlClient名称空间。

    OLEDB数据源:使用System.Data.OleDb名称空间。

    ODBC数据源:使用System.Data.Odbc名称空间。

    Oracle数据源:使用System.Data.OracleClient名称空间

    要使用ADO.NET 来访问数据库,需要将相应的名称空间导入到应用程序中,如下:

    System.Data是通用的名称空间,其中包含组成ADO.NET核心体系结构的所有类。

    System.Data.Oledb 名称空间供ADO.NET 管理提供程序访问支持OleDb的数据源时使用。

    System.Data.SQLClient 名称空间供 SQL Server管理提供程序使用。该名称空间是专为 Microsoft SQL Server 而设计的,对于以前版本的 SQL Server,可以提高其性能。

    如:using System.Data;

        using System.Data. SqlClient;

    System.Data.OleDb和System.Data.SqlClient名称空间的类名称相同,只是字头不同。

    之所以分成两组类,主要目的是提供一组最佳化SQL Server数据库存取的类。

    OleDb字头的类是使用OLEDB提供者数据源的数据库。例如Access和Oracle等数据库。

    Sql字头的类只能使用在SQL Server7.0以上版本,直接和服务器端的SQL Server通信,因为不通过OLE DB和ODBC,所以可以明显提升整体的执行效率。

    3、ADO.NET的组成

    ADO.NET用于访问和处理数据的类库包含以下两个组件:

    .NET Framework 数据提供程序

    DataSet

     
       

    ADO.NET 数据提供程序的四个核心对象:

    Connection建立到指定资源的连接

    Command对一个数据源执行命令。公开Parameters,在 Connection 的 Transaction 范围内执行。

    DataReader从一个数据源读取的只读数据流。

    DataAdapter填充一个 DataSet,解析数据源的更新。

    ADO.NET是使用Connection对象建立与数据源的数据链路,然后使用Command对象执行命令来获取数据源的数据,对数据库来说就是使用SQL命令。

    在获取数据源的数据后,就可以填入DataReader或DataSet对象,最后使用数据绑定在Web控件显示记录数据。

    Connection对象

    可以建立与数据源间的连接;对数据库来说,还负责初始化数据库。

    有两种:OleDbConnection对象和SqlConnection对象。

    Web服务器和数据库系统本属于两套不同的应用程序,通过ODBC或OLE DB可以打开数据源的数据库,Connection对象进一步将ASP.NET程序和数据库连接起来。

    Command对象

    可以对数据源执行命令,对数据库来说,就是执行SQL命令。

    ASP.NET程序可以使用Command对象发送SQL命令来插入、删除、更新和查询数据表的记录。

    需要先使用Connection对象建立数据库连接后,才能使用Command对象执行SQL命令。

    两种:OleDbCommand对象和SqlCommand对象。

    DataReader对象

    可以从数据源使用Command对象执行命令,获取“只读”(Read-Only)和“只能向前”(Forward-Only)的流数据。

    每次只能从数据源读取一行数据保存到内存。

    获取的数据为只读,不允许插入、删除和更新记录,其目的是显示查询结果。

    两种:OleDbDataReader对象和

            SqlDataReader对象。

    DataAdapter 和 DataSet 类满足了支持数据库访问的断开连接模型这一需求。

    DataSet 是 ADO.NET 断开连接体系结构中主要的数据存储工具。填充 DataSet 时,必须创建一个 DataAdapter 来填充 DataSet。

    DataAdapter 连接数据库,执行查询并填充 DataSet。当 DataAdapter 调用 Fill 或 Update 方法时,在后台完成所有的数据传输。每个 .NET Framework 的数据提供程序都有一个 DataAdapter 对象。 DataAdapter 能控制与现有数据源的交互。DataAdapter 也能将对 DataSet 的变更传输回数据源中。

    一个 DataSet 代表一组完整的数据,包括表格、约束条件和表关系。DataSet 能够存储代码创建的本地数据,也能存储来自多个数据源的数据,并断开到数据库的连接。

    DataSet和DataTable对象

    DataSet对象是由DataTable对象组成的集合对象,可代表保存在内存的数据库。

    每一个DataTable保存一个数据表的记录数据,并且可以设定数据表间的关联性。

    属于System.Data名称空间,用DataAdapter类的方法Fill()将数据表的数据填入DataSet对象。

    可以在DataTable对象中插入和删除行,即处理数据表的记录,最后使用DataAdapter类将DAtaTable对象中的数据更新到数据库。

    4、使用ADO.NET SQL命令执行数据库操作

    分为两种方式:

    使用ADO.NET的Command对象配合SQL语法;

    使用ADO.NET的DataSet对象;

    (1)可用Command对象执行SQL命令;用Connection对象来建立数据库连接。

    步骤:

    导入所需的名称空间;

    建立和打开数据库连接;

    建立Command对象;

    执行SQL命令处理数据库;

    关闭数据库连接;

    实例演示。

    建立Connection对象的语法:

    SqlConnection objcon;

    objcon=new SqlConnection(strDbCon);

    上述代码建立了名为objCon的SqlConnection对象。

    strDbCon变量是数据源字符串,如:

    strDbCon="server=(local);database=ybsd;Trusted_Connection=Yes;"

    上述字符串中以“;”分隔

    建立好Connection对象后,就可以使用Open()方法打开数据库连接:

    objCon.Open()

    Connection对象的相关方法:

      Open()和Close()

    Connection对象的相关属性:

      ConnectionString;ConnectionTimeout

      Database;DataSource;

      Provider;State

    上述属性在连接打开后都成为只读属性;

    在连接打开前,可以设定这些属性,如:

      objCon.ConnectionTimeout=30

    上述设定与在连接字符串中指定功能等同;

    在打开数据库连接后,就可以建立Command对象来指定欲执行的SQL命令字符串:

    SqlCommand objcom;

    objcom = new SqlCommand(strsql, objCon);

    上述代码使用SqlCommand类建立Command对象;第一个参数是SQL命令字符串;第二个参数是建立的Connection对象:

    实例演示:使用sql语句SELECT CategoryID, CategoryName FROM Categories,创建查询表Categories的命令的代码如下:

    SqlCommand cmd;

    cmd=new SqlCommand("SELECT CategoryID, CategoryName FROM dbo.Categories",con)

    Command对象的相关属性:

    Parameters:用来访问输入及输出参数和返回值。

    SqlCommand支持命名参数。添加到Parameters集合的参数的名称必须与SQL语句或存储过程中的参数标记的名称相匹配。

    OleCommand不支持命名参数,用问号占位符标记参数,则向Parameters集合中添加参数的顺序必须与定义的参数顺序相匹配。

    如:

    SqlParameter param;

    ……

     objcmd = new SqlCommand("select username,password from userinfo where username like @name ", objconn);

    param = objcmd.Parameters.Add("name", SqlDbType.NVarChar, 15);

    param.Value = tbname.Text;

    SqlDataReader objdr = objcmd.ExecuteReader();

    ……

    Command对象的相关属性:

    CommandType:命令类型,

      可选CommandType.StoredProcedure、

          CommandType.Text、

          CommandType.TableDirect

    如:Sale是存储过程

    cmd =new SqlCommand(“sale”,con)

    cmd.CommandType=CommandType.StoredProcedure

    在打开数据库连接,建立Command对象后,就可以用Command对象的ExecuteNonQuery()方法来执行SQL命令,如:

    count=objCmd.ExecuteNonQuery()

    Count可以获取响应的记录数。此方法不会回发记录数据。

    Command对象公开了几个可用于执行所需操作的Execute方法:

    ExecuteReader:当以数据流的形式返回结果时,使用ExecuteReader可返回DataReader对象。

    ExecuteScalar:使用ExecuteScalar可返回单个值。

    ExecuteNonQuery:使用ExecuteNonQuery可执行不返回行的命令。

    使用DataReader对象的Read方法可从查询结果中获取行。

    例如,循环显示SqlDataReader—dtr的数据的代码如下:

    While(dtr.Read())

    {

        lblMessage+="<li>";

        lblMessage+=dtr["ID"];

        lblMessage+=", ";

        lblMessage+=dtr["姓名"];

    }

    完成数据库操作后,使用Connection对象的Close()方法关闭数据库连接:

      objCon.Close();

    实例演示。

    小结:使用数据提供程序访问数据库操作的典型步骤如下:

    建立数据库连接;

    创建SQL命令;

    执行SQL命令;

    处理SQL命令结果。

    实例演示用SQL命令实现数据的增、删、改功能。

    课堂练习:按要求编写程序。

    5、DataSet对象的数据库操作

    DataSet对象的数据库操作需要将数据库先保存在内存的DataTable对象,然后在内存的数据表插入、删除和更新记录,最后使用DataAdpater对象更新数据表的记录数据。

    使用DataAdapter和DataSet访问数据库的典型步骤如下:

    (1)建立数据库连接;

    (2)建立DataAdapter对象;

    如:SqlDataAdapter objDataAdapter=new SqlDataAdapter(strsql,objCon);

    (3)建立DataSet对象填入记录数据;

    如:objDataAdapter.Fill(objDataSet,”Users”);

    (4)在DataTable中执行数据库操作;

    (5)更新数据表的记录数据。

    如:count=objDataAdapter.Update(objDataSet,”Users”)

    (6)关闭数据库连接

    DataSet对象使用DataAdapter对象来获取记录数据,它是DataSet和Connection对象数据源之间的桥梁,可以获取DataSet的记录数据和更新数据源的记录数据。

    如:

    SqlDataAdapter objadapter;

    sqlstr=“select * from userinfo”;

    objadapter=new SqlDataAdapter(sqlstr,objcon);

    SqlCommandBuilder objcmdbuilder =new SqlCommandBuilder(objadapter)

    ‘上述代码建立的对象配合Dataset,可自动生成所需的SQL命令

    DataAdapter的Fill方法使用DataAdapter的SelectCommand的结果集来填充DataSet。

    例如:

    SqlConnection con;

    con=new SqlConnection("Persist Security Info=False; Integrated Security=SSPI; database= Northwind; server=.SQLEXPRESS");

    con.Open();

    SqlDataAdapter adapter;

    adapter = new SqlDataAdapter("SELECT CustomerID, CompanyName FROM Customers", con);

    DataSet customers = new DataSet();

    adapter.Fill(customers, "Customers");

    使用DataAdapter的Fill方法填充DataSet中的DataTable后,以断开式操作DataSet的数据库表,包括数据的查询、插入、更新和删除等操作。

    在插入、更新或删除DataRow对象后,因为操作是针对保存在内存的DataSet对象,最后还需要更新数据源的记录数据。

    DataSet、DataTable、DataRow对象将数据库、数据表和记录转换成对象结构,DataSet数据库包含DataTableCollection集合对象,集合对象中的每一个DataTable是一个数据表,包含DataRowCollection集合对象,每一个DataRow是一条记录。

    调用DataAdapter的Update方法,可将DataSet中的更改解析回数据源。

    当调用Update方法时,DataAdapter将分析已作出的更改并执行相应的命令(INSERT、UPDATE或DELETE)。

    可以通过在设计时指定命令语法(使用SQL命令或存储过程)。

    DataSet对象插入新记录操作是针对DataTable对象,所谓插入记录就是新增加DataRow对象,如:

        DataRow objDataRow;

      objDataRow=objDataSet.Tables[“users”].NewRow();

    以上代码使用NewRow()方法新增加了一行,接着可以输入字段值,如:

        ObjDataRow[“name”]=tbname.Text;

        ……

    最后将DataRow对象添加到DataTable对象,如:

     objDataSet.Tables(“users”).Rows.Add(ObjDataRow);

    DataSet对象的更新记录操作,因为有更新条件,所以需要使用循环查找欲更新记录后,才能更新记录数据,如:

    foreach(DataRow objDataRow in objDataSet.Tables[“users”].Rows)

    {

      if(objDataRow[“UserName”]==tbusername.text)

      {

         objDataRow[“Password”]=tbpswd.text;

         ojbDataRow[“Email”]=tbemail.text;

      }

    }

    DataSet对象的删除记录操作,也因为有删除条件,所以需要使用循环查找欲删除记录后,用Delete()方法删除,如:

    foreach(DataRow objDataRow in objDataSet.Tables[“users”].Rows)

    {

      if(objDataRow[“UserName”]==tbusername.text)

         ojbDataRow.Delete();

    }

    数据表的记录数据填入DataSet对象后,就可以用for each循环从DataRowCollection集合对象取出每一个DataRow对象,如:

    foreach(DataRow objRow in objDataSet.Tables[“users”].Rows)

    {  Response.Write(“<tr>”);

      Response.Write(“<td>” + objRow[“name”] + “</td>”);

      Response.Write(“<td>” + objRow[“password”] + “</td>”);

      Response.write “</tr>”);

    }

    实例演示结合课堂练习讲解查询、增、删、改的实现。

    6、简单介绍5种数据源控件

    7、简单介绍数据源控件和数据控件的功能。。

    8、数据源控件的配置

    ProviderName属性设置为数据库类型(默认为 System.Data.SqlClient)

    ConnectionString属性设置为连接字符串,该字符串包含连接至数据库所需的信息。

    连接字符串的内容根据数据源控件访问的数据库类型的不同而有所不同。

    可为SqlDataSource命令指定四个SQL命令:SelectCommand、UpdateCommand、DeleteCommand和InsertCommand。

    对于每个命令属性而言,可以为SQL 语句,也可以在 SQL 语句的位置指定存储过程的名称。

    通过设置数据源控件的DataSourceMode属性,可以指定要返回的格式: DataSet或DataReader

    每个命令属性都有自己的参数集,可以使用声明的方式指定命令使用的参数。ASP.NET 2.0支持的参数类型包括:

    ControlParameter:从一个服务器控件的任何公共属性获得该参数值。

    CookieParameter:根据指定的HTTP cookie的内容设置参数值。

    FormParameter:从HTTP请求窗体的指定输入字段中获取该参数值。

    Parameter:获取由代码分配的参数值。

    ProfileParameter:从根据应用程序的个性化机制创建的配置文件对象中的指定属性获取该参数值。

    QueryStringParameter:从请求查询字符串中的指定变量获取该参数值。

    SessionParameter:根据指定的会话状态的内容设置该参数值。

    实例演示数据库的连接。

    9、数据绑定的概念和方法:

    数据绑定是将数据链接到显示该数据的控件的过程

    2、用于绑定控件的表达式置于 <%#......%> 标记之间

    ,数据绑定的方式有四种:

    (1)属性绑定:ASP.Net的数据绑定可以绑定到公共的变量、页面的属性乃至其他服务器端控件的属性上。但是应该注意的是,这些属性、公用变量一定要在使用DataBind()方法以前初始化,否则可能导致不可预知的错误。

    (2)集合绑定:作为数据源的还可以是集合对象,在asp.net中只要是支持Icollection接口的集合对象都可以作为列表服务器端控件。最常见的,我们使用数组(ArrayList)、哈希表(HashTable)、数据视图(DataView)、数据读写器(DataReader)等集合作为列表服务器端控件的数据源。

    (3)表达式绑定:除了使用固定的数据作为数据绑定的数据源以外,asp.net还提供了具有动态表达功能的表达式数据绑定,由于它是根据数据项和常数计算而来,因而提供的数据更加灵活、方便。

    (4)方法绑定:利用databinder.eval方法把指定的数据或者是表达式转换成所期望出现的数据类型。DataBinder.Eval含有三个参数,第一个是数据项的容器,对于常用的DataList、DataGrid、Reapter等控件,通常使用Container.DataItem;第二个参数是数据项名;第三个参数是要转换成的数据类型,如果省略就认为是返回该数据项的类型。使用方法绑定的目的通常都是和模板定义相结合产生一些特殊的效果。

    实例演示讲解数据绑定的方法。

    10、GridView控件的作用、设置方式和外观设置

    实例演示讲解

    使用GridView显示来往公司信息列表

    1、将GridView控件拖入页面。

    2、添加并指定数据源。

    3、编辑列,选择需要显示的字段,并可设置表头等。

    4、设置分页。

    5、运行,查看效果。

    可以设置的字段:

    BoundField字段

    表示数据绑定控件中作为文本显示的字段。

    可设置表头、样式等信息。

     DataFormatString,可设置显示字段的格式。

    TemplateField字段

    绑定中显示自定义内容的字段

    有五种模板(标头、脚注、普通项、交替项、编辑模式)

    Eval 方法是只读方法

    该方法采用数据字段的值作为参数并将其作为字符串返回。

    当对表达式操作时候,必须用Eval 如

    格式化

     Bind  方法支持读/ 写功能

     可以检索数据绑定控件的值并将任何更改提交回数据库。

    ButtonField字段

    显示为数据绑定控件中的按钮

    CommandName设置自定义命令(如:RowCommand)

    CommandField

    一个特殊字段,显示了用于在数据绑定控件中执行选择、编辑、插入或删除操作的命令按钮

    自动生成命令,无须手写

    对应数据源的增改查删方法

    HyperLinkField

    显示为超链接的字段

    比如链接到详细页面

    ImageField字段

    为图像的字段

    绑定到包含图像 URL 的数据源中的字段

    指定DataImageUrlField

    CheckBoxField字段

    以复选框显示的布尔型字段

    仅当数据源字段中有布尔型字段时使用此字段

    GridView控件可以通过关联的数据源自动完成更新和删除功能。例如,SqlDataSource控件在其UpdateCommand和DeleteCommand属性分别设置为有效的更新或删除命令。

    在GridView控件中,将AutoGenerateEditButton和AutoGenerateDeleteButton属性设置为True,可以启用其更新和删除功能。

    11、结合实例讲解用于显示详细信息的DetailsView控件。

    DetailsView用于一次从其关联的数据源呈现一条记录,同时可选择显示分页按钮,以在记录之间进行导航。

    DetailsView与Access数据库的窗体视图类似,通常用于更新已有的记录、插入新记录。

    该控件通常在主/详细信息方案中使用:主控件一般为GridView,明细记录则借助DetailsView控件来显示

    实例演示两个控件实现主/从信息查询编辑页。

    12、结合实例讲解DataList控件的使用。

    用于在重复的列表中显示数据项,并且支持对这些项进行选择和编辑。

    DataList中列表项的内容和布局是使用模板定义的,可以为项、交替项、选定项和编辑项创建模板;也可以使用标题、脚注和分隔符模板自定义DataList的整体外观

    DataList包括下列模板:

    ItemTemplate:定义列表中各项的内容和布局(必选定义)。

    AlternatingItemTemplate:定义交替项的内容和布局。如果未定义,则使用ItemTemplate。

    SeparatorTemplate:定义呈现在项之间的分隔符。如果未定义,则不呈现分隔符。

    SelectedItemTemplate:定义选定项的内容和布局。如果未定义,则使用ItemTemplate(AlternatingItemTemplate)。

    EditItemTemplate:定义编辑项的内容和布局。如果未定义,则使用ItemTemplate(AlternatingItemTemplate或SelectedItemTemplate)。

    HeaderTemplate:定义列表标题的内容和布局。如果未定义,则不呈现标题。

    FooterTemplate:定义列表页脚的内容和布局。如果未定义,则不呈现页脚。

    DataList的样式属性:

    ItemStyle:列表中各项的样式。

    AlternatingItemStyle:交替项的样式。

    SeparatorStyle:分隔标记的样式符。

    SelectedItemStyle:选定项的样式

    EditItemStyle:编辑项的样式

    HeaderStyle:列表标题的样式

    FooterStyle:列表页脚的样式

    DataList的与Select相关属性:

     SelectedIndex 获取或设置 DataList 控件中的选定项的索引。  

    SelectedItem 获取 DataList 控件中的选定项。  

    SelectedItemStyle 获取 DataList 控件中选定项的样式属性。  

    SelectedItemTemplate 获取或设置 DataList 控件中选定项的模板。  

    SelectedValue 获取所选择的数据列表项的键字段的值。

    DataList的与edit相关的属性:

    EditItemIndex 获取或设置 DataList 控件中要编辑的选定项的索引号。

    EditItemStyle 获取 DataList 控件中为进行编辑而选定的项的样式属性。

    EditItemTemplate 获取或设置 DataList 控件中为进行编辑而选定的项的模板。

    DataList的Repeat属性:

    RepeatColumns:表格分几列显示。

    RepeatDirection:显示方式是水平还是垂直。

    RepeatLayout:显示方式的版面配置是表格还是直线。

    事件:

    提供ItemCommand、EditCommand、UpdateCommand、DeleteCommand和CancelCommand等事件。

    当在DataList控件的ItemTemplate标记中单击LinkButton控件,就可以产生ItemCommand事件,LinkButton控件使用CommandName属性设置传递的命令名称:如下所示:

    <ItemTemplate>

         <asp:LinkButton …commandName=“select”/>

        …

      </Itemtemplate>

    当产生ItemCommand事件后,就执行如下代码:

      Sub DataList_ItemCommand(…)

          if e.commandname=“select” then

               ……

           end if

           ……

      End Sub

    13、结合实例讲解Repeater控件的使用。

    Repeater控件也用于在重复列表中显示数据项。

    Repeater中列表项的内容和布局是使用“模板”定义的,基本语法如下:

    <asp:Repeater Id=“repeater1” Runat=“server”>

        <HeaderTemplate>   </HeaderTemplate>

        <ItemTemplate>   </ItemTemplate>

        <AlternatingItemTemplate>

        </AlternatingItemTemplate>

        <FooterTemplate>  </FooterTemplate>

      </asp:Repeater>

    每个Repeater至少必须定义一个ItemTemplate。

    功能如同For/Next循环,配合HTML表格标记和数据源控件,可用表格来显示数据表的记录数据。

    分别在各模板标记中声明各种HTML标记实现数据的显示。

    也可不用表格显示,用<separatorTemplate>设置每一记录间用什么分隔,如<br/>或<hr/>

    取得记录项目编号:<%#container.itemindex%>

    如下例:

    <ItemTemplate>

                   <%#container.ItemIndex %>

                   <%#Eval("productid")%>

                  <%#Eval("ProductName")%>

                  <%#Eval("UnitPrice") %>

                  <%#Eval("UnitsInStock") %>  

    </ItemTemplate>

    <SeparatorTemplate>

    <br>

    </SeparatorTemplate>

    14、结合袜例讲解FormView控件的使用。

    与DetailsView控件类似,FormView控件用于一次从其关联的数据源呈现一条记录,同时可选择显示分页按钮,以在记录之间进行导航。

    但FormView控件要求用户使用模板定义每项的呈现,而不是使用数据控件字段。

    FormView控件提供最大限度的灵活性,但需要用户自己定义编码,一般用于高级自定义场合。

    FormView控件用DataList控件的Template模板标记来编排字段,如下:

    <asp:FormView Id=“form” Runat=“server”

         dataSourceID=“company”

         AllowPaging=“True”

         ……>

    <HeaderTemplate> </HeaderTemplate>

    <ItemTemplate> </ItemTemplate>

    <FooterTemplate> </FooterTemplate>

    </asp:FormView>

    FormView控件通过关联的数据源控件支持自动的Update、Insert和Delete操作。

    可同时定义ItemTemplate、

                EditItemTemplate

              和InsertItemTemplate,并设置有数据绑定的输入控件。为实现双向绑定,用<%#bind(“字段名”)%>,而不是<%#eval(“字段名”)%>

    FormView控件的DefaultMode属性指定以什么模板显示。

    默认为ReadOnly,即呈现ItemTemplate。

    也可设定为Edit,呈现EditItemTemplate,或设定Insert,呈现InsertItemTemplate。

    15、小结

    GridView控件与新的数据源控件系列紧密结合,自动提供常用的功能诸如分页、排序、编辑或删除数据。

    DetailsView控件呈现一条记录。 GridView/ DetailsView结合,可以实现主/详细信息方案。

    DataList控件用于在重复的列表中显示数据项,并且支持对这些项进行选择和编辑的功能。 DataList中列表项的内容和布局是使用模板定义的

    Repeater控件也用于在重复列表中显示数据项。Repeater没有内置的布局和样式,必须在控件的模板中显式声明所有HTML布局、格式设置和样式标记。

    FormView控件也用于一次从其关联的数据源呈现一条记录。FormView控件要求用户使用模板定义每项的呈现 。

    可以通过编写数据源控件公开事件处理程序,控制数据源对数据库的操作

  • 相关阅读:
    二分查找思路以及可能出现情况对应解决办法
    多线程知识点大纲
    服务器consul启动方法
    大白话带你认识 ZooKeeper !重要概念一网打尽!
    「Netty实战 02」手把手教你实现自己的第一个 Netty 应用!新手也能搞懂!
    从 BIO、NIO 聊到 Netty,最后还要实现个 RPC 框架!
    什么是P问题、NP问题和NPC问题
    期刊汇总
    Typora 使用
    TCA 复习
  • 原文地址:https://www.cnblogs.com/huangf714/p/5876226.html
Copyright © 2011-2022 走看看