最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java多線(xiàn)程從基礎(chǔ)到高級(jí)應(yīng)用示例小結(jié)

 更新時(shí)間:2026年01月21日 15:33:03   作者:星河耀銀海  
本章介紹了Java多線(xiàn)程編程的基礎(chǔ)知識(shí),包括線(xiàn)程的創(chuàng)建與管理、線(xiàn)程同步、線(xiàn)程通信和線(xiàn)程池,重點(diǎn)內(nèi)容包括線(xiàn)程的三種創(chuàng)建方式,通過(guò)本章的學(xué)習(xí),讀者掌握了Java多線(xiàn)程編程的基本技能,感興趣的朋友跟隨小編一起看看吧

Java多線(xiàn)程:從基礎(chǔ)到高級(jí)應(yīng)用

11.1 多線(xiàn)程概述

11.1.1 學(xué)習(xí)目標(biāo)與重點(diǎn)提示

學(xué)習(xí)目標(biāo):理解多線(xiàn)程的基本概念,掌握線(xiàn)程的創(chuàng)建與管理方法,了解線(xiàn)程同步與通信的實(shí)現(xiàn)方式,掌握線(xiàn)程池的使用方法。
重點(diǎn):線(xiàn)程的創(chuàng)建方式(繼承Thread類(lèi)、實(shí)現(xiàn)Runnable接口、使用Callable和Future)、線(xiàn)程同步(synchronized、Lock)、線(xiàn)程通信(wait/notify、await/signal)、線(xiàn)程池(Executor、ThreadPoolExecutor)。

11.1.2 多線(xiàn)程的基本概念

進(jìn)程:一個(gè)正在運(yùn)行的程序,包含代碼、數(shù)據(jù)和資源。
線(xiàn)程:進(jìn)程內(nèi)部的一個(gè)執(zhí)行單元,共享進(jìn)程的資源。
多線(xiàn)程:一個(gè)進(jìn)程包含多個(gè)線(xiàn)程,同時(shí)執(zhí)行多個(gè)任務(wù)。

多線(xiàn)程的優(yōu)勢(shì):

  • 提高程序的執(zhí)行效率。
  • 充分利用CPU資源。
  • 提高程序的響應(yīng)速度。

多線(xiàn)程的劣勢(shì):

  • 增加了程序的復(fù)雜度。
  • 容易出現(xiàn)線(xiàn)程安全問(wèn)題。

11.2 線(xiàn)程的創(chuàng)建與管理

Java中創(chuàng)建線(xiàn)程的方式有三種:繼承Thread類(lèi)、實(shí)現(xiàn)Runnable接口、使用Callable和Future。

11.2.1 繼承Thread類(lèi)

定義:繼承Thread類(lèi),重寫(xiě)run()方法,創(chuàng)建Thread子類(lèi)的對(duì)象,調(diào)用start()方法啟動(dòng)線(xiàn)程。
示例

class MyThread extends Thread {
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println(Thread.currentThread().getName() + ": " + i);
        }
    }
}
public class TestThread {
    public static void main(String[] args) {
        MyThread thread1 = new MyThread();
        MyThread thread2 = new MyThread();
        thread1.start();
        thread2.start();
    }
}

輸出結(jié)果

Thread-0: 0
Thread-0: 1
Thread-1: 0
Thread-1: 1
Thread-0: 2
Thread-0: 3
Thread-1: 2
Thread-0: 4
Thread-1: 3
Thread-0: 5
Thread-0: 6
Thread-1: 4
Thread-0: 7
Thread-1: 5
Thread-0: 8
Thread-0: 9
Thread-1: 6
Thread-1: 7
Thread-1: 8
Thread-1: 9

? 結(jié)論:繼承Thread類(lèi)的方式簡(jiǎn)單,但Java不支持多繼承,因此這種方式有局限性。

11.2.2 實(shí)現(xiàn)Runnable接口

定義:實(shí)現(xiàn)Runnable接口,重寫(xiě)run()方法,創(chuàng)建Runnable接口的實(shí)現(xiàn)類(lèi)的對(duì)象,將該對(duì)象作為參數(shù)傳遞給Thread類(lèi)的構(gòu)造方法,調(diào)用start()方法啟動(dòng)線(xiàn)程。
示例

