Java框架之Hibernate實戰篇

来源:https://www.cnblogs.com/1693977889zz/archive/2020/06/08/13069802.html
-Advertisement-
Play Games

從零開始Hibernate實戰篇:(四篇實戰代碼,循序漸進,註意事項和學習內容在代碼註釋裡面,面向有一定基礎的同學使用) 第一篇:基礎篇(搭建) Hibernate開發基本步驟: 1.導入jar包(hibernate-release-5.0.7.Final\lib的文件裡面去找所需要的jar包) 2 ...


從零開始Hibernate實戰篇:(四篇實戰代碼,循序漸進,註意事項和學習內容在代碼註釋裡面,面向有一定基礎的同學使用)

第一篇:基礎篇(搭建)

Hibernate開發基本步驟:

1.導入jar包(hibernate-release-5.0.7.Final\lib的文件裡面去找所需要的jar包)

2.寫實體類+實體類的映射文件

User.java

/**
 * Project Name:hibernate_demo
 * File Name:User.java
 * Package Name:cn.itcast.entity
 *
*/

package cn.itcast.entity;

/**
 * @author zhouP
 * @version
 * @see
 */
public class User {

    // hibernate要求實體類有一個屬性唯一的
    private int uid;

    private String username;

    private String password;

    private String address;

    public void setUid(int uid) {
        this.uid = uid;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public int getUid() {
        return uid;
    }

}

User.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <!-- 1.配置類和表對應 class屬性:實體類全路徑(類路徑) table屬性:資料庫表名稱 -->
    <class name="cn.itcast.entity.User" table="t_user">
        <!-- 2.配置實體類id與表id對應 hibernate要求實體類有一個屬性唯一值 hibernate要求表有欄位作為唯一值 -->
        <!-- id標簽 name屬性:實體類裡面id屬性名稱 column屬性:生成的表欄位名稱 -->
        <id name="uid" column="uid">
            <!-- 配置資料庫表id的增長策略 native:主鍵自動增長 -->
            <generator class="native"></generator>
        </id>

        <!-- 配置其他屬性和表欄位對應 name屬性:實體類屬性名稱 column屬性:生成表欄位名稱 -->
        <property name="username" column="username"></property>
        <property name="password" column="password"></property>
        <property name="address" column="address"></property>
        
    </class>

</hibernate-mapping>

3.Hibernate核心配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
<session-factory>
<!-- 第一部分:配置資料庫信息(必須的) -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql:///hibernate_test</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>

<!-- 第二部分:配置hibernate信息(可選的) -->
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
<!-- 兩個重要配置ddl、dialect(分頁時用) -->
<property name="hibernate.hbm2ddl.auto">update</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

<!-- 第三部分:把映射文件放到核心配置文件中(必須的)(文件路徑) -->
<mapping resource="cn/itcast/entity/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>

4.編寫Hibernate工具類

package cn.itcast.utils;

import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtils {

    // 創建sessionFactory的過程,特別浪費資源,建議一個項目一般創建一個sessionFactory對象
    // static Configuration cfg = null;

    static SessionFactory sessionFactory = null;
    // 靜態代碼塊實現
    static {
        // cfg = new Configuration();
        // cfg.configure();
        // sessionFactory = cfg.buildSessionFactory();
        sessionFactory = new Configuration().configure().buildSessionFactory();

    }

    // 提供方法返回sessionFactory
    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }

}

5.測試代碼

package cn.itcast.hibernatetest;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.junit.Test;

import cn.itcast.entity.User;
import cn.itcast.utils.HibernateUtils;

public class HibernateDemo {

    @Test
    public void testAdd() {
        // 第一步:載入hibernate核心配置文件
        // Configuration cfg = new Configuration();
        // cfg.configure();
        // 第二步:創建SessionFactory對象
        // SessionFactory sessionFactory = cfg.buildSessionFactory();

        SessionFactory sessionFactory = HibernateUtils.getSessionFactory();
        // 第三步:使用SessionFactory創建session對象
        Session session = sessionFactory.openSession();
        // 第四步:開啟事務
        Transaction tx = session.beginTransaction();

        // 第五步:寫具體的邏輯 curd操作
        // 添加功能
        User user = new User();
        user.setUsername("Mr Li");
        user.setPassword("1234");
        user.setAddress("武漢");

        // 調用session的方法實現添加
        session.save(user);

        // 第六步:提交事務
        tx.commit();
        // 第七步:關閉資源
        session.close();
        sessionFactory.close();

    }

}

