JDBC連接池和DBUtils

来源:http://www.cnblogs.com/caigq/archive/2017/07/08/7049258.html
-Advertisement-
Play Games

C3P0連接池 創建C3P0連接池的工具類 * 連接的規範介面: * javax.sql.DataSource介面 * 介面的實現類對象 * ComboPooledDataSource * 成員位置創建ComboPooledDataSource對象 * 使用靜態代碼塊給ComboPooledData ...


C3P0連接池

創建C3P0連接池的工具類
* 連接的規範介面:
* javax.sql.DataSource介面
* 介面的實現類對象
* ComboPooledDataSource
* 成員位置創建ComboPooledDataSource對象
* 使用靜態代碼塊給ComboPooledDataSource設置4大數據量連接信息
* 創建一個靜態方法返回Connection對象
* 創建一個靜態方法釋放資源

 1 public class C3P0Utils {
 2     //成員位置創建ComboPooledDataSource對象
 3     private static ComboPooledDataSource dataSource = new ComboPooledDataSource();
 4     
 5     //使用靜態代碼塊給ComboPooledDataSource設置4大數據量連接信息
 6     static{
 7         try {
 8             dataSource.setDriverClass("com.mysql.jdbc.Driver");
 9             dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/mybase4");
10             dataSource.setUser("root");
11             dataSource.setPassword("root");
12         } catch (Exception e) {
13             throw new RuntimeException("設置連接信息失敗!");
14         }
15     }
16     
17     //創建一個靜態方法返回Connection對象
18     public static Connection getConnection(){
19         try {
20             return dataSource.getConnection();
21         } catch (SQLException e) {
22             throw new RuntimeException("獲取資料庫連接信息失敗!");
23         }
24     }
25     
26     //定義一個釋放資源的方法
27         public static void close(ResultSet rs,Statement stat,Connection conn){
28             if(rs!=null){
29                 try {
30                     rs.close();
31                 } catch (SQLException e) {
32                     e.printStackTrace();
33                 }
34             }
35             if(stat !=null){
36                 try {
37                     stat.close();
38                 } catch (SQLException e) {
39                     e.printStackTrace();
40                 }
41             }
42             if(conn != null){
43                 try {
44                     conn.close();
45                 } catch (SQLException e) {
46                     e.printStackTrace();
47                 }
48             }
49         }
50 }

創建讀取XML配置文件的C3P0工具類

 1 public class C3P0UtilsReadXML {
 2     //成員位置創建ComboPooledDataSource對象
 3     private static ComboPooledDataSource dataSource = new ComboPooledDataSource();
 4     
 5     //使用靜態代碼塊給ComboPooledDataSource設置4大數據量連接信息
 6     /*static{
 7         try {
 8             dataSource.setDriverClass("com.mysql.jdbc.Driver");
 9             dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/mybase4");
10             dataSource.setUser("root");
11             dataSource.setPassword("root");
12         } catch (Exception e) {
13             throw new RuntimeException("設置連接信息失敗!");
14         }
15     }*/
16     
17     //創建一個返回ComboPooledDataSource的方法
18     public static DataSource getDataSource(){
19         return dataSource;
20     }
21     
22     //創建一個靜態方法返回Connection對象
23     public static Connection getConnection(){
24         try {
25             return dataSource.getConnection();
26         } catch (SQLException e) {
27             throw new RuntimeException("獲取資料庫連接信息失敗!");
28         }
29     }
30     
31     //定義一個釋放資源的方法
32         public static void close(ResultSet rs,Statement stat,Connection conn){
33             if(rs!=null){
34                 try {
35                     rs.close();
36                 } catch (SQLException e) {
37                     e.printStackTrace();
38                 }
39             }
40             if(stat !=null){
41                 try {
42                     stat.close();
43                 } catch (SQLException e) {
44                     e.printStackTrace();
45                 }
46             }
47             if(conn != null){
48                 try {
49                     conn.close();
50                 } catch (SQLException e) {
51                     e.printStackTrace();
52                 }
53             }
54         }
55 }

DBCP連接池