class MyRunnable implements Runnable {
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println(Thread.currentThread().getName() + ": " + i);
        }
    }
}
public class TestRunnable {
    public static void main(String[] args) {
        MyRunnable runnable = new MyRunnable();
        Thread thread1 = new Thread(runnable);
        Thread thread2 = new Thread(runnable);
        thread1.start();
        thread2.start();
    }
}

輸出結(jié)果

Thread-0: 0
Thread-0: 1
Thread-1: 0
Thread-1: 1
Thread-0: 2
Thread-0: 3
Thread-1: 2
Thread-0: 4
Thread-1: 3
Thread-0: 5
Thread-0: 6
Thread-1: 4
Thread-0: 7
Thread-1: 5
Thread-0: 8
Thread-0: 9
Thread-1: 6
Thread-1: 7
Thread-1: 8
Thread-1: 9

? 結(jié)論:實(shí)現(xiàn)Runnable接口的方式避免了Java不支持多繼承的限制,但無(wú)法返回線(xiàn)程執(zhí)行結(jié)果。

11.2.3 使用Callable和Future

定義:實(shí)現(xiàn)Callable接口,重寫(xiě)call()方法,創(chuàng)建Callable接口的實(shí)現(xiàn)類(lèi)的對(duì)象,將該對(duì)象作為參數(shù)傳遞給FutureTask類(lèi)的構(gòu)造方法,將FutureTask類(lèi)的對(duì)象作為參數(shù)傳遞給Thread類(lèi)的構(gòu)造方法,調(diào)用start()方法啟動(dòng)線(xiàn)程,通過(guò)FutureTask類(lèi)的get()方法獲取線(xiàn)程執(zhí)行結(jié)果。
示例

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
class MyCallable implements Callable<Integer> {
    @Override
    public Integer call() throws Exception {
        int sum = 0;
        for (int i = 0; i <= 100; i++) {
            sum += i;
        }
        return sum;
    }
}
public class TestCallable {
    public static void main(String[] args) {
        MyCallable callable = new MyCallable();
        FutureTask<Integer> futureTask = new FutureTask<>(callable);
        Thread thread = new Thread(futureTask);
        thread.start();
        try {
            int result = futureTask.get();
            System.out.println("1到100的和:" + result);
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }
    }
}

輸出結(jié)果

1到100的和:5050

? 結(jié)論:使用Callable和Future的方式可以返回線(xiàn)程執(zhí)行結(jié)果,但需要使用FutureTask類(lèi)。

11.3 線(xiàn)程同步

線(xiàn)程同步是指多個(gè)線(xiàn)程同時(shí)訪問(wèn)共享資源時(shí),保證資源的一致性和正確性。

11.3.1 synchronized關(guān)鍵字

定義:synchronized關(guān)鍵字用于實(shí)現(xiàn)線(xiàn)程同步,分為同步方法和同步塊。
示例

