mybatis教程(二):概念總結

来源:https://www.cnblogs.com/Lemon-i/archive/2018/01/31/8393537.html
-Advertisement-
Play Games

一、註意規範 註意:(1).XXXmapper.xml 文件中的 namespace 等於mapper 介面地址 (2).XXXmapper.java 介面中的方法輸入參數和 mapper.xml 中statement的parameterType指定的 類型一致。 (3) .mapper.java ...


一、註意規範

註意:(1).XXXmapper.xml 文件中的 namespace 等於mapper 介面地址

           (2).XXXmapper.java 介面中的方法輸入參數和 mapper.xml 中statement的parameterType指定的  類型一致。

           (3) .mapper.java 介面中的方法的返回值類型和mapper.xml中statement的resultType指定的類型一致

 

二、配置文件及標簽介紹

1. properties 介紹

可以將數據連接單獨配置在 db.properties 中改善硬編碼,其他配置文件引用該文件。內容示例:

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.username=root
jdbc.password=root

 

2.核心配置 SqlMapConfig.xml 標簽介紹

標簽種類:

        1. properties(屬性)

<!-- 載入資料庫文件db.properties -->
<properties resource="db.properties">
    <!-- 
            properties中還可以配置一些屬性名和屬性值,此處的優先載入 
            讀取完此標簽內再讀取其他文件。如果有同名屬性,則會被讀取文件中的覆蓋
    -->
    <!-- <property name="driver" value=""/> -->
</properties>

      2. settings(全局配置參數): 可以調整一些運行參數:開啟二級緩存、開啟延遲載入等。會影響mybatis的運動行為

      3. typeAiases(類型別名):指定輸入輸出類型較不方便,可以針對 parameterType、resourceType 指定的類型定義一些別名

      3.1 預設支持的別名

別名 _byte _long _short _int _integer _double _float _boolean string byte
類型 byte long short int int doouble float boolean String Byte
別名 long short int integer double float boolean data decimal bigdecimal
類型 Long Short Integer Integer Double Float Boolean Data BigDecimal BigDecimal

      3.2 自定義別名

<!-- 針對單個別名定義 type:類型的路徑; alias:別名 -->
<typeAliases>
        <typeAlias type="com.mybatis.entity.User" alias="user"/>
</typeAliases>

<select id="findUserById" parameterType="int" resultType="user" >
      select * from t_user where id=#{id}
</select>


<!-- 批量別名的定義:
        package:指定包名,mybatis會自動掃描包中的pojo類,自動定義別名,別名就是類名(首字母大寫或小寫都可以)
 -->
<typeAliases>
         <package name="com.mybatis.entity"/>
         <package name="其它包"/>
 </typeAliases>

        4. typeHandlers(類型處理器):完成 jdbc 類型和 java 類型的轉換

        5. objectFactory(對象工廠)

        6. plugins(插件)

        7. environments(環境集合屬性對象)mappers(映射器)

                 7.1 environment (環境子屬性對象)

                 7.2 transactionManager(事務管理)

                7.3 datasource(數據源)

<!-- 和spring整合後 environments配置將廢除-->
<environments default="development">
    <environment id="development">
        <!-- 使用jdbc事務管理,事務控制由mybatis管理-->
        <transactionManager type="JDBC" />
        <!-- 資料庫連接池,由mybatis管理-->
        <dataSource type="POOLED">
                 <property name="driver" value="${jdbc.driver}" />
                <property name="url" value="${jdbc.url}" />
                <property name="username" value="${jdbc.username}" />
                <property name="password" value="${jdbc.password}" />
         </dataSource>
    </environment>
</environments>

        8.mapper(映射器)

<!-- 載入映射文件 -->
<mappers>

    <!--  通過resource方法一次載入一個映射文件  -->
        <mapper resource="sqlmap/User.xml"/>
        <mapper resource="mapper/UserMapper.xml"/>


    <!--   通過mapper介面載入單個映射配置文件
           需要將mapper介面類名和mapper.xml映射文件名稱保持一致,且在一個目錄中
      -->
         <mapper class="com.mybatis.mapper.UserMapper"/> 


    <!-- 批量載入映射配置文件,mybatis自動掃描包下麵的mapper介面進行載入
           需要將mapper介面類名和mapper.xml映射文件名稱保持一致,且在一個目錄中;
            上邊規範的前提是:使用的是mapper代理方法;
      -->
         <package name="com.mybatis.mapper"/> 

</mappers>

 

三、輸入、輸出 映射