創建DBCP連接池的工具類
* 連接的規範介面:
* javax.sql.DataSource介面
* 介面的實現類對象
* BasicDataSource
* 重寫getConnection方法

 1 public class DBCPUtils {
 2     //創建連接池的實現類對象
 3     private static BasicDataSource dataSource = new BasicDataSource();
 4     
 5     //設置連接資料庫的4大變數,使用BasicDataSource中的set方法設置
 6     static{
 7         //設置註冊的驅動信息
 8         dataSource.setDriverClassName("com.mysql.jdbc.Driver");
 9         //設置Url
10         dataSource.setUrl("jdbc:mysql://localhost:3306/mybase4");
11         //設置用戶名
12         dataSource.setUsername("root");
13         //設置密碼
14         dataSource.setPassword("root");
15         //可選信息
16         //dataSource.setInitialSize(100);
17         //dataSource.setMaxActive(1000);
18     }
19     
20     //創建獲取資料庫連接對象的方法
21     public static Connection getConnection(){
22         try {
23             return dataSource.getConnection();
24         } catch (SQLException e) {
25             throw new RuntimeException("獲取資料庫連接對象失敗");
26         }
27     }
28     
29     //定義一個釋放資源的方法
30     public static void  close(ResultSet rs,Statement stat,Connection conn){
31         if(rs!=null){
32             try {
33                 rs.close();
34             } catch (SQLException e) {
35                 e.printStackTrace();
36             }
37         }
38         if(stat !=null){
39             try {
40                 stat.close();
41             } catch (SQLException e) {
42                 e.printStackTrace();
43             }
44         }
45         if(conn != null){
46             try {
47                 conn.close();
48             } catch (SQLException e) {
49                 e.printStackTrace();
50             }
51         }
52     }
53 }

讀取配置文件的方式

 1 /*
 2  * 創建DBCP連接池工具類
 3  * 使用讀取配置文件的方式
 4  * DBCP中有一個工廠類BasicDataSourceFactory
 5  * 工廠類中有一個靜態方法
 6  * static DataSource createDataSource(Properties prop)
 7  * 此方法返回的就是DataSource介面的實現類對象BasicDataSource
 8  * 
 9  * 創建Propertis集合+IO技術讀取配置文件
10  * 把配置文件傳入BasicDataSourceFactory靜態方法createDataSource中
11  */
12 public class DBCPUtilsReadConfig {
13     //創建DataSource變數
14     private static DataSource dataSource;
15     
16     static{
17         try {
18             //創建Propertis集合+IO技術讀取配置文件
19             //使用類載入器,掃描包下的文件
20             InputStream is = DBCPUtilsReadConfig.class.getClassLoader()
21                     .getResourceAsStream("dbcpconfig.properties");
22             //創建Propertis集合
23             Properties prop = new Properties();
24             prop.load(is);
25             //把配置文件傳入BasicDataSourceFactory靜態方法createDataSource中
26             dataSource = BasicDataSourceFactory.createDataSource(prop);
27         } catch (Exception e) {
28             throw new RuntimeException("讀取配置文件失敗");
29         }
30     }
31     
32     //創建獲取資料庫連接對象的方法
33     public static Connection getConnection(){
34         try {
35             return dataSource.getConnection();
36         } catch (SQLException e) {
37             throw new RuntimeException("獲取資料庫連接對象失敗");
38         }
39     }
40     
41     //定義一個釋放資源的方法
42     public static void  close(ResultSet rs,Statement stat,Connection conn){
43         if(rs!=null){
44             try {
45                 rs.close();
46             } catch (SQLException e) {
47                 e.printStackTrace();
48             }
49         }
50         if(stat !=null){
51             try {
52                 stat.close();
53             } catch (SQLException e) {
54                 e.printStackTrace();
55             }
56         }
57         if(conn != null){
58             try {
59                 conn.close();
60             } catch (SQLException e) {
61                 e.printStackTrace();
62             }
63         }
64     }
65 }