第二篇:Hibernate API 練習篇

1.創建項目(略)2.導入jar包(略)3.實體類+其映射文件(略)

4.Hibernate核心配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
    <hibernate-configuration>
    <session-factory>
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="hibernate.connection.url">jdbc:mysql:///hibernate_test2</property>
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.connection.password">root</property>
    
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    <property name="hibernate.show_sql">true</property>
    <property name="hibernate.format_sql">true</property>
    <property name="hibernate.hbm2ddl.auto">update</property>
    
    <!-- 在hibernate核心配置文件中配置 -->
    <property name="hibernate.current_session_context_class">thread</property>
    <!-- 把映射文件放到hibernate核心配置文件當中 -->
    <mapping resource="cn/itcast/entity/User.cfg.xml"/>
    </session-factory>    
    </hibernate-configuration>

5.Hibernate相關測試代碼:

(1)HibernateDemo.java

package cn.itcast.hibernatetest;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.junit.Test;

import cn.itcast.entity.User;
import cn.itcast.utils.HibernateUtils;


public class HibernateDemo {

    @Test
    public void testSaveOrUpdate() {
        // 1.調用工具類得到sessionFactory
        SessionFactory sessionFactory = HibernateUtils.getSessionFactory();
        // 2.獲取session
        Session session = sessionFactory.openSession();
        // 3.開啟事務
        Transaction tx = session.beginTransaction();
        // 4.添加操作
        // User user = new User();
        // user.setUid(1);
        // user.setUsername("王第一");
        // user.setPassword("12345");
        // user.setAddress("杏林二小");
        // session.save(user);

        // 把uid=1的記錄username修改
        // User user = new User();
        // user.setUid(1);
        // user.setUsername("韓梅梅梅");
        // session.save(user);要用update
        // session.update(user);

        // User user = session.get(User.class, 2);
        // user.setAddress("興隆林業局");
        // // 實體類對象是持久態,做修改
        // session.saveOrUpdate(user);

        // User user = new User();
        // user.setUsername("rose");
        // user.setPassword("1314");
        // user.setAddress("阿爾巴尼亞");
        // session.save(user);

        // User user = new User();
        // user.setUsername("jack");
        // user.setPassword("520");
        // user.setAddress("北韓");
        // session.save(user);

        User user = new User();
        user.setUsername("jack");
        user.setPassword("124");
        user.setAddress("china");
        session.save(user);

        // 5.提交事務
        try {
            tx.commit();
        } catch (Exception e) {
            tx.rollback();
        } finally {
            // 6.關閉資源
            session.close();
            sessionFactory.close();
        }

    }

    @Test
    public void testDelete() {
        // 1.利用工具類創建sessionFactory
        SessionFactory sessionFactory = HibernateUtils.getSessionFactory();
        // 2.得到session
        Session session = sessionFactory.openSession();
        // 3.開啟事務
        Transaction tx = session.beginTransaction();
        // 4.刪除操作
        // 第一種刪除方法
        // User user = session.get(User.class, 1);
        // session.delete(user);

        // 第二種刪除方法
        User user = new User();
        user.setUid(3);
        session.delete(user);

        // 5.提交事務
        try {
            tx.commit();
        } catch (Exception e) {
            tx.rollback();
        } finally {
            // 6.關閉資源
            session.close();
            sessionFactory.close();
        }

    }