class Count {
    private int count = 0;
    public synchronized void increment() {
        count++;
        System.out.println(Thread.currentThread().getName() + ": " + count);
    }
}
class MyThread extends Thread {
    private Count count;
    public MyThread(Count count) {
        this.count = count;
    }
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            count.increment();
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
public class TestSynchronized {
    public static void main(String[] args) {
        Count count = new Count();
        MyThread thread1 = new MyThread(count);
        MyThread thread2 = new MyThread(count);
        thread1.start();
        thread2.start();
    }
}

輸出結(jié)果

Thread-0: 1
Thread-1: 2
Thread-0: 3
Thread-1: 4
Thread-0: 5
Thread-1: 6
Thread-0: 7
Thread-1: 8
Thread-0: 9
Thread-1: 10
Thread-0: 11
Thread-1: 12
Thread-0: 13
Thread-1: 14
Thread-0: 15
Thread-1: 16
Thread-0: 17
Thread-1: 18
Thread-0: 19
Thread-1: 20

? 結(jié)論:synchronized關(guān)鍵字可以保證線(xiàn)程同步,但性能較低。

11.3.2 Lock接口

定義:Lock接口用于實(shí)現(xiàn)線(xiàn)程同步,提供了更靈活的同步方式,如可重入鎖、讀寫(xiě)鎖等。
示例

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
class Count {
    private int count = 0;
    private Lock lock = new ReentrantLock();
    public void increment() {
        lock.lock();
        try {
            count++;
            System.out.println(Thread.currentThread().getName() + ": " + count);
        } finally {
            lock.unlock();
        }
    }
}
class MyThread extends Thread {
    private Count count;
    public MyThread(Count count) {
        this.count = count;
    }
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            count.increment();
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
public class TestLock {
    public static void main(String[] args) {
        Count count = new Count();
        MyThread thread1 = new MyThread(count);
        MyThread thread2 = new MyThread(count);
        thread1.start();
        thread2.start();
    }
}

輸出結(jié)果

Thread-0: 1
Thread-1: 2
Thread-0: 3
Thread-1: 4
Thread-0: 5
Thread-1: 6
Thread-0: 7
Thread-1: 8
Thread-0: 9
Thread-1: 10
Thread-0: 11
Thread-1: 12
Thread-0: 13
Thread-1: 14
Thread-0: 15
Thread-1: 16
Thread-0: 17
Thread-1: 18
Thread-0: 19
Thread-1: 20

? 結(jié)論:Lock接口可以提供更靈活的同步方式,但需要手動(dòng)釋放鎖。

11.4 線(xiàn)程通信

線(xiàn)程通信是指多個(gè)線(xiàn)程之間的協(xié)作,如生產(chǎn)者-消費(fèi)者模型。

11.4.1 wait/notify方法

定義:wait/notify方法用于實(shí)現(xiàn)線(xiàn)程通信,wait()方法使線(xiàn)程進(jìn)入等待狀態(tài),notify()方法喚醒等待的線(xiàn)程。
示例

class Warehouse {
    private int count = 0;
    private final int MAX_COUNT = 10;
    public synchronized void produce() throws InterruptedException {
        while (count == MAX_COUNT) {
            wait();
        }
        count++;
        System.out.println(Thread.currentThread().getName() + ": 生產(chǎn)了一個(gè)產(chǎn)品,當(dāng)前產(chǎn)品數(shù)量:" + count);
        notifyAll();
    }
    public synchronized void consume() throws InterruptedException {
        while (count == 0) {
            wait();
        }
        count--;
        System.out.println(Thread.currentThread().getName() + ": 消費(fèi)了一個(gè)產(chǎn)品,當(dāng)前產(chǎn)品數(shù)量:" + count);
        notifyAll();
    }
}
class Producer extends Thread {
    private Warehouse warehouse;
    public Producer(Warehouse warehouse) {
        this.warehouse = warehouse;
    }
    @Override
    public void run() {
        try {
            for (int i = 0; i < 20; i++) {
                warehouse.produce();
                Thread.sleep(100);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
class Consumer extends Thread {
    private Warehouse warehouse;
    public Consumer(Warehouse warehouse) {
        this.warehouse = warehouse;
    }
    @Override
    public void run() {
        try {
            for (int i = 0; i < 20; i++) {
                warehouse.consume();
                Thread.sleep(100);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
public class TestWaitNotify {
    public static void main(String[] args) {
        Warehouse warehouse = new Warehouse();
        Producer producer1 = new Producer(warehouse);
        Producer producer2 = new Producer(warehouse);
        Consumer consumer1 = new Consumer(warehouse);
        Consumer consumer2 = new Consumer(warehouse);
        producer1.start();
        producer2.start();
        consumer1.start();
        consumer2.start();
    }
}

輸出結(jié)果

Thread-0: 生產(chǎn)了一個(gè)產(chǎn)品,當(dāng)前產(chǎn)品數(shù)量:1
Thread-1: 生產(chǎn)了一個(gè)產(chǎn)品,當(dāng)前產(chǎn)品數(shù)量:2
Thread-2: 消費(fèi)了一個(gè)產(chǎn)品,當(dāng)前產(chǎn)品數(shù)量:1
Thread-3: 消費(fèi)了一個(gè)產(chǎn)品,當(dāng)前產(chǎn)品數(shù)量:0
Thread-0: 生產(chǎn)了一個(gè)產(chǎn)品,當(dāng)前產(chǎn)品數(shù)量:1
Thread-1: 生產(chǎn)了一個(gè)產(chǎn)品,當(dāng)前產(chǎn)品數(shù)量:2
Thread-2: 消費(fèi)了一個(gè)產(chǎn)品,當(dāng)前產(chǎn)品數(shù)量:1
Thread-3: 消費(fèi)了一個(gè)產(chǎn)品,當(dāng)前產(chǎn)品數(shù)量:0
...

? 結(jié)論:wait/notify方法可以實(shí)現(xiàn)線(xiàn)程通信,但需要在同步塊中使用。

11.4.2 await/signal方法

定義:await/signal方法用于實(shí)現(xiàn)線(xiàn)程通信,await()方法使線(xiàn)程進(jìn)入等待狀態(tài),signal()方法喚醒等待的線(xiàn)程。
示例

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
class Warehouse {
    private int count = 0;
    private final int MAX_COUNT = 10;
    private Lock lock = new ReentrantLock();
    private Condition condition = lock.newCondition();
    public void produce() throws InterruptedException {
        lock.lock();
        try {
            while (count == MAX_COUNT) {
                condition.await();
            }
            count++;
            System.out.println(Thread.currentThread().getName() + ": 生產(chǎn)了一個(gè)產(chǎn)品,當(dāng)前產(chǎn)品數(shù)量:" + count);
            condition.signalAll();
        } finally {
            lock.unlock();
        }
    }
    public void consume() throws InterruptedException {
        lock.lock();
        try {
            while (count == 0) {
                condition.await();
            }
            count--;
            System.out.println(Thread.currentThread().getName() + ": 消費(fèi)了一個(gè)產(chǎn)品,當(dāng)前產(chǎn)品數(shù)量:" + count);
            condition.signalAll();
        } finally {
            lock.unlock();
        }
    }
}
class Producer extends Thread {
    private Warehouse warehouse;
    public Producer(Warehouse warehouse) {
        this.warehouse = warehouse;
    }
    @Override
    public void run() {
        try {
            for (int i = 0; i < 20; i++) {
                warehouse.produce();
                Thread.sleep(100);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
class Consumer extends Thread {
    private Warehouse warehouse;
    public Consumer(Warehouse warehouse) {
        this.warehouse = warehouse;
    }
    @Override
    public void run() {
        try {
            for (int i = 0; i < 20; i++) {
                warehouse.consume();
                Thread.sleep(100);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
public class TestAwaitSignal {
    public static void main(String[] args) {
        Warehouse warehouse = new Warehouse();
        Producer producer1 = new Producer(warehouse);
        Producer producer2 = new Producer(warehouse);
        Consumer consumer1 = new Consumer(warehouse);
        Consumer consumer2 = new Consumer(warehouse);
        producer1.start();
        producer2.start();
        consumer1.start();
        consumer2.start();
    }
}

輸出結(jié)果

Thread-0: 生產(chǎn)了一個(gè)產(chǎn)品,當(dāng)前產(chǎn)品數(shù)量:1
Thread-1: 生產(chǎn)了一個(gè)產(chǎn)品,當(dāng)前產(chǎn)品數(shù)量:2
Thread-2: 消費(fèi)了一個(gè)產(chǎn)品,當(dāng)前產(chǎn)品數(shù)量:1
Thread-3: 消費(fèi)了一個(gè)產(chǎn)品,當(dāng)前產(chǎn)品數(shù)量:0
Thread-0: 生產(chǎn)了一個(gè)產(chǎn)品,當(dāng)前產(chǎn)品數(shù)量:1
Thread-1: 生產(chǎn)了一個(gè)產(chǎn)品,當(dāng)前產(chǎn)品數(shù)量:2
Thread-2: 消費(fèi)了一個(gè)產(chǎn)品,當(dāng)前產(chǎn)品數(shù)量:1
Thread-3: 消費(fèi)了一個(gè)產(chǎn)品,當(dāng)前產(chǎn)品數(shù)量:0
...

? 結(jié)論:await/signal方法可以提供更靈活的線(xiàn)程通信方式,但需要使用Lock接口。

11.5 線(xiàn)程池

線(xiàn)程池是一種管理線(xiàn)程的方式,用于減少線(xiàn)程的創(chuàng)建和銷(xiāo)毀開(kāi)銷(xiāo)。

11.5.1 Executor框架

定義:Executor框架是Java提供的線(xiàn)程池管理框架,包括Executor、ExecutorService、ThreadPoolExecutor等類(lèi)。
示例

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
class MyRunnable implements Runnable {
    private int taskId;
    public MyRunnable(int taskId) {
        this.taskId = taskId;
    }
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + ": 執(zhí)行任務(wù)" + taskId);
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName() + ": 任務(wù)" + taskId + "完成");
    }
}
public class TestExecutor {
    public static void main(String[] args) {
        // 創(chuàng)建線(xiàn)程池
        ExecutorService executorService = Executors.newFixedThreadPool(3);
        // 提交任務(wù)
        for (int i = 0; i < 10; i++) {
            executorService.submit(new MyRunnable(i));
        }
        // 關(guān)閉線(xiàn)程池
        executorService.shutdown();
    }
}

輸出結(jié)果

pool-1-thread-1: 執(zhí)行任務(wù)0
pool-1-thread-2: 執(zhí)行任務(wù)1
pool-1-thread-3: 執(zhí)行任務(wù)2
pool-1-thread-1: 任務(wù)0完成
pool-1-thread-1: 執(zhí)行任務(wù)3
pool-1-thread-2: 任務(wù)1完成
pool-1-thread-2: 執(zhí)行任務(wù)4
pool-1-thread-3: 任務(wù)2完成
pool-1-thread-3: 執(zhí)行任務(wù)5
pool-1-thread-1: 任務(wù)3完成
pool-1-thread-1: 執(zhí)行任務(wù)6
pool-1-thread-2: 任務(wù)4完成
pool-1-thread-2: 執(zhí)行任務(wù)7
pool-1-thread-3: 任務(wù)5完成
pool-1-thread-3: 執(zhí)行任務(wù)8
pool-1-thread-1: 任務(wù)6完成
pool-1-thread-1: 執(zhí)行任務(wù)9
pool-1-thread-2: 任務(wù)7完成
pool-1-thread-3: 任務(wù)8完成
pool-1-thread-1: 任務(wù)9完成

? 結(jié)論:Executor框架可以方便地管理線(xiàn)程池,但需要根據(jù)實(shí)際需求選擇合適的線(xiàn)程池類(lèi)型。

總結(jié)

本章我們學(xué)習(xí)了Java的多線(xiàn)程,包括線(xiàn)程的創(chuàng)建與管理、線(xiàn)程同步、線(xiàn)程通信、線(xiàn)程池等內(nèi)容。其中,線(xiàn)程的創(chuàng)建方式(繼承Thread類(lèi)、實(shí)現(xiàn)Runnable接口、使用Callable和Future)、線(xiàn)程同步(synchronized、Lock)、線(xiàn)程通信(wait/notify、await/signal)、線(xiàn)程池(Executor、ThreadPoolExecutor)是本章的重點(diǎn)內(nèi)容。從下一章開(kāi)始,我們將學(xué)習(xí)Java的網(wǎng)絡(luò)編程、數(shù)據(jù)庫(kù)編程等內(nèi)容。

到此這篇關(guān)于Java多線(xiàn)程從基礎(chǔ)到高級(jí)應(yīng)用示例小結(jié)的文章就介紹到這了,更多相關(guān)java多線(xiàn)程應(yīng)用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Opencv實(shí)現(xiàn)身份證OCR識(shí)別的示例詳解

    Opencv實(shí)現(xiàn)身份證OCR識(shí)別的示例詳解

    這篇文章主要為大家詳細(xì)介紹了如何使用Opencv實(shí)現(xiàn)身份證OCR識(shí)別功能,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以跟隨小編一起了解一下
    2024-03-03
  • 淺談springboot與微服務(wù)架構(gòu)

    淺談springboot與微服務(wù)架構(gòu)

    這篇文章主要介紹了淺談springboot與微服務(wù)架構(gòu),SpringBoot是由 Pivotal團(tuán)隊(duì)提供的框架,其設(shè)計(jì)?的是?來(lái)簡(jiǎn)化新Spring應(yīng)?,初始搭建以及開(kāi)發(fā)過(guò)程,該框架使?了特定的?式來(lái)進(jìn)?配置,需要的朋友可以參考下
    2023-07-07
  • Java統(tǒng)計(jì)字符串中英文字母、空格、數(shù)字和其它字符的個(gè)數(shù)

    Java統(tǒng)計(jì)字符串中英文字母、空格、數(shù)字和其它字符的個(gè)數(shù)

    在日常編程中,我們經(jīng)常需要處理字符串?dāng)?shù)據(jù),本文將介紹如何使用Java語(yǔ)言來(lái)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的程序,可以接收用戶(hù)輸入的一行字符,并分別統(tǒng)計(jì)出其中英文字母、空格、數(shù)字和其他字符的個(gè)數(shù),希望對(duì)大家有所幫助
    2026-01-01
  • Java中Mybatis,SpringMVC,Spring的介紹及聯(lián)系

    Java中Mybatis,SpringMVC,Spring的介紹及聯(lián)系

    這篇文章主要為大家詳細(xì)介紹了Java中Mybatis,SpringMVC,Spring的介紹及聯(lián)系,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • Java查詢(xún)時(shí)間段(startTime--endTime)間的數(shù)據(jù)方式

    Java查詢(xún)時(shí)間段(startTime--endTime)間的數(shù)據(jù)方式

    這篇文章主要介紹了Java查詢(xún)時(shí)間段(startTime--endTime)間的數(shù)據(jù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • java 動(dòng)態(tài)生成bean的案例

    java 動(dòng)態(tài)生成bean的案例

    這篇文章主要介紹了java 動(dòng)態(tài)生成bean的案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-02-02
  • IDEA中右側(cè)沒(méi)有顯示Maven問(wèn)題及解決

    IDEA中右側(cè)沒(méi)有顯示Maven問(wèn)題及解決

    解決IDEA中Maven工具窗口不顯示的問(wèn)題,包括手動(dòng)重新加載Maven項(xiàng)目、啟用Maven插件、手動(dòng)加載Maven項(xiàng)目、重置IDEA配置和檢查IDEA版本和Maven配置
    2026-02-02
  • Mybatis SQL日志如何轉(zhuǎn)換為可執(zhí)行sql

    Mybatis SQL日志如何轉(zhuǎn)換為可執(zhí)行sql

    這篇文章主要介紹了Mybatis SQL日志如何轉(zhuǎn)換為可執(zhí)行sql問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Mybatis plus關(guān)閉駝峰命名的四種方法(防止出現(xiàn)查詢(xún)?yōu)镹ull)

    Mybatis plus關(guān)閉駝峰命名的四種方法(防止出現(xiàn)查詢(xún)?yōu)镹ull)

    這篇文章主要介紹了Mybatis plus關(guān)閉駝峰命名的四種方法(防止出現(xiàn)查詢(xún)?yōu)镹ull),數(shù)據(jù)庫(kù)的字段命名方式為使用下劃線(xiàn)連接,對(duì)應(yīng)的實(shí)體類(lèi)應(yīng)該是駝峰命名方式,而我使用的是和數(shù)據(jù)庫(kù)同樣的命名方式,需要的朋友可以參考下
    2022-01-01
  • Mybatis-Plus自定義集合類(lèi)型的類(lèi)型處理器詳解

    Mybatis-Plus自定義集合類(lèi)型的類(lèi)型處理器詳解

    這篇文章主要介紹了Mybatis-Plus自定義集合類(lèi)型的類(lèi)型處理器詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01

最新評(píng)論

婺源县| 景泰县| 沾益县| 廉江市| 玉环县| 太白县| 二连浩特市| 清水县| 奉化市| 玉门市| 清苑县| 汤原县| 玛纳斯县| 邯郸县| 临夏县| 西华县| 馆陶县| 汕头市| 成都市| 通化市| 沿河| 邢台县| 康保县| 墨玉县| 呼和浩特市| 正定县| 茂名市| 兰溪市| 涪陵区| 金塔县| 驻马店市| 湖州市| 彩票| 蓝田县| 彰化市| 彭州市| 南昌县| 高密市| 库尔勒市| 赤水市| 南安市|