* 使用DBUtils工具類對資料庫表進行增刪改查
* DBUtils工具類作用:簡化JDBC的開發(6步)
*
* DBUtils有3個核心類
* 1.QueryRunner:使用QueryRunner中的方法對資料庫進行增刪改查
* 2.DbUtils:提供了大量的釋放資源的方法
* 3.ResultSetHandler介面:提供了處理查詢結果集的方法
*
* QueryRunner類
* 構造方法:
* QueryRunner() 空參數構造方法
* 調用更新和查詢方法的時候,需要傳入Connection對象
* QueryRunner(DataSource ds) 帶DataSource資料庫連接池的構造方法
* 調用更新和查詢方法的時候QueryRunner會自動從DataSource實現類對象中獲取資料庫連接對象,使用完畢會自動歸還
* 成員方法:
* 執行執行增刪改的成員方法
* int update(Connection conn, String sql, Object... params)用來執行增刪改的SQL
* int update(String sql, Object... params) 用來執行增刪改的SQL
* 參數:
* Connection conn:資料庫連接對象
* String sql:拼接的sql語句,可以使用?占位符
* Object... params:?占位符的實際參數,可以使用Object[]
* 返回值:
* int:執行的有效行數
* 執行執行查詢的成員方法
* <T> T query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params)
* <T> T query(String sql, ResultSetHandler<T> rsh, Object... params)
* 參數:
* Connection conn:資料庫連接對象
* String sql:拼接的sql語句,可以使用?占位符
* Object... params:?占位符的實際參數,可以使用Object[]
* ResultSetHandler<T> rsh:用來存儲查詢之後的結果集,可以傳入ResultSetHandler9種實現類對象
* 返回值:
* <T> T:傳入的ResultSetHandler實現類不同,返回的結果集也不同,使用泛型,傳入什麼結果集,就返回對應的類型

 1 public class Demo01DBUtils {
 2     //創建QueryRunner對象,構造方法中傳入連接池的實現類對象
 3     QueryRunner qr = new QueryRunner(C3P0UtilsReadXML.getDataSource());
 4     
 5     /*
 6      * 使用QueryRunner,對資料庫表進行刪除數據
 7      */
 8     @Test
 9     public void delete(){
10         try {
11             //拼接增加的sql語句
12             String sql = "DELETE FROM category WHERE cid=?";
13             //調用QueryRunner中update方法執行sql語句
14             //創建對象數據,儲存?占位符的實際參數
15             //Object[] parmars = {"洗",10};
16             int row = qr.update(sql, 7);
17             System.out.println(row);
18         } catch (Exception e) {
19             System.out.println(e);
20         }
21     }
22     
23     /*
24      * 使用QueryRunner,對資料庫表進行修改數據
25      */
26     @Test
27     public void update(){
28         try {
29             //拼接增加的sql語句
30             String sql = "UPDATE category SET cname=? WHERE cid=?";
31             //調用QueryRunner中update方法執行sql語句
32             //創建對象數據,儲存?占位符的實際參數
33             Object[] parmars = {"洗",10};
34             int row = qr.update(sql, parmars);
35             System.out.println(row);
36         } catch (Exception e) {
37             System.out.println(e);
38         }
39     }
40     
41     /*
42      * 使用QueryRunner,對資料庫表進行增加(插入)數據
43      */
44     @Test
45     public void insert(){
46         try {
47             //拼接增加的sql語句
48             String sql = "INSERT INTO category(cname) VALUES(?)";
49             //調用QueryRunner中update方法執行sql語句
50             int row = qr.update(sql, "玩具");
51             System.out.println(row);
52         } catch (Exception e) {
53             System.out.println(e);
54         }
55     }
56 }