1.輸入映射:通過 parameterType 指定輸入參數的類型,類型可以是簡單類型、hashmap、pojo的包裝類型

        如需要查詢的條件較複雜,可以使用自定義的包裝類型 pojo ,將複雜的查詢條件包含進去

1.1 複雜的包裝類 UserQueryVo 示例

public class UserQueryVo {

     //這裡包裝其它的查詢條件
     //用戶查詢條件
     private UserCustom userCustom;
 

     public UserCustom getUserCustom() {
         return userCustom;
     }
 
     public void setUserCustom(UserCustom userCustom) {
         this.userCustom = userCustom;
     }
 
 }

 

1.2 再複雜一下 UserCustom.java 示例

public class UserCustom extends User{
    //可以擴展用戶的信息
}

 

1.3 配置文件 UserMapper.xml 定義綜合查詢示例

<!-- 模擬包裝類型組合查詢 
    #{userCustom.sex}:取出pojo包裝對象中性別值
    ${userCustom.username}:取出pojo對象中姓名值
-->
    <select id="findUserList" parameterType="com.mybatis.entity.UserQueryVo" 
         resultType="com.mybatis.entity.UserCustom">
        where sex=#{userCustom.sex} and username LIKE '%${userCustom.username}%'
    </select>

 

1.4 UserMapper.java 示例

public interface UserMapper {
    // 用戶信息綜合查詢
    public List<UserCustom> findUserList(UserQueryVo userQueryVo);
}

 

1.5  Junit 測試代碼

 1 ackage com.mybatis.dao.test;
 2 
 3 import java.io.InputStream;
 4 import java.util.Date;
 5 import java.util.List;
 6 
 7 import org.apache.ibatis.io.Resources;
 8 import org.apache.ibatis.session.SqlSession;
 9 import org.apache.ibatis.session.SqlSessionFactory;
10 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
11 import org.junit.Before;
12 import org.junit.Test;
13 
14 import com.mybatis.entity.User;
15 import com.mybatis.entity.UserCustom;
16 import com.mybatis.entity.UserQueryVo;
17 import com.mybatis.mapper.UserMapper;
18 
19 public class UserMapperTest {
20 
21     private SqlSessionFactory sqlSessionFactory;
22 
23     // 此方法是在執行findUserByIdTest之前執行
24     @Before
25     public void setUp() throws Exception {
26         String resource = "SqlMapConfig.xml";
27         InputStream inputStream = Resources.getResourceAsStream(resource);
28         // 創建SqlSessionFcatory
29         sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
30     }
31     
32     @Test
33     public void testFindUserList() {
34         SqlSession sqlSession = sqlSessionFactory.openSession();
35         //創造查詢條件
36         UserQueryVo userQueryVo = new UserQueryVo();
37         UserCustom userCustom = new UserCustom();
38         userCustom.setSex("2");
39         userCustom.setUsername("小");
40         userQueryVo.setUserCustom(userCustom);
41         // 創建Usermapper對象,mybatis自動生成mapper代理對象
42         UserMapper mapper = sqlSession.getMapper(UserMapper.class);
43         List<UserCustom>list=mapper.findUserList(userQueryVo);
44         System.out.println(list);
45         sqlSession.commit();
46         sqlSession.close();
47     }
48 }
UserMapperTest

 

 

2.輸出映射:只有查詢出來的列名和pojo中的屬性名一致,該列才可以映射成功

    (如果查詢出來的列名和 pojo 中屬性名只要有一個一致,就會創建 pojo 對象,只有全部不一樣才會不創建對象)

2.1 輸出簡單類型:只有輸出的結果只有一行一列才可以使用

2.1.1 UserMapper.xml 

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!-- 用戶信息綜合查詢總數
     parameterType:指定輸入類型,和findUserList一致。
     resultType:輸出結果類型.    
  -->
<mapper namespace="com.mybatis.mapper.UserMapper">
    <select id="findUserCount" parameterType="com.mybatis.entity.UserQueryVo" resultType="int">
        select count(*) from t_user where  sex=#{userCustom.sex} and username like '%${userCustom.username}%'
    </select>
</mapper>

 

2.1.2 UserMapper.java

 public interface UserMapper {
     //用戶信息綜合查詢總數
     public int findUserCount(UserQueryVo userQueryVo);
 }

 

2.1.3 junit 測試

 1 package com.mybatis.dao.test;
 2 
 3 import java.io.InputStream;
 4 import java.util.Date;
 5 import java.util.List;
 6 
 7 import org.apache.ibatis.io.Resources;
 8 import org.apache.ibatis.session.SqlSession;
 9 import org.apache.ibatis.session.SqlSessionFactory;
