29_Java_数据库_第29天(JDBC、DBUtils)_讲义
生活随笔
收集整理的這篇文章主要介紹了
29_Java_数据库_第29天(JDBC、DBUtils)_讲义
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
今日內容介紹
1、JDBC
2、DBUtils
01JDBC概念和數據庫驅動程序
* A: JDBC概念和數據庫驅動程序* a: JDBC概述 * JDBC(Java Data Base Connectivity,java數據庫連接)是一種用于執行SQL語句的Java API,可以為多種關系數據庫提供統一訪問,它由一組用Java語言編寫的類和接口組成。是Java訪問數據庫的標準規范* JDBC提供了一種基準,據此可以構建更高級的工具和接口,使數據庫開發人員能夠編寫數據庫應用程序。* JDBC需要連接驅動,驅動是兩個設備要進行通信,滿足一定通信數據格式,數據格式由設備提供商規定,設備提供商為設備提供驅動軟件,通過軟件可以與該設備進行通信。* 我們使用的是mysql的驅動mysql-connector-java-5.1.39-bin.jar* b: 總結* JDBC是java提供給開發人員的一套操作數據庫的接口* 數據庫驅動就是實現該接口的實現類02JDBC原理
* A: JDBC原理* a: 描述* Java提供訪問數據庫規范稱為JDBC,而生產廠商提供規范的實現類稱為驅動* DBC是接口,驅動是接口的實現,沒有驅動將無法完成數據庫連接,從而不能操作數據庫!每個數據庫廠商都需要提供自己的驅動,用來連接自己公司的數據庫,也就是說驅動一般都由數據庫生成廠商提供。* 圖解見day29_source/JDBC實現原理.JPG03準備數據
* A: 準備數據* a: 創建數據庫和表結構#創建數據庫create database mybase;#使用數據庫use mybase;###創建分類表create table sort(sid int PRIMARY KEY AUTO_INCREMENT,sname varchar(100),sprice DOUBLE,sdesc VARCHAR(500));* b: 向表中插入數據#初始化數據insert into sort(sname,sprice,sdesc) values('家電',2000, '優惠的促銷');insert into sort(sname,sprice,sdesc) values('家具',8900, '家具價格上調,原材料漲價');insert into sort(sname,sprice,sdesc) values('兒童玩具',290, '賺家長的錢');insert into sort(sname,sprice,sdesc) values('生鮮',500.99, '生鮮商品');insert into sort(sname,sprice,sdesc) values('服裝',24000, '換季銷售');insert into sort(sname,sprice,sdesc) values('洗滌',50, '洗發水促銷');04JDBC的開發步驟
* A: JDBC的開發步驟* a: 步驟介紹1.注冊驅動告知JVM使用的是哪一個數據庫的驅動2.獲得連接使用JDBC中的類,完成對MySQL數據庫的連接3.獲得語句執行平臺通過連接對象獲取對SQL語句的執行者對象4.執行sql語句使用執行者對象,向數據庫執行SQL語句獲取到數據庫的執行后的結果5.處理結果6.釋放資源 一堆close()05導入mysql數據庫驅動程序jar包
* A: 導入mysql數據庫驅動程序jar包* a: 步驟* 創建lib目錄,用于存放當前項目需要的所有jar包* 選擇jar包,右鍵執行build path / Add to Build Path06注冊數據庫驅動程序
* A: 注冊數據庫驅動程序* a: 案例代碼public class JDBCDemo {public static void main(String[] args)throws ClassNotFoundException,SQLException{//1.注冊驅動 反射技術,將驅動類加入到內容// 使用java.sql.DriverManager類靜態方法 registerDriver(Driver driver)// Diver是一個接口,參數傳遞,MySQL驅動程序中的實現類//DriverManager.registerDriver(new Driver());//驅動類源代碼,注冊2次驅動程序Class.forName("com.mysql.jdbc.Driver"); }}07獲取數據庫的連接對象
* A:獲取數據庫的連接對象* a: 案例代碼public class JDBCDemo {public static void main(String[] args)throws ClassNotFoundException,SQLException{//1.注冊驅動 反射技術,將驅動類加入到內容// 使用java.sql.DriverManager類靜態方法 registerDriver(Driver driver)// Diver是一個接口,參數傳遞,MySQL驅動程序中的實現類//DriverManager.registerDriver(new Driver());//驅動類源代碼,注冊2次驅動程序Class.forName("com.mysql.jdbc.Driver");//2.獲得數據庫連接 DriverManager類中靜態方法//static Connection getConnection(String url, String user, String password) //返回值是Connection接口的實現類,在mysql驅動程序//url: 數據庫地址 jdbc:mysql://連接主機IP:端口號//數據庫名字String url = "jdbc:mysql://localhost:3296/mybase";//用戶名和密碼用自己的String username="root";String password="123";Connection con = DriverManager.getConnection(url, username, password);System.out.println(con); }}08獲取SQL語句的執行對象對象
* A: 獲取SQL語句的執行對象對象* a: 案例代碼public class JDBCDemo {public static void main(String[] args)throws ClassNotFoundException,SQLException{//1.注冊驅動 反射技術,將驅動類加入到內容// 使用java.sql.DriverManager類靜態方法 registerDriver(Driver driver)// Diver是一個接口,參數傳遞,MySQL驅動程序中的實現類//DriverManager.registerDriver(new Driver());//驅動類源代碼,注冊2次驅動程序Class.forName("com.mysql.jdbc.Driver");//2.獲得數據庫連接 DriverManager類中靜態方法//static Connection getConnection(String url, String user, String password) //返回值是Connection接口的實現類,在mysql驅動程序//url: 數據庫地址 jdbc:mysql://連接主機IP:端口號//數據庫名字String url = "jdbc:mysql://localhost:3296/mybase";String username="root";String password="123";Connection con = DriverManager.getConnection(url, username, password);//3.獲得語句執行平臺, 通過數據庫連接對象,獲取到SQL語句的執行者對象// con對象調用方法 Statement createStatement() 獲取Statement對象,將SQL語句發送到數據庫// 返回值是 Statement接口的實現類對象,,在mysql驅動程序Statement stat = con.createStatement();System.out.println(stat);}}09執行insert語句獲取結果集
* A: 執行insert語句獲取結果集* a: 案例代碼public class JDBCDemo {public static void main(String[] args)throws ClassNotFoundException,SQLException{//1.注冊驅動 反射技術,將驅動類加入到內容// 使用java.sql.DriverManager類靜態方法 registerDriver(Driver driver)// Diver是一個接口,參數傳遞,MySQL驅動程序中的實現類//DriverManager.registerDriver(new Driver());//驅動類源代碼,注冊2次驅動程序Class.forName("com.mysql.jdbc.Driver");//2.獲得數據庫連接 DriverManager類中靜態方法//static Connection getConnection(String url, String user, String password) //返回值是Connection接口的實現類,在mysql驅動程序//url: 數據庫地址 jdbc:mysql://連接主機IP:端口號//數據庫名字String url = "jdbc:mysql://localhost:3296/mybase";String username="root";String password="123";Connection con = DriverManager.getConnection(url, username, password);//3.獲得語句執行平臺, 通過數據庫連接對象,獲取到SQL語句的執行者對象// con對象調用方法 Statement createStatement() 獲取Statement對象,將SQL語句發送到數據庫// 返回值是 Statement接口的實現類對象,,在mysql驅動程序Statement stat = con.createStatement();// 4.執行sql語句// 通過執行者對象調用方法執行SQL語句,獲取結果// int executeUpdate(String sql) 執行數據庫中的SQL語句, insert delete update// 返回值int,操作成功數據表多少行int row = stat.executeUpdate("INSERT INTO sort(sname,sprice,sdesc) VALUES('汽車用品',50000,'瘋狂漲價')");System.out.println(row);//6.釋放資源 一堆close()stat.close();con.close();}}10執行select語句獲取結果集
* A: 執行select語句獲取結果集* a: 案例代碼public class JDBCDemo1 {public static void main(String[] args) throws Exception{//1. 注冊驅動Class.forName("com.mysql.jdbc.Driver");//2. 獲取連接對象String url = "jdbc:mysql://localhost:3296/mybase";String username="root";String password="123";Connection con = DriverManager.getConnection(url, username, password);//3 .獲取執行SQL 語句對象Statement stat = con.createStatement();// 拼寫查詢的SQLString sql = "SELECT * FROM sort";//4. 調用執行者對象方法,執行SQL語句獲取結果集// ResultSet executeQuery(String sql) 執行SQL語句中的select查詢// 返回值ResultSet接口的實現類對象,實現類在mysql驅動中ResultSet rs = stat.executeQuery(sql);//5 .處理結果集// ResultSet接口方法 boolean next() 返回true,有結果集,返回false沒有結果集while(rs.next()){//獲取每列數據,使用是ResultSet接口的方法 getXX方法參數中,建議寫String列名System.out.println(rs.getInt("sid")+" "+rs.getString("sname")+" "+rs.getDouble("sprice")+" "+rs.getString("sdesc"));}rs.close();stat.close();con.close();}}11SQL注入攻擊
* A: SQL注入攻擊* a: 注入問題* 假設有登錄案例SQL語句如下:* SELECT * FROM 用戶表 WHERE NAME = 用戶輸入的用戶名 AND PASSWORD = 用戶輸的密碼;* 此時,當用戶輸入正確的賬號與密碼后,查詢到了信息則讓用戶登錄。但是當用戶輸入的賬號為XXX 密碼為:XXX’ OR ‘a’=’a時,則真正執行的代碼變為:* SELECT * FROM 用戶表 WHERE NAME = ‘XXX’ AND PASSWORD =’ XXX’ OR ’a’=’a’;* 此時,上述查詢語句時永遠可以查詢出結果的。那么用戶就直接登錄成功了,顯然我們不* 希望看到這樣的結果,這便是SQL注入問題。* b: 案例演示CREATE TABLE users(id INT PRIMARY KEY AUTO_INCREMENT,username VARCHAR(100),PASSWORD VARCHAR(100));INSERT INTO users (username,PASSWORD) VALUES ('a','1'),('b','2');SELECT * FROM users;-- 登錄查詢SELECT * FROM users WHERE username='dsfsdfd' AND PASSWORD='wrethiyu'1 OR 1=1SELECT * FROM users WHERE username='a' AND PASSWORD='1'OR'1=1'鍵盤錄入:11'OR' 1=112SQL注入攻擊用戶登錄案例
* A: SQL注入攻擊用戶登錄案例* a: 案例代碼public class JDBCDemo2 {public static void main(String[] args)throws Exception {Class.forName("com.mysql.jdbc.Driver");String url = "jdbc:mysql://localhost:3296/mybase";String username = "root";String password = "123";Connection con = DriverManager.getConnection(url, username, password);Statement stat = con.createStatement();Scanner sc = new Scanner(System.in);String user = sc.nextLine();String pass = sc.nextLine();//執行SQL語句,數據表,查詢用戶名和密碼,如果存在,登錄成功,不存在登錄失敗// String sql = "SELECT * FROM users WHERE username='dsfsdfd' AND PASSWORD='wrethiyu' OR 1=1";String sql = "SELECT * FROM users WHERE username='"+user+"' AND PASSWORD='"+pass+"'";System.out.println(sql);ResultSet rs = stat.executeQuery(sql);while(rs.next()){System.out.println(rs.getString("username")+" "+rs.getString("password"));}rs.close();stat.close();con.close();}}13PrepareStatement接口預編譯SQL語句
* A: PrepareStatement接口預編譯SQL語句* a: 預處理對象* 使用PreparedStatement預處理對象時,建議每條sql語句所有的實際參數,都使用逗號分隔。* String sql = "insert into sort(sid,sname) values(?,?)";;* PreparedStatement預處理對象代碼:* PreparedStatement psmt = conn.prepareStatement(sql)* b: 執行SQL語句的方法介紹* int executeUpdate(); --執行insert update delete語句.* ResultSet executeQuery(); --執行select語句.* boolean execute(); --執行select返回true 執行其他的語句返回false.* c: 設置實際參數* void setXxx(int index, Xxx xx) 將指定參數設置為給定Java的xx值。在將此值發送到數據庫時,驅動程序將它轉換成一個 SQL Xxx類型值。* 例如:* setString(2, "家用電器") 把SQL語句中第2個位置的占位符? 替換成實際參數 "家用電器"* d: 案例代碼/** Java程序實現用戶登錄,用戶名和密碼,數據庫檢查* 防止注入攻擊* Statement接口實現類,作用執行SQL語句,返回結果集* 有一個子接口PreparedStatement (SQL預編譯存儲,多次高效的執行SQL) * PreparedStatement的實現類數據庫的驅動中,如何獲取接口的實現類* * 是Connection數據庫連接對象的方法* PreparedStatement prepareStatement(String sql) */public class JDBCDemo3 {public static void main(String[] args)throws Exception {Class.forName("com.mysql.jdbc.Driver");String url = "jdbc:mysql://localhost:3296/mybase";String username = "root";String password = "123";Connection con = DriverManager.getConnection(url, username, password);Scanner sc = new Scanner(System.in);String user = sc.nextLine();String pass = sc.nextLine();//執行SQL語句,數據表,查詢用戶名和密碼,如果存在,登錄成功,不存在登錄失敗String sql = "SELECT * FROM users WHERE username=? AND PASSWORD=?";//調用Connection接口的方法prepareStatement,獲取PrepareStatement接口的實現類//方法中參數,SQL語句中的參數全部采用問號占位符PreparedStatement pst = con.prepareStatement(sql);System.out.println(pst);//調用pst對象set方法,設置問號占位符上的參數pst.setObject(1, user);pst.setObject(2, pass);//調用方法,執行SQL,獲取結果集ResultSet rs = pst.executeQuery();while(rs.next()){System.out.println(rs.getString("username")+" "+rs.getString("password"));}rs.close();pst.close();con.close();}}14PrepareStatement接口預編譯SQL語句執行修改
* A: PrepareStatement接口預編譯SQL語句執行修改* 案例代碼/** 使用PrepareStatement接口,實現數據表的更新操作*/public class JDBCDemo {public static void main(String[] args) throws Exception{Class.forName("com.mysql.jdbc.Driver");String url = "jdbc:mysql://localhost:3296/mybase";String username="root";String password="123";Connection con = DriverManager.getConnection(url, username, password); //拼寫修改的SQL語句,參數采用?占位String sql = "UPDATE sort SET sname=?,sprice=? WHERE sid=?";//調用數據庫連接對象con的方法prepareStatement獲取SQL語句的預編譯對象PreparedStatement pst = con.prepareStatement(sql);//調用pst的方法setXXX設置?占位pst.setObject(1, "汽車美容");pst.setObject(2, 49988);pst.setObject(3, 7);//調用pst方法執行SQL語句pst.executeUpdate();pst.close();con.close();}}15PrepareStatement接口預編譯SQL語句執行查詢
* A: PrepareStatement接口預編譯SQL語句執行查詢* a: 案例代碼/** PrepareStatement接口實現數據表的查詢操作*/public class JDBCDemo1 {public static void main(String[] args) throws Exception{Class.forName("com.mysql.jdbc.Driver");String url = "jdbc:mysql://localhost:3296/mybase";String username="root";String password="123";Connection con = DriverManager.getConnection(url, username, password); String sql = "SELECT * FROM sort";PreparedStatement pst = con.prepareStatement(sql);//調用pst對象的方法,執行查詢語句,SelectResultSet rs=pst.executeQuery();while(rs.next()){System.out.println(rs.getString("sid")+" "+rs.getString("sname")+" "+rs.getString("sprice")+" "+rs.getString("sdesc"));}rs.close();pst.close();con.close();}}16JDBC的工具類和測試
* A: JDBC的工具類和測試* a: 案例代碼//JDBCUtils工具類代碼public class JDBCUtils {private JDBCUtils(){}private static Connection con ;static{try{Class.forName("com.mysql.jdbc.Driver");String url = "jdbc:mysql://localhost:3296/mybase";String username="root";String password="123";con = DriverManager.getConnection(url, username, password);}catch(Exception ex){throw new RuntimeException(ex+"數據庫連接失敗");}}/** 定義靜態方法,返回數據庫的連接對象*/public static Connection getConnection(){return con;}public static void close(Connection con,Statement stat){if(stat!=null){try{stat.close();}catch(SQLException ex){}}if(con!=null){try{con.close();}catch(SQLException ex){}}}public static void close(Connection con,Statement stat , ResultSet rs){if(rs!=null){try{rs.close();}catch(SQLException ex){}}if(stat!=null){try{stat.close();}catch(SQLException ex){}}if(con!=null){try{con.close();}catch(SQLException ex){}}}}//測試JDBCUtils工具類的代碼public class TestJDBCUtils {public static void main(String[] args)throws Exception {Connection con = JDBCUtils.getConnection();PreparedStatement pst = con.prepareStatement("SELECT sname FROM sort");ResultSet rs = pst.executeQuery();while(rs.next()){System.out.println(rs.getString("sname"));}JDBCUtils.close(con, pst, rs);}}17數據表數據存儲對象
* A: 數據表數據存儲對象* a: 準備工作* 導入jar包* 拷貝day32定義的工具類JDBCUtils* b: 案例代碼//定義實體類Sortpublic class Sort {private int sid;private String sname;private double sprice;private String sdesc;public Sort(int sid, String sname, double sprice, String sdesc) {this.sid = sid;this.sname = sname;this.sprice = sprice;this.sdesc = sdesc;}public Sort(){}public int getSid() {return sid;}public void setSid(int sid) {this.sid = sid;}public String getSname() {return sname;}public void setSname(String sname) {this.sname = sname;}public double getSprice() {return sprice;}public void setSprice(double sprice) {this.sprice = sprice;}public String getSdesc() {return sdesc;}public void setSdesc(String sdesc) {this.sdesc = sdesc;}@Overridepublic String toString() {return "Sort [sid=" + sid + ", sname=" + sname + ", sprice=" + sprice + ", sdesc=" + sdesc + "]";} }/** JDBC讀取數據表sort,每行數據封裝到Sort類的對象中* 很多個Sort類對象,存儲到List集合中*/public class JDBCDemo {public static void main(String[] args) throws Exception{//使用JDBC工具類,直接獲取數據庫連接對象Connection con = JDBCUtils.getConnection();//連接獲取數據庫SQL語句執行者對象PreparedStatement pst = con.prepareStatement("SELECT * FROM sort");//調用查詢方法,獲取結果集ResultSet rs = pst.executeQuery();//創建集合對象List<Sort> list = new ArrayList<Sort>();while(rs.next()){//獲取到每個列數據,封裝到Sort對象中Sort s = new Sort(rs.getInt("sid"),rs.getString("sname"),rs.getDouble("sprice"),rs.getString("sdesc"));//封裝的Sort對象,存儲到集合中list.add(s);}JDBCUtils.close(con, pst, rs);//遍歷List集合for(Sort s : list){System.out.println(s);}}}18properties配置文件
* A: properties配置文件 * a: 相關介紹* 開發中獲得連接的4個參數(驅動、URL、用戶名、密碼)通常都存在配置文件中,方便后期維護,程序如果需要更換數據庫,只需要修改配置文件即可。* 通常情況下,我們習慣使用properties文件,此文件我們將做如下要求:1. 文件位置:任意,建議src下2. 文件名稱:任意,擴展名為properties3. 文件內容:一行一組數據,格式是“key=value”.a) key命名自定義,如果是多個單詞,習慣使用點分隔。例如:jdbc.driverb) value值不支持中文,如果需要使用非英文字符,將進行unicode轉換。19properties文件的創建和編寫
* A: properties文件的創建和編寫* a: properties文件的創建* src路徑下建立database.properties(其實就是一個文本文件)* b: properties文件的編寫(內容如下)driverClass=com.mysql.jdbc.Driverurl=jdbc:mysql://localhost:3296/mybaseusername=rootpassword=12320加載配置文件
* A: 加載配置文件* a: 案例代碼 /** 加載properties配置文件* IO讀取文件,鍵值對存儲到集合* 從集合中以鍵值對方式獲取數據庫的連接信息,完成數據庫的連接*/public class PropertiesDemo {public static void main(String[] args) throws Exception{FileInputStream fis = new FileInputStream("database.properties");System.out.println(fis);//使用類的加載器InputStream in = PropertiesDemo.class.getClassLoader().getResourceAsStream("database.properties");System.out.println(in);Properties pro = new Properties();pro.load(in);System.out.println(in); }}21通過配置文件連接數據庫
* A: 通過配置文件連接數據庫* a: 案例代碼/** 加載properties配置文件* IO讀取文件,鍵值對存儲到集合* 從集合中以鍵值對方式獲取數據庫的連接信息,完成數據庫的連接*/public class PropertiesDemo {public static void main(String[] args) throws Exception{FileInputStream fis = new FileInputStream("database.properties");System.out.println(fis);//使用類的加載器InputStream in = PropertiesDemo.class.getClassLoader().getResourceAsStream("database.properties");System.out.println(in);Properties pro = new Properties();pro.load(in);//獲取集合中的鍵值對String driverClass=pro.getProperty("driverClass");String url = pro.getProperty("url");String username = pro.getProperty("username");String password = pro.getProperty("password");Class.forName(driverClass);Connection con = DriverManager.getConnection(url, username, password);System.out.println(con);}}22讀取配置文件的工具類
* A: 讀取配置文件的工具類* a: 案例代碼/** 編寫數據庫連接的工具類,JDBC工具類* 獲取連接對象采用讀取配置文件方式* 讀取文件獲取連接,執行一次,static{}*/public class JDBCUtilsConfig {private static Connection con ;private static String driverClass;private static String url;private static String username;private static String password;static{try{readConfig();Class.forName(driverClass);con = DriverManager.getConnection(url, username, password);}catch(Exception ex){throw new RuntimeException("數據庫連接失敗");}}private static void readConfig()throws Exception{InputStream in = JDBCUtilsConfig.class.getClassLoader().getResourceAsStream("database.properties");Properties pro = new Properties();pro.load(in);driverClass=pro.getProperty("driverClass");url = pro.getProperty("url");username = pro.getProperty("username");password = pro.getProperty("password");}public static Connection getConnection(){return con;}}23測試工具類
* A: 測試工具類* a: 案例代碼public class TestJDBCUtils {public static void main(String[] args) {Connection con = JDBCUtilsConfig.getConnection();System.out.println(con);}}作業測試
必須能獨立寫出JDBCUtils工具類,保證用JDBCUtils工具類能完成功能,不用JDBCUtils工具類工具類也能夠完成功能
1.map中有如下數據(用戶名=密碼)
[liuyan=123456,wangbaoqiang=123321,fangbian=abcd,miejueshitai=123abc321] 在ip為127.0.0.1數據庫名為stdb,連接數據庫的用戶名和密碼為:admin和123456中有一個userinfo表相關字段為(id,username,password) (1)將map中的手機號碼取出來打印到控制臺上* 直接使用map集合的keySet()方法獲取所有的key組成的Set集合,并遍歷 (2)判斷map中所有的用戶名在userinfo表中是否存在存在則輸出"該用戶已注冊",如果不存在將該用戶名及對應的密碼存入到userinfo表中 (map中的數據不需要修改)* 連接到數據庫* 創建表drop database stdb;create database stdb;use stdb;create table userinfo(id int(10) primary key auto_increment,username varchar(200),password varchar(200));2.一個數據庫stdb,用戶名為admin 密碼為123456 已存在一個表student中有五個學生的信息,姓名,性別,年齡,分數.
id(varchar(20)) name(varchar(20)) sex(varchar(20)) score(int(10))1 李少榮 女 802 邵凱 男 753 周強 男 954 王曉婷 女 555 張秀花 女 686 顧會 女 507 趙天一 男 32 (1)查詢女性,成績80以上的學生數量 (2)將姓張的男同學的的成績改為100 (3)查詢成績大于60的女性,顯示姓名,性別,成績 (4)分別統計所有男同學的平均分,所有女同學的平均分及總平均分 (5)按照分數從小到大的順序打印分數大于總平均分的學員信息(id-name-sex-score),并將分數大于總平均分的學員信息(按照分數從小到大的順序)(id-name-sex-score)寫入到studentInfo.txt文件中(寫入格式:id-name-sex-score) (6)定義查詢所有學生的方法public List<Student> getAllStudent(){} (7)定義根據id查詢學生的方法public Student getStudentById(String id){} (8)定義根據id刪除學生的方法public int deleteStudentById(String id){}//注意只有數據庫中有才能刪除,沒有無法刪除 (9)定義添加學員的方法public int addStudent(){}//注意只有數據庫中沒有有才能添加,有無法添加 (10)定義根據id修改學員的信息public int updateStudentById(String id){}//注意只有數據庫中有才能修改,沒有無法修改轉載于:https://www.cnblogs.com/wanghui1234/p/9591919.html
總結
以上是生活随笔為你收集整理的29_Java_数据库_第29天(JDBC、DBUtils)_讲义的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SELinux 入门
- 下一篇: vue2.x的小问题