使用QueryRunner對資料庫表進行查詢的九種查詢方式

  1 /*
  2  * 使用QueryRunner對資料庫表進行查詢
  3  * <T> T query(String sql, ResultSetHandler<T> rsh, Object... params)    
  4  */
  5 public class Demo02DBUtils {
  6     //創建QueryRunner對象,構造方法中傳入資料庫連接池的實現類
  7     QueryRunner qr = new QueryRunner(C3P0UtilsReadXML.getDataSource());
  8     
  9     /*
 10      * 第九種查詢方式:使用KeyedHandler(Map嵌套Map)
 11      * KeyedHandler會把結果集的每一行數據封裝到Map集合中
 12      *     key:字元串類型列名
 13      *     value:列名對應的值(不同的列,數據類型不同,value使用Object類型)
 14      * 多個Map集合存儲到另外一個Map集合中
 15      *     key:指定的字元串列名,不指定則預設使用第一列
 16      *     value:傳入存儲每行數據的Map集合
 17      * 
 18      * 構造方法:
 19      *     KeyedHandler() 不指定列名
 20      *     KeyedHandler(int columnIndex) 指定列號1,2,3,4
 21      *     KeyedHandler(String columnName) 指定字元串格式列名
 22      */
 23     @Test
 24     public void keyedHandler(){
 25         try {
 26             //拼接sql語句
 27             String sql = "SELECT * FROM category";
 28             //調用QueryRunner中的query方法,結果集使用KeyedHandler
 29             //Map<Object,Map<String,Object>> mapmap = qr.query(sql, new KeyedHandler("cid"));
 30             Map<Object,Map<String,Object>> mapmap = qr.query(sql, new KeyedHandler("cname"));
 31             //遍歷Map集合取出存儲每一行數據的Map集合
 32             for (Object obj: mapmap.keySet()) {
 33                 //根據key取出值存儲每一行數據的Map集合
 34                 Map<String,Object> map = mapmap.get(obj);
 35                 //遍歷Map集合
 36                 for(String key : map.keySet()){
 37                     System.out.print(obj+":"+key+"..."+map.get(key)+"\t");
 38                 }
 39                 //列印完每一行數據之後換行
 40                 System.out.println();
 41             }
 42         } catch (Exception e) {
 43             System.out.println(e);
 44         }
 45     }
 46     
 47     /*
 48      * 第八種查詢方式:使用ScalarHandler(重點)
 49      * ScalarHandler用於執行返回單個數據的sql語句
 50      * 使用聚合函數查詢的結果都是單個數據
 51      * 或者查詢某一行的某一個欄位
 52      */
 53     @Test
 54     public void scalarHandler(){
 55         try {
 56             //拼接sql語句
 57             String sql = "SELECT SUM(cid) FROM category";
 58             sql = "SELECT cname FROM category WHERE cid=?";
 59             //調用QueryRunner中的query方法,結果集使用ScalarHander
 60             //返回的值的數據類型不確定,使用Object類型
 61             Object obj = qr.query(sql, new ScalarHandler(),2);
 62             System.out.println(obj);
 63         } catch (Exception e) {
 64             System.out.println(e);
 65         }
 66     }
 67     
 68     /*
 69      * 第七種查詢方式:使用MapListHandler
 70      * 1.MapListHandler會把多條數據,存儲到多個Map集合中
 71      *     key:字元串類型列名
 72      *     value:列名對應的值(不同的列,數據類型不同,value使用Object類型)
 73      * 2.會把多個Map集合存儲List集合中
 74      */
 75     @Test
 76     public void mapListHandler(){
 77         try {
 78             //拼接查詢sql語句
 79             String sql = "SELECT * FROM category";
 80             //調用QueryRunner中的query方法執行查詢sql語句,結果集傳入MapListHandler
 81             List<Map<String,Object>> list = qr.query(sql, new MapListHandler());
 82             //遍歷List集合,取出Map集合
 83             for (Map<String, Object> map : list) {
 84                 //遍歷Map集合
 85                 for(String key: map.keySet()){
 86                     System.out.print(key+"..."+map.get(key)+"\t");
 87                 }
 88                 System.out.println();//列印完每行數據之後換行
 89             }
 90         } catch (Exception e) {
 91             System.out.println(e);
 92         }
 93     }
 94     
 95     /*
 96      * 第六種查詢方式:使用MapHandler
 97      * MapHandler把結果集的第一行數據存儲Map集合中
 98      *     key:字元串類型列名
 99      *     value:列名對應的值(不同的列,數據類型不同,value使用Object類型)
100      */
101     @Test
102     public void mapHandler(){
103         try {
104             //拼接查詢sql語句
105             String sql = "SELECT * FROM category";
106             //調用QueryRunner中的query方法執行查詢sql語句,結果集傳入MapHandler
107             Map<String,Object> map = qr.query(sql, new MapHandler());
108             //使用keySet遍歷Map集合
109             Set<String> set = map.keySet();
110             for (String key : set) {
111                 //通過key使用get方法獲取value
112                 Object value = map.get(key);
113                 System.out.print(key+"..."+value+" ");
114             }
115         } catch (Exception e) {
116             System.out.println(e);
117         }
118     }
119     
120 
121     /*
122      * 第五種查詢方式:使用ColumnListHandler
123      * ColumnListHandler會把結果集中指定列的數據封裝到一個List集合中
124      * 如果不指定列,則預設使用第一列數據存儲到List集合中
125      * ColumnListHandler() 
126      * ColumnListHandler(int columnIndex) 列號1,2,3,4
127      * ColumnListHandler(String columnName) 列名
128      */
129     @Test
130     public void columnListHandler(){
131         try {
132             //拼接查詢sql語句
133             String sql = "SELECT * FROM category";
134             //調用QueryRunner中的query方法執行查詢sql語句,結果集傳入ColumnListHandler
135             //返回一個List集合,因為列的數據類型不同,所有元素使用Object類型
136             List<Object> list = qr.query(sql, new ColumnListHandler("cname"));
137             for (Object object : list) {
138                 System.out.println(object);
139             }
140         } catch (Exception e) {
141             System.out.println(e);
142         }
143     }
144     
145     /*
146      * 第四種查詢方式:使用BeanListHandler(重點)
147      * BeanListHandler會把多個條數據封裝到多個JavaBean對象中
148      * 多個JavaBean對象存儲到List集合中
149      * 
150      * 註意:
151      *      JavaBean中必須有空參數構造方法
152      */
153     @Test
154     public void beanListHandler(){
155         try {
156             //拼接查詢sql語句
157             String sql = "SELECT * FROM category";
158             //調用QueryRunner中的query方法執行查詢sql語句,結果集傳入BeanListHandler
159             List<Category> list = qr.query(sql, new BeanListHandler<>(Category.class));
160             //遍歷存儲Category的list集合
161             for (Category category : list) {
162                 System.out.println(category);
163             }
164         } catch (Exception e) {
165             System.out.println(e);
166         }
167     }
168     
169     /*
170      * 第三種查詢方式:使用BeanHandler(重點)
171      * BeanHandler會把結果集的第一條數據,封裝到指定的JavaBean對象中
172      * 構造方法:
173      *     BeanHandler(Class<T> type) 傳遞JavaBean對象的class文件對象
174      *         BeanHandler內部會根據傳遞的class文件對象使用反射技術創建JavaBean對象,把查詢的結果集中第一行數據存儲到JavaBean中
175      *     相當於
176      *         Category c = new Category();
177      *         c.setXXX(xxx);
178      *         c.setXXX(xxx);
179      *         c.setXXX(xxx);
180      *  註意:
181      *      JavaBean中必須有空參數構造方法
182      */
183     @Test
184     public void beanHandler(){
185         try {
186             //拼接查詢sql語句
187             String sql = "SELECT * FROM category";
188             //調用QueryRunner中的query方法執行查詢sql語句,結果集傳入BeanHandler
189             Category cate = qr.query(sql, new BeanHandler<>(Category.class));
190             System.out.println(cate);
191         } catch (Exception e) {
192             System.out.println(e);
193         }
194     }
195     
196     /*
197      * 第二種查詢方式:使用ArrayListHandler
198      * ArrayListHandler中會把多條結果封裝到多個對象數組中
199      * 一個對象數組封裝一行數據
200      * 多個對象數組需要存儲到list集合中
201      */
202     @Test
203     public void arrrayListHandler(){
204         try {
205             //拼接查詢sql語句
206             String sql = "SELECT * FROM category where cid = ?";
207             sql = "SELECT * FROM category where cid in(?,?)";
208             //調用QueryRunner中的query方法執行查詢sql語句,傳入ArrayListHandler結果集
209       

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 原創作品,可以轉載,但是請標註出處地址:http://www.cnblogs.com/V1haoge/p/7136575.html 1、Calendar概述 Java官方推薦使用Calendar來替換Date的使用,Calendar與Date之間可以自由的進行轉換,轉換的紐帶是time,使用Cale ...
  • 前提: python操作excel需要使用的模塊有xlrd、xlwt、xlutils。對excel進行讀、寫、更新操作。操作excel時需要先導入這些模塊,demo如下: excel-讀操作知識點: excel數據格式如下: excel - 寫操作知識點: excel寫入 新的excel後,數據格式 ...
  • n個數,求最小區間覆蓋著n個數中所有的不相同的數字。 解題思路: AC代碼: ...
  • java 企業網站源碼 前後臺都有 靜態模版引擎, 代碼生成器大大提高開發效率 前臺: 支持三套模版, 可以在後臺切換 系統介紹: 1.網站後臺採用主流的 SSM 框架 jsp JSTL,網站後臺採用freemaker靜態化模版引擎生成html 2.因為是生成的html,所以訪問速度快,輕便,對服務 ...
  • 如何使用自定義字體 如何使用自定義字體 在講icon font之前,首先先來看看普通自定義字體是如何在ios中使用的,兩個原理是一樣的。這裡以KaushanScript-Regular為例: Step 1: 導入字體文件 將字體文件拖入項目(ios支持的字體格式有:.ttf、.otf,其他格式不確定 ...
  • 下載Charles Proxy v4.1.1版本,百度雲盤下載 或 去官網下載 Mac版本安裝後要先打開Charles一次,Windows版可以忽略此步驟 在這個網站(http://charles.iiilab.com/)下載破解文件 charles.jar 替換掉原文件夾里的charles.jar... ...
  • GCD 是一種非常方便的使用多線程的方式。通過使用 GCD,我們可以在確保儘量簡單的語法的前提下進行靈活的多線程編程。在 “複雜必死” 的多線程編程中,保持簡單就是避免錯誤的金科玉律。然而,GCD不像NSOperation那樣可以調用 -(void)cancel 取消一個操作的執行(註意這裡的取消只 ...
  • 測試CocoaPods是否安裝成功: 在終端輸: pod search + 開源類庫的名字 如: 若安裝成功會出現下圖所示: 如果安裝失敗,點擊回車後會報一行紅色錯誤,一般遇到這種情況最笨的辦法就是重新安裝。 簡單實用創建一個CocoaPods 1)在桌面上創建一個工程Demo(以Xcode7.3. ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...