10 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
11 import org.junit.Before;
12 import org.junit.Test;
13 
14 import com.mybatis.entity.User;
15 import com.mybatis.entity.UserCustom;
16 import com.mybatis.entity.UserQueryVo;
17 import com.mybatis.mapper.UserMapper;
18 
19 public class UserMapperTest {
20 
21     private SqlSessionFactory sqlSessionFactory;
22 
23     // 此方法是在執行findUserByIdTest之前執行
24     @Before
25     public void setUp() throws Exception {
26         String resource = "SqlMapConfig.xml";
27         InputStream inputStream = Resources.getResourceAsStream(resource);
28         // 創建SqlSessionFcatory
29         sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
30     }
31     
32     @Test
33     public void findUserCountTest() {
34         SqlSession sqlSession = sqlSessionFactory.openSession();
35         //創造查詢條件
36         UserQueryVo userQueryVo = new UserQueryVo();
37         UserCustom userCustom = new UserCustom();
38         userCustom.setSex("2");
39         userCustom.setUsername("小");
40         userQueryVo.setUserCustom(userCustom);
41         // 創建Usermapper對象,mybatis自動生成mapper代理對象
42         UserMapper mapper = sqlSession.getMapper(UserMapper.class);
43         int count=mapper.findUserCount(userQueryVo);
44         System.out.println(count);
45         sqlSession.commit();
46         sqlSession.close();
47     }
48 }
UserMapperTest

 

2.2 輸出 pojo 對象和 pojo 列表:單個或列表,在 mapperType 類型是一樣的,在 mapper.java 中返回值不一樣

2.2.1 方法返回值區別示例

 public interface UserMapper {
    
     /** 根據ID查詢用戶信息 */
    // 返回單個
     public User findUserById(int id);

     /** 根據用戶名稱模糊查詢用戶信息 */
    // 返回列表
     public List<User> findUserByName(String username);

 }

 

2.2.2 使用 resoultMap 作為輸出映射類型

        定義 resoultMap

<?xml version="1.0" encoding="UTF-8" ?>
 <!DOCTYPE mapper
 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  <!-- namespace命名空間,作用就是對sql進行分類化的管理,理解為sql隔離
    註意:使用mapper代理開發時,namespace有特殊作用,namespace等於mapper介面地址
  -->
   <!-- 用戶信息綜合查詢總數
     parameterType:指定輸入類型,和findUserList一致。
      resultType:輸出結果類型.    
   -->
 <mapper namespace="com.mybatis.mapper.UserMapper">
 <!-- 定義resultMap 
     select id id_,username username_ from t_user和User類中的屬性作為一個映射關係
    type:resultMap最終映射的java對象類型,可以使用別名;
     id:對resultMap的唯一標識
 -->
 <resultMap type="user" id="userResultMap">
     <!--id表示查詢結果中的唯一標識,
         column:查詢出來的列名
         property:type指定的pojo類型中的屬性名
        最終resultMap對column和property作一個映射關係(對應關係)
      -->
     <id column="id_" property="id"/>
     <!--result:表示對普通列名的映射,
        column:查詢出來的列名
       property:type指定的pojo類型中的屬性名
         最終resultMap對column和property作一個映射關係(對應關係)
       -->
     <result column="username_" property="username"/>
 </resultMap>
 </mapper>

 

        使用 resoultMap 

<!-- 使用resultMap作為輸出映射
    resultMap:指定定義的resultMap的id,如果這個resultMap在其它的mapper.xml文件中,前邊需要添加namespace命名空間
 -->
<select id="findUserByIdResultMap" parameterType="int" resultMap="userResultMap" >
    select id id_,username username_ from t_user where id=#{id}
</select>

 

        UserMapper.java示例

public interface UserMapper {

    /** 根據ID查詢用戶信息,使用resultMap進行輸出 */
    public User findUserByIdResultMap(int id);
}

 

        Junit 測試示例

 1 package com.mybatis.dao.test;
 2 
 3 import java.io.InputStream;
 4 import java.util.Date;
 5 import java.util.List;
 6 
 7 import org.apache.ibatis.io.Resources;
 8 import org.apache.ibatis.session.SqlSession;
 9 import org.apache.ibatis.session.SqlSessionFactory;