    @Test
    public void testUpdate() {
        // 1.工具類中得到sessionFactory
        SessionFactory sessionFactory = HibernateUtils.getSessionFactory();
        // 2.得到session
        Session session = sessionFactory.openSession();
        // 3.開啟事務
        Transaction tx = session.beginTransaction();
        // 4.更新操作(修改uid=2記錄的username值)
        // 4.1根據id查詢(如果資料庫中沒有此id,執行的是查詢)
        User user = session.get(User.class, 2);
        // 4.2向返回的username對象裡面設置修改之後的值
        user.setUsername("修改之後的值");
        // 4.3調用session的update方法
        // 執行過程:到user對象裡面找到uid值,根據uid進行修改
        session.update(user);
        // 5.提交事務
        try {
            tx.commit();
        } catch (Exception e) {
            tx.rollback();
        } finally {
            // 6.關閉資源
            session.close();
            sessionFactory.close();
        }

    }

}

(2)HibernateQueryData.java

package cn.itcast.hibernatetest;

import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.junit.Test;

import cn.itcast.entity.User;
import cn.itcast.utils.HibernateUtils;

public class HibernateQueryData {

    // 使用SQLQuery對象
    @Test
    public void testQuery() {
        SessionFactory sessionFactory = null;
        Session session = null;
        Transaction tx = null;
        try {
            sessionFactory = HibernateUtils.getSessionFactory();
            session = sessionFactory.openSession();
            tx = session.beginTransaction();

            // 創建SQLQuery對象
            SQLQuery sqlQuery = session.createSQLQuery("select * from t_user");
            // 返回的list中的每部分是對象的形式
            sqlQuery.addEntity(User.class);
            // 調用SQLQuery裡面的方法...導包是:import java.util.List;
            @SuppressWarnings("unchecked")
            List<User> list = sqlQuery.list();

            // 驗證:當調用SQLQuery方法:返回的list集合,預設裡面每一部分是數組結構
            for (User user : list) {
                System.out.println(user);
            }
            // List<Object[]> list = sqlQuery.list();
            //
            // for (Object[] objects : list) {
            // System.out.println(Arrays.toString(objects));
            // }
            // 提交事務
            tx.commit();
        } catch (Exception e) {
            tx.rollback();
        } finally {
            session.close();
            sessionFactory.close();

        }
    }

    // 使用Criteria對象
    @Test
    public void testCriteria() {
        SessionFactory sessionFactory = null;
        Session session = null;
        Transaction tx = null;
        try {
            sessionFactory = HibernateUtils.getSessionFactory();
            session = sessionFactory.openSession();
            tx = session.beginTransaction();
            // 創建criteria對象
            Criteria criteria = session.createCriteria(User.class);
            @SuppressWarnings("unchecked")
            List<User> list = criteria.list();
            for (User user : list) {
                System.out.println(user);
            }
            tx.commit();
        } catch (Exception e) {
            tx.rollback();
        } finally {
            session.close();
            sessionFactory.close();
        }
    }

    // 使用query對象
    @Test
    public void demoQuery() {
        SessionFactory sessionFactory = null;
        Session session = null;
        Transaction tx = null;
        try {
            sessionFactory = HibernateUtils.getSessionFactory();
            session = HibernateUtils.getSessionobject();
            // 開啟事務
            tx = session.beginTransaction();

            // 1 創建Query對象
            Query query = session.createQuery("from User");

            // 2 調用query對象裡面的方法得到結果
            @SuppressWarnings("unchecked")
            List<User> list = query.list();

            // 遍歷list集合四種: 普通for、增強for、迭代器、list迭代器
            // 遍歷set集合兩種:增強for、迭代器
            // 遍歷map集合兩種:得到所有key,根據key得到value; 得到key-value關係
            for (User user : list) {
                System.out.println(user);
            }

            // 提交事務
            tx.commit();
        } catch (Exception e) {
            e.printStackTrace();
            tx.rollback();
        } finally {
            session.close();
            sessionFactory.close();
        }
    }
}

(3)HibernateSelect.java

package cn.itcast.hibernatetest;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.junit.Test;

import cn.itcast.entity.User;
import cn.itcast.utils.HibernateUtils;

public class HibernateSelect {

