国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JDBC:你總得學(xué)著去連接數(shù)據(jù)庫(kù)!

Airmusic / 3190人閱讀

摘要:帶再愛(ài)你一次一入門概述數(shù)據(jù)庫(kù)連接,,簡(jiǎn)稱是語(yǔ)言中用來(lái)規(guī)范客戶端程序如何來(lái)訪問(wèn)數(shù)據(jù)庫(kù)的應(yīng)用程序接口,提供了諸如查詢和更新數(shù)據(jù)庫(kù)中數(shù)據(jù)的方法。是面向關(guān)系型數(shù)據(jù)庫(kù)的。

BWH_Steven :帶JDBC再愛(ài)你一次 (一) JDBC 入門 (1) 概述
Java數(shù)據(jù)庫(kù)連接,(Java Database Connectivity,簡(jiǎn)稱JDBC)是Java語(yǔ)言中用來(lái)規(guī)范客戶端程序如何來(lái)訪問(wèn)數(shù)據(jù)庫(kù)的應(yīng)用程序接口,提供了諸如查詢和更新數(shù)據(jù)庫(kù)中數(shù)據(jù)的方法。JDBC也是Sun Microsystems的商標(biāo)。JDBC是面向關(guān)系型數(shù)據(jù)庫(kù)的。

簡(jiǎn)單解釋: 通過(guò)Java語(yǔ)言執(zhí)行sql語(yǔ)句,從而操作數(shù)據(jù)庫(kù)

(2) 來(lái)由

想要通過(guò)Java操作不同的數(shù)據(jù)庫(kù),應(yīng)該根據(jù)數(shù)據(jù)庫(kù)的不同而執(zhí)行特定的API,而出于簡(jiǎn)化的想法,Sun公司,定義了一套面向所有關(guān)系型數(shù)據(jù)庫(kù)的 API 即 JDBC ,其只提供接口,而具體實(shí)現(xiàn)去交給數(shù)據(jù)庫(kù)廠商實(shí)現(xiàn),而我們作為開(kāi)發(fā)者,我們針對(duì)數(shù)據(jù)數(shù)據(jù)庫(kù)的操作,只需要基于JDBC即可

(二) 簡(jiǎn)單使用 JDBC

我們簡(jiǎn)單的使用JDBC去查詢數(shù)據(jù)庫(kù)中的數(shù)據(jù),并且輸出到控制臺(tái)中

為了快速演示,我們新建一張非常簡(jiǎn)單的表

CREATE TABLE student(
    id INT PRIMARY KEY AUTO_INCREMENT,
    NAME VARCHAR(20),
    score DOUBLE(4,1)
);

INSERT student(id,NAME,score) VALUES (1,"張三",98);

INSERT student(id,NAME,score) VALUES (2,"李四",96);

INSERT student(id,NAME,score) VALUES (3,"王五",100);

我們根據(jù)數(shù)據(jù)庫(kù)中的信息寫一個(gè)對(duì)應(yīng)的學(xué)生類

public class Student {
    private int id;
    private String name;
    private double score;
    //省略構(gòu)造、Get、Set、toString方法
    ...... 
}

下面是對(duì) JDBC 查詢功能的簡(jiǎn)單使用

package cn.ideal.jdbc;

import cn.ideal.domain.Student;

import java.sql.*;