10 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
11 import org.junit.Before;
12 import org.junit.Test;
13 
14 import com.mybatis.entity.User;
15 import com.mybatis.entity.UserCustom;
16 import com.mybatis.entity.UserQueryVo;
17 import com.mybatis.mapper.UserMapper;
18 
19 public class UserMapperTest {
20 
21     private SqlSessionFactory sqlSessionFactory;
22 
23     // 此方法是在執行findUserByIdTest之前執行
24     @Before
25     public void setUp() throws Exception {
26         String resource = "SqlMapConfig.xml";
27         InputStream inputStream = Resources.getResourceAsStream(resource);
28         // 創建SqlSessionFcatory
29         sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
30     }
31     
32     @Test
33     public void testFindUserByIdResultMap() {
34         SqlSession sqlSession = sqlSessionFactory.openSession();
35         // 創建Usermapper對象,mybatis自動生成mapper代理對象
36         UserMapper mapper = sqlSession.getMapper(UserMapper.class);
37         User user = mapper.findUserByIdResultMap(1);
38         System.out.println(user);
39         sqlSession.close();
40     }
41 }
UserMapperTest

 

2.3 用 resultType 進行輸出映射時,只有查詢出來的列名和 pojo 中的屬性名一致,該列才可以映射成功。如果不一致,可以通過定義一個 resultType 對列名和 pojo 屬性名之間作為一個映射關係

 

四、

1.動態SQL:mybatis核心對sql語句進行靈活操作,通過表達式進行判斷,對SQL進行拼接、組裝

        UserMapper.xml、Junit測試代碼示例:

 1 <!-- 用戶信息綜合查詢 
 2     #{userCustom.sex}:取出pojo包裝對象中性別值
 3     ${userCustom.username}:取出pojo對象中用戶名稱
 4 -->
 5     <select id="findUserList" parameterType="com.mybatis.entity.UserQueryVo" 
 6     resultType="com.mybatis.entity.UserCustom">
 7         select * from t_user 
 8         <!-- 動態sql查詢:where可以自動去掉第一個and -->
 9         <where>
10             <if test="userCustom!=null">
11                 <if test="userCustom.sex!=null and userCustom.sex!='' ">
12                     and sex=#{userCustom.sex}
13                 </if>
14                 <if test="userCustom.username!=null and userCustom.username!='' ">
15                     and username=#{userCustom.username}
16                 </if>
17             </if>
18         </where>
19 <!--          where sex=#{userCustom.sex} and username LIKE '%${userCustom.username}%' -->
20     </select>
UserMapper.xml

 

 1 @Test
 2     public void testFindUserList() {
 3         SqlSession sqlSession = sqlSessionFactory.openSession();
 4         //創造查詢條件
 5         UserQueryVo userQueryVo = new UserQueryVo();
 6         UserCustom userCustom = new UserCustom();
 7 //        userCustom.setSex("2");
 8         //這裡使用動態sql,如果不設置某個值,條件不會拼接sql中
 9         userCustom.setUsername("小");
10         userQueryVo.setUserCustom(userCustom);
11         // 創建Usermapper對象,mybatis自動生成mapper代理對象
12         UserMapper mapper = sqlSession.getMapper(UserMapper.class);
13         List<UserCustom>list=mapper.findUserList(userQueryVo);
14         //測試動態sql,屬性的非空判斷測試
15 //        List<UserCustom>list=mapper.findUserList(null);
16         System.out.println(list);
17         sqlSession.commit();
18         sqlSession.close();
19     }
testFindUserList

 

 

2. SQL片段:抽取動態sql,組成一個sql片段,方便重覆調用

2.1 定義sql片段

<!-- 定義sql片段,Id是唯一標識
         建議:是基於單表來定義sql片段,這樣的話sql片段的可重用性才高,在sql片段中不要包含where
     -->
    <sql id="query_user_where" >
        <if test="userCustom!=null">
                <if test="userCustom.sex!=null and userCustom.sex!='' ">
                    and sex=#{userCustom.sex}
                </if>
               <if test="userCustom.username!=null and userCustom.username!='' ">
                    and username=#{userCustom.username}
                </if>
            </if>
    </sql>

 

2.2 在 mapper.xml 中定義的 statement 中引用sql片段

<!-- 用戶信息綜合查詢 
    #{userCustom.sex}:取出pojo包裝對象中性別值
    ${userCustom.username}:取出pojo對象中用戶名稱
-->
    <select id="findUserList" parameterType="com.mybatis.entity.UserQueryVo" 
    resultType="com.mybatis.entity.UserCustom">
        select * from t_user 
        <!-- 動態sql查詢:where可以自動去掉第一個and -->
        <where>
        <!-- 引用sql片段的id,如果refid指定的不在本mapper.xml中,需要前邊加namespace -->
            <include refid="query_user_where"></include>
            <!-- 這裡可以引用其它的sql片段 -->
        </where>
    </select>

 

 