    // 事務規範代碼
    @Test
    public void testTx() {
        Session session = null;
        Transaction tx = null;
        try {
            // 於本地線程綁定的session
            session = HibernateUtils.getSessionobject();
            // 開啟事務
            tx = session.beginTransaction();

            // 添加
            User user = new User();
            user.setAddress("華豐");
            user.setPassword("789");
            user.setUsername("化華");

            session.save(user);

            // 模擬出事情了:java.lang.ArithmeticException: / by zero
            // 10/0 此時,不能插入數據

            tx.commit();
        } catch (Exception e) {
            e.printStackTrace();
            tx.rollback();
        } finally {
            // 下麵session不能關閉,JUnit關閉會報錯。可以插入數據。
            // org.hibernate.SessionException: Session was already closed
            // org.hibernate.SessionException: Session was already closed
            // session.close();
        }

    }

    // 一級緩存特性
    @Test
    public void testDemo() {

        SessionFactory sessionFactory = null;
        Session session = null;
        Transaction tx = null;

        try {
            // 1.調用工具類得到sessionFactory
            sessionFactory = HibernateUtils.getSessionFactory();
            // 2.獲取session
            session = sessionFactory.openSession();

            // 3.開啟事務
            tx = session.beginTransaction();
            // 4.操作:查詢
            User user = session.get(User.class, 5);

            user.setAddress("之前室china,現在是哈爾濱");
            session.update(user);

            // 5.提交事務
            tx.commit();

        } catch (Exception e) {
            e.printStackTrace();
            tx.rollback();
        } finally {
            // 6.關閉資源
            session.close();
            sessionFactory.close();
        }

    }

    // 驗證一級緩存存在
    @Test
    public void testCasch() {
        SessionFactory sessionFactory = null;
        Session session = null;
        Transaction tx = null;
        try {
            sessionFactory = HibernateUtils.getSessionFactory();
            session = sessionFactory.openSession();
            tx = session.beginTransaction();

            // 1.根據id=2查詢
            // 執行第一個get方法是否查詢資料庫,是否發送語句
            User user1 = session.get(User.class, 2);
            System.out.println(user1);

            // 2.在 根據id查詢
            // 執行第二個get方法是否查詢資料庫,是否發送語句
            // 結果是!只有一條查詢語句,兩條查詢結果
            User user2 = session.get(User.class, 2);
            System.out.println(user2);

            tx.commit();
        } catch (Exception e) {
            e.printStackTrace();
            tx.rollback();
        } finally {
            session.close();
            sessionFactory.close();
        }
    }

}

第三篇:Hibernate 一對多、多對多實戰篇

1.cn.itcast.entity包裡面:

(1)Customer.java

package cn.itcast.entity;

import java.util.HashSet;
import java.util.Set;

public class Customer {
    // 用戶id
    private Integer cid;

    // 用戶名稱
    private String custName;

    // 用戶級別
    private String custLevel;

    // 用戶來源
    private String custSource;

    // 聯繫電話
    private String custPhone;

    // 手機
    private String custMobile;

    // 在客戶實體類裡面表示多個聯繫人,一個客戶有多個聯繫人
    // hibernate要求使用集合表示多的數據,使用set集合:
    // import java.util.HashSet;import java.util.Set;
    private Set<LinkMan> setLinkMan = new HashSet<LinkMan>();

    public Set<LinkMan> getSetLinkMan() {
        return setLinkMan;
    }

    public void setSetLinkMan(Set<LinkMan> setLinkMan) {
        this.setLinkMan = setLinkMan;
    }

    public Integer getCid() {
        return cid;
    }

    public void setCid(Integer cid) {
        this.cid = cid;
    }

    public String getCustName() {
        return custName;
    }

    public void setCustName(String custName) {
        this.custName = custName;
    }

    public String getCustLevel() {
        return custLevel;
    }

    public void setCustLevel(String custLevel) {
        this.custLevel = custLevel;
    }

    public String getCustSource() {
        return custSource;
    }

    public void setCustSource(String custSource) {
        this.custSource = custSource;
    }

    public String getCustPhone() {
        return custPhone;
    }

    public void setCustPhone(String custPhone) {
        this.custPhone = custPhone;
    }

    public String getCustMobile() {
        return custMobile;
    }

    public void setCustMobile(String custMobile) {
        this.custMobile = custMobile;
    }

}