public class JdbcDemo {
    public static void main(String[] args) {
        //導(dǎo)入數(shù)據(jù)庫(kù)驅(qū)動(dòng)包

        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;

        try {
            //加載驅(qū)動(dòng)
            Class.forName("com.mysql.jdbc.Driver");
            //獲取與數(shù)據(jù)庫(kù)的連接對(duì)象
            connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/db1", "root", "root99");
            //定義sql語(yǔ)句
            String sql = "SELECT * FROM student";
            //獲取執(zhí)行sql語(yǔ)句的對(duì)象statement
            statement = connection.createStatement();
            //執(zhí)行sql語(yǔ)句,獲取結(jié)果集
            resultSet = statement.executeQuery(sql);

            //遍歷獲取到的結(jié)果集
            while (resultSet.next()) {
                int id = resultSet.getInt(1);
                String name = resultSet.getString(2);
                Double score = resultSet.getDouble(3);

                Student student = new Student();
                student.setId(id);
                student.setName(name);
                student.setScore(score);

                System.out.println(student.toString());
            }

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            //釋放資源,后調(diào)用的先釋放
            if (resultSet != null) {
                try {
                    resultSet.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

            if (statement != null) {
                try {
                    statement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

            if (connection != null) {
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

//運(yùn)行結(jié)果
Student{id=1, name="張三", score=98.0}
Student{id=2, name="李四", score=96.0}
Student{id=3, name="王五", score=100.0}

下面我們開(kāi)始詳細(xì)的解釋一下上面所用到的各個(gè)對(duì)象

(三) JDBC 對(duì)象詳解 (1) DriverManager

A:加載驅(qū)動(dòng) --> 注冊(cè)驅(qū)動(dòng)

首先我們要知道加載驅(qū)動(dòng)和注冊(cè)驅(qū)動(dòng)這兩個(gè)詞是什么意思,剛剛接觸的時(shí)候,會(huì)有人總有朋友將Class.forName(com.mysql.jdbc.Driver) 當(dāng)做注冊(cè)數(shù)據(jù)庫(kù)驅(qū)動(dòng)的語(yǔ)句,但實(shí)際不然,它的作用是將參數(shù)表示的類加載到內(nèi)存中,并且初始化,同時(shí)其中的靜態(tài)變量也會(huì)被初始化,靜態(tài)代碼塊也會(huì)被執(zhí)行

疑惑:能否使用ClassLoader 類中的loadClass()方法呢?

答案是否定的,這個(gè)方法的特點(diǎn)是加載但不對(duì)該類初始化

//Class類源碼節(jié)選 -jdk8
* A call to {@code forName("X")} causes the class named
* {@code X} to be initialized.

關(guān)于初始化問(wèn)題這里簡(jiǎn)單提及一下,我們還是先回到我們主線來(lái)

為什么不對(duì)類進(jìn)行初始化,就不能選擇了呢?

這是因?yàn)檎嬲龑?shí)現(xiàn)注冊(cè)驅(qū)動(dòng)(告訴程序使用哪一個(gè)數(shù)據(jù)庫(kù)驅(qū)動(dòng)jar)的是:

static void registerDriver(Driver driver)

我們?cè)趈ar包中找到Driver這個(gè)類,查看其源碼

//com.mysql.jdbc.Driver類中的靜態(tài)代碼塊
static {
    try {
        DriverManager.registerDriver(new Driver());
    } catch (SQLException var1) {
        throw new RuntimeException("Can"t register driver!");
    }
}

類被加載后,執(zhí)行了類中的靜態(tài)方法DriverManager進(jìn)行了注冊(cè)驅(qū)動(dòng)

我們也可能有見(jiàn)過(guò)下面2中的代碼,但是實(shí)際上驅(qū)動(dòng)會(huì)被加載兩次,因?yàn)閳?zhí)行

new com.mysql.jdbc.Driver() 已經(jīng)加載了一次驅(qū)動(dòng)

//1.推薦
Class.forName("com.mysql.jdbc.Driver");
//2.不推薦
DriverManager.registerDriver(new com.mysql.jdbc.Driver())

那么何必這么麻煩呢?new com.mysql.jdbc.Driver() 直接這樣寫不就挺好了嗎?

但我們還是選擇 拒絕!為什么呢?

如果我們這樣寫,對(duì)于jar包的依賴就比較重了,我們?nèi)绻媾R多個(gè)項(xiàng)目,或者需要修改數(shù)據(jù)庫(kù),就需要修改代碼,重新編譯,但是如果使用Class類加載的方式,既保證了靜態(tài)代碼塊中所包含的注冊(cè)驅(qū)動(dòng)方法會(huì)被執(zhí)行 ,而又將參數(shù)變成了字符串形式,我們之后便可以通過(guò)修改配置文件 “ ” 內(nèi)的內(nèi)容 + 添加jar包 的方式更靈活的處理問(wèn)題,并且不需要重新編譯!

注意:mysql5之后的驅(qū)動(dòng)jar包可以省略注冊(cè)驅(qū)動(dòng)這一步,原因查看jar包中META-INF/services/java.sql.Driver文件

com.mysql.jdbc.Driver
com.mysql.fabric.jdbc.FabricMySQLDriver

B:獲取數(shù)據(jù)庫(kù)連接

static Connection getConnection(String url, String user, String password) 
/*
    jdbc:mysql://ip地址(域名):端口號(hào)/數(shù)據(jù)庫(kù)名稱
    Eg:jdbc:mysql://localhost:3306/db1
    本地mysql,且端口為默認(rèn)3306,則可簡(jiǎn)寫:jdbc:mysql:///數(shù)據(jù)庫(kù)名稱
*/
(2) Connection (數(shù)據(jù)庫(kù)連接對(duì)象)

A:獲取執(zhí)行sql的對(duì)象

//創(chuàng)建向數(shù)據(jù)庫(kù)發(fā)送sql語(yǔ)句的statement對(duì)象
Statement createStatement()

//創(chuàng)建向數(shù)據(jù)庫(kù)發(fā)送預(yù)編譯sql語(yǔ)句的PrepareStement對(duì)象
PreparedStatement prepareStatement(String sql)  

B:管理事務(wù)

//開(kāi)啟事務(wù):設(shè)置參數(shù)為false,即開(kāi)啟事務(wù)
setAutoCommit(boolean autoCommit) 

//提交事務(wù)
commit() 

//回滾事務(wù)
rollback() 
(3) Statement (執(zhí)行sql語(yǔ)句的對(duì)象)
//執(zhí)行DQL(查詢數(shù)據(jù)庫(kù)中表的記錄(數(shù)據(jù)))
ResultSet executeQuery(String sql)

//執(zhí)行DML(對(duì)數(shù)據(jù)庫(kù)中表的數(shù)據(jù)進(jìn)行增刪改)
int executeUpdate(String sql)

//執(zhí)行任意sql語(yǔ)句,但是目標(biāo)不夠明確,較少使用
boolean execute(String sql)

//把多條sql的語(yǔ)句放到同一個(gè)批處理中
addBatch(String sql)

//向數(shù)據(jù)庫(kù)總發(fā)送一批sql語(yǔ)句執(zhí)行
executeBatch()

代碼演示(以增加一條數(shù)據(jù)為例)

package cn.ideal.jdbc;

import java.sql.*;

public class StatementDemo {
    public static void main(String[] args) {

        Connection connection = null;
        Statement statement = null;
        try {
            //加載驅(qū)動(dòng)
            Class.forName("com.mysql.jdbc.Driver");

            //獲取數(shù)據(jù)庫(kù)連接對(duì)象
            connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/db1", "root", "root99");

            //定義sql語(yǔ)句
            String sql = "INSERT student(id,NAME,score) VALUES (NULL,"馬六",88);";

            //獲取執(zhí)行sql語(yǔ)句的對(duì)象
            statement = connection.createStatement();

            //執(zhí)行sql語(yǔ)句
            int count = statement.executeUpdate(sql);
            System.out.println(count);
            if (count > 0) {
                System.out.println("添加成功");
            } else {
                System.out.println("添加失敗");
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            if(statement != null){
                try {
                    statement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

            if (connection != null){
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
(4) ResultSet(結(jié)果集對(duì)象,封裝查詢結(jié)果)

ResultSet所代表的的是sql語(yǔ)句的結(jié)果集——執(zhí)行結(jié)果,當(dāng)Statement對(duì)象執(zhí)行excuteQuery()后,會(huì)返回一個(gè)ResultSet對(duì)象

//游標(biāo)向下移動(dòng)一行,判斷當(dāng)前行是否是最后一行末尾(是否有數(shù)據(jù))
//如果是,則返回false,如果不是則返回true
boolean next()

//獲取數(shù)據(jù),Xxx代表數(shù)據(jù)類型  
getXxx(參數(shù))

Eg:int getInt() ,    String getString()
    
1. int:代表列的編號(hào),從1開(kāi)始   如: getString(1)
2. String:代表列名稱。 如: getDouble("name")

案例可參考開(kāi)頭快速使用部分,自行嘗試讀取數(shù)據(jù)庫(kù)中數(shù)據(jù)后用集合框架裝載

(四) 事半功倍——工具類

通過(guò)封裝一些方法,使得出現(xiàn)一個(gè)更加通用的工具類,我們可以通過(guò)properties配置文件 ,使得信息更加直觀且容易維護(hù)

package cn.ideal.jdbc;

import java.io.FileReader;
import java.io.IOException;
import java.net.URL;
import java.sql.*;
import java.util.Properties;

public class JDBCUtils {
    private static String url;
    private static String user;
    private static String password;
    private static String driver;

    /**
     * 文件讀取
     */
    static {

        try {
            //創(chuàng)建Properties集合類
            Properties pro = new Properties();
            //獲取src路徑下的文件
            ClassLoader classLoader = JDBCUtils.class.getClassLoader();
            URL res = classLoader.getResource("jdbc.properties");
            String path = res.getPath();

            //加載文件
            pro.load(new FileReader(path));
            //獲取數(shù)據(jù)
            url = pro.getProperty("url");
            user = pro.getProperty("user");
            password = pro.getProperty("password");
            driver = pro.getProperty("driver");

            //注冊(cè)驅(qū)動(dòng)
            Class.forName(driver);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

    }

    /**
     * 獲取連接
     *
     * @return 連接對(duì)象
     */
    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(url, user, password);
    }

    /**
     * 釋放資源
     *
     * @param statement
     * @param connection
     */
    public static void close(Statement statement, Connection connection) {
        if (statement != null) {
            try {
                statement.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if (connection != null) {
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 釋放資源
     *
     * @param resultSet
     * @param statement
     * @param connection
     */
    public static void close(ResultSet resultSet, Statement statement, Connection connection) {
        if (resultSet != null) {
            try {
                resultSet.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if (statement != null) {
            try {
                statement.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if (connection != null) {
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

}

工具類測(cè)試類

package cn.ideal.jdbc;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;

public class JDBCUtilsTest {
    public static void main(String[] args) {

        Connection connection = null;
        Statement statement = null;
        try {

            connection = JDBCUtils.getConnection();

            //定義sql語(yǔ)句
            String sql = "INSERT student(id,NAME,score) VALUES (NULL,"馬六",88)";

            //獲取執(zhí)行sql語(yǔ)句的對(duì)象
            statement = connection.createStatement();

            //執(zhí)行sql語(yǔ)句
            int count = statement.executeUpdate(sql);
            System.out.println(count);
            if (count > 0) {
                System.out.println("添加成功");
            } else {
                System.out.println("添加失敗");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.close(statement,connection);
        }
    }
}

之前的文章中分別通過(guò)集合實(shí)現(xiàn)、IO實(shí)現(xiàn)、而學(xué)習(xí)數(shù)據(jù)庫(kù)后,我們可以試著通過(guò)數(shù)據(jù)庫(kù)存儲(chǔ)數(shù)據(jù),寫一個(gè)簡(jiǎn)單的登錄注冊(cè)小案例!在第五大點(diǎn)中有提到吼

(五) 補(bǔ)充:PreparedStatment
//創(chuàng)建向數(shù)據(jù)庫(kù)發(fā)送預(yù)編譯sql語(yǔ)句的prepareStatement
PreparedStatement prepareStatement(String sql) 

prepareStatement繼承自Statement,總而言之,它相較于其父類,更強(qiáng)更簡(jiǎn)單!

(1) 優(yōu)點(diǎn)
A:效率

Statement 直接編譯 SQL 語(yǔ)句,直接送到數(shù)據(jù)庫(kù)去執(zhí)行,而且其多次重復(fù)執(zhí)行sql語(yǔ)句,PreparedStatement 會(huì)對(duì)SQL進(jìn)行預(yù)編譯,再填充參數(shù),這樣效率會(huì)比較高(預(yù)編譯的SQL存儲(chǔ)在PreparedStatement中

B:可讀性

定義 SQL 語(yǔ)句的時(shí)候,常常需要使用到 Java 中的變量,在一些復(fù)雜的情況下,需要頻繁的使用到引號(hào)和單引號(hào)的問(wèn)題,變量越多,越復(fù)雜,而PreparedStatement可以使用占位符 ‘ ?’ 代替參數(shù),接下來(lái)再進(jìn)行參數(shù)的賦值,這樣有利于代碼的可讀性

C:安全性

PreparedStatement 由于預(yù)編譯,可以避免Statement中可能需要采取字符串與變量的拼接而導(dǎo)致SQL注入攻擊【編寫永等式,繞過(guò)密碼登錄】

我們先按照我們之前的做法,寫一個(gè)簡(jiǎn)單的登錄Demo,先創(chuàng)一張表!

CREATE TABLE USER(
    id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(32),
    PASSWORD VARCHAR(32)
);

SELECT * FROM USER;

INSERT INTO USER VALUES(NULL,"admin","admin888");
INSERT INTO USER VALUES(NULL,"zhangsan","123456");

接著編寫代碼

package cn.ideal.login;

import cn.ideal.jdbc.JDBCUtils;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;

public class LoginDemo {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("請(qǐng)輸入用戶名");
        String username = sc.nextLine();
        System.out.println("請(qǐng)輸入密碼");
        String password = sc.nextLine();
        
        boolean flag = new LoginDemo().login(username, password);

        if (flag) {
            System.out.println("登錄成功");
        } else {
            System.out.println("用戶名或密碼錯(cuò)誤");
        }
    }

    /**
     * 登錄方法
     */
    public boolean login(String username, String password) {
        if (username == null || password == null) {
            return false;
        }

        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;

        try {
            connection = JDBCUtils.getConnection();
            //定義sql
            String sql = "SELECT * FROM USER WHERE username = "" + username + "" AND password = "" + password + "" ";
            //獲取執(zhí)行sql的對(duì)象
            statement = connection.createStatement();
            //執(zhí)行查詢
            resultSet = statement.executeQuery(sql);

            return resultSet.next();

        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            JDBCUtils.close(resultSet,statement, connection);
        }
        return false;
    }
}

簡(jiǎn)單的來(lái)說(shuō),這樣一個(gè)簡(jiǎn)單的登錄Demo就寫好了,但是這個(gè)時(shí)候,SQL注入問(wèn)題中的一種情況就出現(xiàn)了,或許你聽(tīng)過(guò),在早些年的時(shí)候,漏洞還是蠻常見(jiàn)的,一些黑客或者腳本小子們常常使用一些SQL注入的手段進(jìn)行目標(biāo)網(wǎng)站后臺(tái)的入侵,我們今天所講的這一種,就是其中一種,叫做SQL萬(wàn)能注入(SQL萬(wàn)能密碼)

我們先來(lái)觀察一下上述代碼中關(guān)于SQL語(yǔ)句的部分

 String sql = "SELECT * FROM USER WHERE username = "" + username + "" AND password = "" + password + "" ";

也就是說(shuō)它將我們所輸入的 usernamepassword合成為SQL查詢語(yǔ)句, 當(dāng)數(shù)據(jù)庫(kù)中不存在這樣的字段就代表輸入錯(cuò)誤,但是對(duì)于存在SQL注入漏洞的程序,則可以通過(guò)構(gòu)造一些特殊的字符串,達(dá)到登錄的目的,先貼出來(lái)測(cè)試結(jié)果

//運(yùn)行結(jié)果
請(qǐng)輸入用戶名
admin
請(qǐng)輸入密碼
1" or "1" = "1
登錄成功

如果我們將上述代碼中密碼 (username) 部分用我們的這些內(nèi)容代替是怎么樣的呢

 String sql = "SELECT * FROM USER WHERE username = "admin" AND PASSWORD = "1" or "1" = "1" ";
補(bǔ)充:在SQL語(yǔ)句中邏輯運(yùn)算符具有優(yōu)先級(jí),= 優(yōu)先于 and ,and 優(yōu)先于 or

所以上面的式子中 AND先被執(zhí)行,當(dāng)然返回錯(cuò),接著執(zhí)行or部分,對(duì)于一個(gè)永等式 ‘1’ = ‘1‘ 來(lái)說(shuō)返回值永遠(yuǎn)是true,所以SQL查詢結(jié)果為true,即可以登錄成功

//使用PrepareStemen替代主要部分

//定義sql
String sql = "SELECT * FROM USER WHERE username = ? AND password = ?";
//獲取執(zhí)行sql的對(duì)象
preparedStatement = connection.prepareStatement(sql);
//給?賦值
preparedStatement.setString(1, username);
preparedStatement.setString(2, password);

//執(zhí)行查詢
resultSet = preparedStatement.executeQuery();

//運(yùn)行結(jié)果
請(qǐng)輸入用戶名
admin
請(qǐng)輸入密碼
1" or "1" = "1
用戶名或密碼錯(cuò)誤

?

結(jié)尾:

如果內(nèi)容中有什么不足,或者錯(cuò)誤的地方,歡迎大家給我留言提出意見(jiàn), 蟹蟹大家 !^_^

如果能幫到你的話,那就來(lái)關(guān)注我吧!(系列文章均會(huì)在公眾號(hào)第一時(shí)間更新)

在這里的我們素不相識(shí),卻都在為了自己的夢(mèng)而努力 ?

一個(gè)堅(jiān)持推送原創(chuàng)Java技術(shù)的公眾號(hào):理想二旬不止

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/75797.html

相關(guān)文章

  • 【JavaWeb】客戶關(guān)系管理系統(tǒng)

    摘要:前言為了鞏固開(kāi)發(fā)的流程,我們?cè)倌靡粋€(gè)客戶關(guān)系管理系統(tǒng)來(lái)練手成果圖我們完成的就是下面的項(xiàng)目搭建配置環(huán)境配置導(dǎo)入開(kāi)發(fā)包建立開(kāi)發(fā)用到的程序包在數(shù)據(jù)庫(kù)創(chuàng)建相對(duì)應(yīng)的表開(kāi)發(fā)實(shí)體開(kāi)發(fā)實(shí)體十分簡(jiǎn)單,對(duì)照著數(shù)據(jù)庫(kù)的表就行了各種開(kāi)發(fā)獲取數(shù)據(jù)庫(kù)連接池的導(dǎo)入配置文 前言 為了鞏固開(kāi)發(fā)的流程,我們?cè)倌靡粋€(gè)客戶關(guān)系管理系統(tǒng)來(lái)練手...! 成果圖 我們完成的就是下面的項(xiàng)目! showImg(https://segm...

    Arno 評(píng)論0 收藏0
  • 阿里p8架構(gòu)師談,對(duì)于Java程序猿學(xué)習(xí)當(dāng)中各個(gè)階段的建議。

    摘要:第三部分對(duì)于參加工作年到年的同學(xué)。我當(dāng)時(shí)看的是大話設(shè)計(jì)模式這本書,并且寫了完整版的設(shè)計(jì)模式博客。這一年,你必須對(duì)于設(shè)計(jì)模式了如指掌,大話設(shè)計(jì)模式可以作為你的開(kāi)端。與此同時(shí),這個(gè)階段你要做的事情還遠(yuǎn)不止如此。 這一部分其實(shí)也算是今天的重點(diǎn),這一部分用來(lái)回答很多群里的朋友所問(wèn)過(guò)的問(wèn)題,那就是大佬你是如何學(xué)習(xí)Java的,能不能給點(diǎn)建議? 今天我是打算來(lái)點(diǎn)干貨,因此咱們就不說(shuō)一些學(xué)習(xí)方法和技巧...

    sevi_stuo 評(píng)論0 收藏0
  • 深度學(xué)習(xí)將走向更加開(kāi)放的未來(lái)

    摘要:國(guó)內(nèi)互聯(lián)網(wǎng)巨頭百度也在近期表明,將發(fā)起建立一個(gè)名為深盟的分布式機(jī)器學(xué)習(xí)開(kāi)源平臺(tái),由旗下深度學(xué)習(xí)研究院牽頭,聯(lián)合來(lái)自卡耐基梅隴大學(xué)華盛頓大學(xué)紐約大學(xué)香港科技大學(xué)的多位系統(tǒng)開(kāi)發(fā)者,共同推出旨在大幅降低機(jī)器深度學(xué)習(xí)門檻的蟲(chóng)洞項(xiàng)目。 當(dāng)前人工智能之所以能夠引起大家的興奮和廣泛關(guān)注,在很大程度上是源于深度學(xué)習(xí)的研究進(jìn)展。這項(xiàng)機(jī)器學(xué)習(xí)技術(shù)為計(jì)算機(jī)視覺(jué)、語(yǔ)音識(shí)別和自然語(yǔ)言處理帶來(lái)了巨大的、激動(dòng)人心的進(jìn)步,...

    Render 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<