3. foreach:向 sql 傳遞數組或 list 時,mybatis 使用 foreach 解析

3.1 傳入多個id的

 1 package com.mybatis.entity;
 2 
 3 import java.util.List;
 4 
 5 /**
 6  * 
 7  * @ClassName: UserQueryVo
 8  * @Description: TODO(包裝類型)
 9  * @author warcaft
10  * 
11  */
12 public class UserQueryVo {
13 
14     public List<Integer> ids;
15 
16     public List<Integer> getIds() {
17         return ids;
18     }
19 
20     public void setIds(List<Integer> ids) {
21         this.ids = ids;
22     }
23 }
UserQueryVo .java

 

3.2 mapper.xml :實現兩條不同sql示例

 1 <!-- 實現下邊的sql拼接
 2             select * from t_user where id=1 OR id=2 OR id=3
 3     -->
 4     <select id="findUserByIds" parameterType="com.mybatis.entity.UserQueryVo" 
 5     resultType="com.mybatis.entity.User">
 6             select * from t_user
 7         <where>
 8                 <if test="ids!=null">
 9                 <!-- 使用foreach遍歷ids
10                     collection:指定輸入對象的集合屬性
11                     item:每個遍歷生成對象中
12                     open:開始遍歷時拼接的串
13                     close:技術遍歷時拼接的串
14                     separator:遍歷的兩個對象中需要拼接的串
15                  -->
16                 <foreach collection="ids" item="user_id" open="AND (" close=")" separator="or">
17                     id=#{user_id}
18                 </foreach>
19             </if>
20         </where>
21     </select>
mapper.xml
 1 <!-- 實現下邊的sql拼接
 2             select * from t_user whereid in(1,2,3)
 3  -->
 4 
 5 <select id="findUserByIds" parameterType="com.mybatis.entity.UserQueryVo" 
 6     resultType="com.mybatis.entity.User">
 7             select * from t_user
 8         <where>
 9                 <if test="ids!=null">
10                 <!-- 
11                     使用foreach遍歷ids
12                     collection:指定輸入對象的集合屬性
13                     item:每個遍歷生成對象中
14                     open:開始遍歷時拼接的串
15                     close:技術遍歷時拼接的串
16                     sepa

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

-Advertisement-
Play Games
更多相關文章
  • C3P0連接池: 配置文件:c3p0-config.xml 測試: 數據準備: CREATE DATABASE mybase; USE mybase; CREATE TABLE users( uid INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(6 ...
  • 淺析final關鍵字 final單詞字面意思是“最終的,不可更改的”。所以在java中final關鍵字表示終態,即最終的狀態,“這個東西不能被改變”。 final關鍵字可以用來修飾類、方法、數據(包括成員變數、局部變數與方法參數)。 (1)final類 final關鍵字修飾的類是不能被繼承的。在這裡 ...
  • 關於JSP中的文件上傳和下載操作 先分析一下上傳文件的流程 1-先通過前段頁面中的選擇文件選擇要上傳的圖片index.jsp 2-點擊提交按鈕,通過ajax的文件上傳訪問伺服器端 common.js 3-伺服器端響應保存或者下載保存上傳文件的FileUpload.java 下載文件的FileDown ...
  • Servlet詳解 1.servlet簡單介紹 servlet是javaweb三大組件之一,他與filter ,listener 共同組成了javaweb的三大組件,Servlet(Server Applet)是Java Servlet的簡稱,解釋為運行在伺服器端的java小程式, 作用:用來接收客 ...
  • 1:題目描述 Given an array of integers, return indices of the two numbers such that they add up to a specific target. You may assume that each input would ...
  • 首先自己實現一個簡單的連接池: 數據準備: CREATE DATABASE mybase; USE mybase; CREATE TABLE users( uid INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(64), upassword VARC ...
  • 前面我們說了,在python中,一切皆對象。函數也是一個對象,而且函數對象可以被賦值給變數,通過變數也能調用該函數。如: 以上代碼,輸出: 函數對象有一個__name__屬性,可以拿到函數的名字: 以上代碼,輸出: 你會發現,上例中的變數 f 也獲得了sayHello函數的功能,而且本質上它就是 s ...
  • 前言 雖然windows下, tomcat和solr整合起來灰常的方便, 但是, 一般像這種東西, 都很少部署在windows中, 更多的是部署到linux中去. 其實, 步驟是一樣的, 這裡, 我在centos 中再部署一次. 下包 下載地址還是之前的那個: http://mirror.bit.e ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...