Customer.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping>
<!-- 1.配置類和表對應
       class標簽
       name屬性:實體類的全路徑
       table屬性:資料庫表名稱 -->
<class name="cn.itcast.entity.Customer" table="t_customer">
<id name="cid" column="cid">
<generator class="native"></generator>
</id>
<property name="custName" column="custName"></property>
<property name="custLevel" column="custLevel"></property>
<property name="custSource" column="custSource"></property>
<property name="custPhone" column="custPhone"></property>
<property name="custMobile" column="custMobile"></property>

<!-- 在客戶映射文件中,表示所有聯繫人
     使用set標簽:表示所有聯繫人
     set標簽裡面有name屬性:屬性值寫在客戶實體類裡面,表示聯繫人的set集合名稱 
     reverse屬性預設值:false表示不放棄維護
                    true表示放棄維護-->
<set name="setLinkMan" inverse="true">
<!-- 一對多建表,有外鍵
     hibernate機制:雙向維護外鍵,在一和多那一方都配置外鍵
     column屬性值:外鍵名稱
      -->
<key column="clid"></key>
<!-- 客戶所有的聯繫人,class裡面寫聯繫人實體類全路徑 -->
<one-to-many class="cn.itcast.entity.LinkMan"/>
</set>
</class>
</hibernate-mapping>

(2)LinkMan.java

package cn.itcast.entity;

public class LinkMan {
    // 聯繫人編號(主鍵)
    private Integer lkm_id;

    // 聯繫人姓名
    private String lkm_name;

    // 聯繫人性別
    <

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

-Advertisement-
Play Games
更多相關文章
  • 想要實現的效果(主要移動端) 使用了tools.min.js,教程參考: https://blog.csdn.net/tinico/article/details/18033493 然後發現有一個Bug,就是只要觸發touch事件,就會左右滾動,但我需要實現的是上下滾動時頁面隨之往下走 可是不管我是 ...
  • 某站後端代碼被“開源”,同時刷遍全網的,還有代碼里的那些神註釋。 我們這才知道,原來程式員個個都是段子手;這麼多年來,我們也走過了他們的無數套路...... 首先,產品經理,是永遠永遠吐槽不完的!網友的評論也非常扎心,說看這些代碼就像在閱讀程式員的日記,每一頁都寫滿了對產品經理的恨。 然後,也要發出 ...
  • 聲明一個函數,arr_obj ,裡面接收一個參數,參數類型只接受對象或者數組 如果沒有傳遞任何參數 或者 傳遞的參數類型不符合要求,就會拋出錯誤異常 無論是沒有傳遞任何參數 或者 傳遞的參數類型不符合要求,拋出異常 並 列印出傳遞的參數 如果要查看當前函數的對象,請通過 new 的方式實例化函數 a ...
  • 一窺 AJAX 本文寫於 2020 年 6 月 7 日 AJAX 這個詞非常常見,如果使初學者,說不定還會非常害怕這個名字看起來非常高端、非常難的技術。 AJAX,全稱 Async JavaScript And XML。它不是 JavaScript 的規範,它只是一個哥們“發明”的縮寫,意思就是用 ...
  • 我們先看下 React 官方文檔對這兩個 hook 的介紹,建立個整體認識 useEffect(create, deps): 該 Hook 接收一個包含命令式、且可能有副作用代碼的函數。在函數組件主體內(這裡指在 React 渲染階段)改變 DOM、添加訂閱、設置定時器、記錄日誌以及執行其他包含副作 ...
  • jQuery是我們在WEB開發中使用最多的JS類庫,他可以很方便的幫助我們實現很多絢麗的功能。本文將給大家介紹JQuery的一種小功能,用來禁用文本框的剪切、複製、粘貼功能,完整的頁面代碼如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transit ...
  • 第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分散式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ...
  • JVM JVM->Java Virtual Machine:Java虛擬機,是一種用於計算設備的規範,它是一個虛構出來的電腦,是通過在實際的電腦上模擬模擬各種電腦功能來實現的。 基本認知: 1.JVM是用於運行Java代碼的假象電腦,主要有一套位元組碼指令集,一組寄存器,一個棧,一個垃圾回收, ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...