国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Java連接mysql數(shù)據(jù)庫(kù)

這篇具有很好參考價(jià)值的文章主要介紹了Java連接mysql數(shù)據(jù)庫(kù)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

一、Java連接mysql數(shù)據(jù)庫(kù)

1.1 流程

java連接mysql大致需要這六步:

  1. 導(dǎo)入驅(qū)動(dòng)包:這里我使用的是mysql-connector-java-8.0.17.jar(點(diǎn)擊下載),這個(gè)包連接mysql5.6,5.7,8.0版本都沒(méi)問(wèn)題。
    Class.forName("com.mysql.cj.jdbc.Driver");
  2. url和賬戶名密碼
    JDBC連接串:jdbc:mysql://<地址>:<端口>/<數(shù)據(jù)庫(kù)>
  3. 獲取連接DriverManager.getConnection(url, user, password);
  4. 執(zhí)行sql的Statement對(duì)象connection.createStatement();
  5. 執(zhí)行SQL
  6. 釋放連接

1.2 一個(gè)測(cè)試連接的java程序

JdbcFirstDemo.java

package com.peng.less01;

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

public class JdbcFirstDemo {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        // 1.導(dǎo)入驅(qū)動(dòng)類
        Class.forName("com.mysql.cj.jdbc.Driver");
        // 2.用戶信息和url
        String url = "jdbc:mysql://localhost:3306/shop?useUnicode=true&characterEncoding=utf8&useSSL=false";
        String user = "root";
        String password = "12345678";
        // 3.獲取連接
        Connection conn = DriverManager.getConnection(url, user, password);
        // 4.執(zhí)行SQL的對(duì)象
        Statement sta =  conn.createStatement();
        // 5.執(zhí)行SQL
        String sql = "select * from account";
        ResultSet rs = sta.executeQuery(sql);
        while (rs.next()){
            System.out.println("id= " + rs.getObject("id"));
            System.out.println("name= " + rs.getObject("name"));
            System.out.println("money= " + rs.getObject("money"));
            System.out.println("=========================================");
        }
        // 6.釋放連接
        rs.close();
        sta.close();
        conn.close();
    }
}

這里使用的是VScode,connector包放到了lib目錄下,代碼放在了src/com/peng/less01下。
執(zhí)行結(jié)果如下,顯示了shop.account表下面的三條記錄。
java連接mysql數(shù)據(jù)庫(kù),JAVA,數(shù)據(jù)庫(kù),mysql,java,jdbc,sql注入

二、優(yōu)化:創(chuàng)建一個(gè)工具類

2.1 存在的問(wèn)題

1、JDBC連接串,用戶名,密碼等都存在于代碼中,需要進(jìn)行解耦

2、創(chuàng)建連接,釋放連接這些操作都是固定的,沒(méi)必要每次都重復(fù)寫(xiě)這些代碼(創(chuàng)建函數(shù)解決

2.2 創(chuàng)建配置文件和工具類

src/db.properties 文件中記錄driver,url,user,password

driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/shop?useUnicode=true&characterEncoding=utf8&useSSL=false
user=root
password=12345678

src/com/peng/less02/utils/JdbcUtils.java 工具類:讀取properties配置文件
自動(dòng)讀取配置信息,加載mysql驅(qū)動(dòng)。

package com.peng.less02.utils;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

// 這是一個(gè)工具類,用來(lái)減少重復(fù)操作
public class JdbcUtils {

    private static String driver = null;
    private static String url = null;
    private static String user = null;
    private static String password = null;
    static{
        
        try{
            // 讀取db.properties
            InputStream in = JdbcUtils.class.getClassLoader().getResourceAsStream("db.properties");
            Properties properties = new Properties();
            properties.load(in);
            driver = properties.getProperty("driver");
            url = properties.getProperty("url");
            user = properties.getProperty("user");
            password = properties.getProperty("password");

            // 加載驅(qū)動(dòng)
            Class.forName(driver);  
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    // 創(chuàng)建連接
    public static Connection getConnection() throws SQLException{
        return DriverManager.getConnection(url,user,password);
    }
    // 釋放連接
    public static void releaseConnection(Connection conn, Statement sta, ResultSet rs){
        if (rs != null){
            try {
                rs.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        if (sta != null){
            try {
                sta.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        if (conn != null){
            try {
                conn.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

}

2.3 測(cè)試使用工具類進(jìn)行CRUD操作

測(cè)試插入操作
src/com/peng/less02/TestInsert.java

package com.peng.less02;

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

import com.peng.less02.utils.JdbcUtils;

public class TestInsert {
    public static void main(String[] args) {
        Connection conn = null;
        Statement sta = null;
        ResultSet rs = null;
        try {
            conn = JdbcUtils.getConnection();
            sta = conn.createStatement();
            String sql = "insert into account(`id`,`name`,`money`) values(4,'藥水哥',4698888)";
            int i = sta.executeUpdate(sql);
            if (i > 0){
                System.out.println("插入成功!");
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            JdbcUtils.releaseConnection(conn, sta, rs);
        }
    }
    
}

測(cè)試更新操作
src/com/peng/less02/TestUpdate.java

package com.peng.less02;
import java.sql.*;
import com.peng.less02.utils.JdbcUtils;

public class TestUpdate {
    public static void main(String[] args) {
        Connection conn = null;
        Statement sta = null;
        try {
            conn = JdbcUtils.getConnection();
            sta = conn.createStatement();
            String sql = "update account set `money`=238888 where id=3";
            int i = sta.executeUpdate(sql);
            if (i > 0){
                System.out.println("更新成功");
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            JdbcUtils.releaseConnection(conn, sta, null);
        }
    }
    
}

測(cè)試讀取操作

package com.peng.less02;
import java.sql.*;
import com.peng.less02.utils.JdbcUtils;

public class TestSelect {
    public static void main(String[] args) {
        Connection conn = null;
        Statement sta = null;
        ResultSet rs = null;

        try {
            conn = JdbcUtils.getConnection();
            sta = conn.createStatement();
            String sql = "select * from account";
            rs = sta.executeQuery(sql);
            while (rs.next()){
                System.out.println("id= " + rs.getInt("id"));
                System.out.println("name= " + rs.getString("name"));
                System.out.println("money= " + rs.getObject("money"));
                System.out.println("======================================================");
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            JdbcUtils.releaseConnection(conn, sta, rs);
        }
    }

}

三、SQL注入問(wèn)題

這里寫(xiě)一個(gè)登錄認(rèn)證程序,如果賬號(hào),密碼輸入正確則允許登錄。為了測(cè)試,這里的允許登錄改為輸出賬號(hào)密碼。

還使用前面寫(xiě)的JdbcUtils工具類

可以看到,這里我輸入的用戶名/密碼是:’ or '1=1 ??? ’ or '1=1
然后輸出了user表中的所有數(shù)據(jù),這明顯是不合法的。存在sql注入的問(wèn)題

問(wèn)題就在于這段代碼,sql是拼接而成的。

String sql = "select * from user where `username`='" + username + "' and `password`='" + password + "'";

拼接的sql為:select * from user where `username`='' or '1=1' and `password`='' or '1=1';

3.1 SQL注入示例

SqlInjection.java

package com.peng.less02;

import com.peng.less02.utils.JdbcUtils;
import java.sql.*;
public class SqlInjection {
    public static void main(String[] args) {
        login("' or '1=1", "' or '1=1");
    }

    // 登錄功能
    public static void login(String username, String password){
        Connection conn = null;
        Statement sta = null;
        ResultSet rs = null;

        try {
            conn = JdbcUtils.getConnection();
            sta = conn.createStatement();
            //這段代碼中sql是變量拼接而成的
            String sql = "select * from user where `username`='" + username + "' and `password`='" + password + "'";
            rs = sta.executeQuery(sql);
            //輸入正確的賬號(hào)密碼就能夠登錄,這里為了測(cè)試就(輸入正確輸出賬號(hào)密碼)
            while (rs.next()){
                System.out.println("id= " + rs.getInt("id"));
                System.out.println("username= " + rs.getString("username"));
                System.out.println("password= " + rs.getObject("password"));
                System.out.println("======================================================");
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            JdbcUtils.releaseConnection(conn, sta, rs);
        }
    }
}

java連接mysql數(shù)據(jù)庫(kù),JAVA,數(shù)據(jù)庫(kù),mysql,java,jdbc,sql注入

四、使用PreparedStatement防止SQL注入

  • 使用PreparedStatement,防止SQL注入,同時(shí)對(duì)于執(zhí)行多次的SQL更加高效

PreparedStatement,對(duì)sql進(jìn)行了預(yù)編譯,傳入的參數(shù)只會(huì)被當(dāng)作字符串來(lái)處理,而不會(huì)像前面對(duì)sql進(jìn)行了拼接。

流程如下:

先編寫(xiě)sql --> 進(jìn)行預(yù)編譯 --> 增加sql參數(shù)值 --> 執(zhí)行sql

SqlInjection.java

package com.peng.less03;

import com.peng.less02.utils.JdbcUtils;
import java.sql.*;

public class SqlInjection {
    public static void main(String[] args) {
        // login("'' or 1=1", "'' or 1=1");
        login("張三", "zhangsan");
    }

    // 登錄功能
    public static void login(String username, String password){
        Connection conn = null;
        PreparedStatement psta = null;
        ResultSet rs = null;

        try {
            conn = JdbcUtils.getConnection();
            //這里使用 ? 占位符來(lái)代替
            String sql = "select * from user where `username`=? and `password`=?";
            //使用PreparedStatement,防止SQL注入,同時(shí)對(duì)于執(zhí)行多次的SQL更加高效
            psta = conn.prepareStatement(sql);
            psta.setString(1,username);
            psta.setObject(2,password);
            rs = psta.executeQuery();
            //輸入正確的賬號(hào)密碼就能夠登錄,這里為了測(cè)試就(輸入正確輸出賬號(hào)密碼)
            while (rs.next()){
                System.out.println("id= " + rs.getInt("id"));
                System.out.println("username= " + rs.getString("username"));
                System.out.println("password= " + rs.getObject("password"));
                System.out.println("======================================================");
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            JdbcUtils.releaseConnection(conn, psta, rs);
        }
    }
}

五、JDBC操作事務(wù)

和用sql執(zhí)行事務(wù)類似,創(chuàng)建連接后setAutoCommit(false),最后commit(),失敗則rollback()
注意:rollback()部分可以不用寫(xiě),事務(wù)失敗會(huì)自動(dòng)回滾。

TestTransaction.java文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-780751.html

package com.peng.less04;
import java.sql.*;

// 仍然使用前面寫(xiě)的JdbcUtils工具類
import com.peng.less02.utils.JdbcUtils;

public class TestTransaction {
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement pst = null;
        
        try {
            conn = JdbcUtils.getConnection();
            // 關(guān)閉自動(dòng)提交,開(kāi)啟事務(wù)
            conn.setAutoCommit(false);
            //模擬一個(gè)轉(zhuǎn)賬事務(wù),A向大帥哥轉(zhuǎn)賬100塊
            String sql1 = "update account set `money`=money - 100 where `name`='A'";
            pst = conn.prepareStatement(sql1);
            pst.executeUpdate();

            // int x = 1/0;
            String sql2 = "update account set `money`=money + 100 where `name`='大帥哥'";
            conn.prepareStatement(sql2).executeUpdate();

            conn.commit();
            System.out.println("Success!");
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            try {
                // rollback()可以不用寫(xiě),失敗的話會(huì)自動(dòng)回滾
                conn.rollback();
            } catch (SQLException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            e.printStackTrace();
        }finally{
            JdbcUtils.releaseConnection(conn, pst, null);
        }
    }
}

到了這里,關(guān)于Java連接mysql數(shù)據(jù)庫(kù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • java代碼實(shí)現(xiàn),利用JDBC接口-連接Mysql數(shù)據(jù)庫(kù)

    java代碼實(shí)現(xiàn),利用JDBC接口-連接Mysql數(shù)據(jù)庫(kù)

    1、JDBC本質(zhì)上是一個(gè)接口,也就是java語(yǔ)言操作數(shù)據(jù)庫(kù)的一套API(應(yīng)用程序編程接口), 接口就規(guī)則,也就是sun公司創(chuàng)建了一個(gè)jdbc接口,各個(gè)sql(數(shù)據(jù)庫(kù)管理系統(tǒng))去實(shí)現(xiàn)接口提供jar包。其優(yōu)點(diǎn)JDBC不是指單一操作某一個(gè)數(shù)據(jù)庫(kù)。各個(gè)廠商使用相同的接口。不同的sql廠家實(shí)現(xiàn)

    2024年02月09日
    瀏覽(94)
  • 【Java】IntelliJ IDEA使用JDBC連接MySQL數(shù)據(jù)庫(kù)并寫(xiě)入數(shù)據(jù)

    【Java】IntelliJ IDEA使用JDBC連接MySQL數(shù)據(jù)庫(kù)并寫(xiě)入數(shù)據(jù)

    在 IntelliJ IDEA 中連接 MySQL 數(shù)據(jù)庫(kù)并將數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)表中,使用 Java 和 JDBC(Java Database Connectivity)實(shí)現(xiàn)。 下載并安裝 IntelliJ IDEA 下載并安裝 MySQL 數(shù)據(jù)庫(kù) 下載 MySQL Connector/J 驅(qū)動(dòng)程序(JDBC 驅(qū)動(dòng)程序) 使用 Navicat 創(chuàng)建一個(gè) MySQL 數(shù)據(jù)庫(kù) 打開(kāi) IntelliJ IDEA。 選擇 \\\"File\\\"→ “New” →

    2024年02月05日
    瀏覽(51)
  • java中連接數(shù)據(jù)庫(kù)com.mysql.jdbc.Driver和com.mysql.cj.jdbc.Driver的區(qū)別?

    com.mysql.jdbc.Driver 和 com.mysql.cj.jdbc.Driver 是MySQL數(shù)據(jù)庫(kù)連接驅(qū)動(dòng)的不同版本。 com.mysql.jdbc.Driver :這是舊版的MySQL JDBC驅(qū)動(dòng)(版本5.x)。它已經(jīng)過(guò)時(shí),不再推薦使用。如果您使用較舊的MySQL版本(如MySQL 5.7及以下),可以考慮使用此驅(qū)動(dòng)。但請(qǐng)注意,該驅(qū)動(dòng)在MySQL 8.0及更高版本上可

    2024年02月14日
    瀏覽(97)
  • JDBC 技術(shù) | Java連接MySQL數(shù)據(jù)庫(kù)(四萬(wàn)字零基礎(chǔ)保姆級(jí)超全詳解)

    JDBC 技術(shù) | Java連接MySQL數(shù)據(jù)庫(kù)(四萬(wàn)字零基礎(chǔ)保姆級(jí)超全詳解)

    管他啥是啥,看就完了!如果覺(jué)得博主寫(xiě)的不錯(cuò),可以點(diǎn)贊關(guān)注支持一下博主哦!有什么地方存在不足或者錯(cuò)誤的,煩請(qǐng)各位大佬在評(píng)論區(qū)指正。萬(wàn)分感謝!! 本文結(jié)合了韓順平零基礎(chǔ)學(xué)java,黑馬程序員零基礎(chǔ)學(xué) JavaWeb,等多個(gè)視頻的相關(guān)知識(shí)內(nèi)容整理而來(lái)?;ㄙM(fèi)了很多很多

    2024年02月05日
    瀏覽(88)
  • java通過(guò)JDBC連接mysql8.0數(shù)據(jù)庫(kù),并對(duì)數(shù)據(jù)庫(kù)中的表進(jìn)行增刪改查操作

    java通過(guò)JDBC連接mysql8.0數(shù)據(jù)庫(kù),并對(duì)數(shù)據(jù)庫(kù)中的表進(jìn)行增刪改查操作

    目錄 一、JDBC簡(jiǎn)介 二、添加依賴 三、JDBC操作數(shù)據(jù)庫(kù)的步驟 四、JDBC操作數(shù)據(jù)庫(kù)——增刪改查 (一)新增數(shù)據(jù) (二)刪除數(shù)據(jù) (三)修改數(shù)據(jù) (四)查詢數(shù)據(jù) (五)多表連接查詢 ????????Java數(shù)據(jù)庫(kù)連接,(Java Database Connectivity,簡(jiǎn)稱JDBC)是java語(yǔ)言中用來(lái)規(guī)范客戶端程序如何來(lái)訪問(wèn)數(shù)

    2024年02月03日
    瀏覽(710)
  • JAVA連接數(shù)據(jù)庫(kù) JDBC編程

    JAVA連接數(shù)據(jù)庫(kù) JDBC編程

    提供修改數(shù)據(jù)庫(kù)和查詢數(shù)據(jù)庫(kù)的代碼,兩者只有很細(xì)微的差別 ????????注意在進(jìn)行連接數(shù)據(jù)庫(kù)首先你得下載你對(duì)應(yīng)MYSQL版本的JDBC驅(qū)動(dòng)包,比如MYSQL8.0版本的你就要下載MYSQL8.0版本的JDBC驅(qū)動(dòng)包,MYSQL5.1版本的你就要下載MYSQL5.1版本的JDBC驅(qū)動(dòng)包 我下載的8.0版本的驅(qū)動(dòng)包就是這個(gè)

    2024年02月15日
    瀏覽(98)
  • 【大數(shù)據(jù)筆記】java jdbc連接hive數(shù)據(jù)庫(kù);java hive連接kerberos

    【大數(shù)據(jù)筆記】java jdbc連接hive數(shù)據(jù)庫(kù);java hive連接kerberos

    1、pom.xml配置 ????????dependency ????????????groupIdorg.apache.hive/groupId ????????????artifactIdhive-jdbc/artifactId ????????????scope2.1.1/scope ????????/dependency 2、驅(qū)動(dòng) org.apache.hive.jdbc.HiveDriver 3、用傳統(tǒng)改的Class.forName,然后DriverManager去拿。 二、java hive連接kerberos

    2024年01月19日
    瀏覽(18)
  • Java-JDBC連接數(shù)據(jù)庫(kù)

    Java-JDBC連接數(shù)據(jù)庫(kù)

    目錄 一、JDBC開(kāi)發(fā)步驟 1.Java程序連接數(shù)據(jù)庫(kù) 1.1引入MySQL驅(qū)動(dòng)包 1.2Java連接MySQL步驟 2 實(shí)現(xiàn)增刪改查操作 2.1 添加數(shù)據(jù) 2.2 修改數(shù)據(jù) 2.3 刪除數(shù)據(jù) 2.4 查詢數(shù)據(jù) 二、JDBC處理相關(guān)問(wèn)題 1 解決SQL注入問(wèn)題 1.1、問(wèn)題演示 1.2、解決問(wèn)題 2 JDBC事務(wù)處理 3 獲取自增長(zhǎng)鍵值 4 批處理操作 1.1 引入

    2024年02月09日
    瀏覽(90)
  • 【Java 進(jìn)階篇】深入理解 JDBC:Java 數(shù)據(jù)庫(kù)連接詳解

    【Java 進(jìn)階篇】深入理解 JDBC:Java 數(shù)據(jù)庫(kù)連接詳解

    數(shù)據(jù)庫(kù)是現(xiàn)代應(yīng)用程序的核心組成部分之一。無(wú)論是 Web 應(yīng)用、移動(dòng)應(yīng)用還是桌面應(yīng)用,幾乎都需要與數(shù)據(jù)庫(kù)交互以存儲(chǔ)和檢索數(shù)據(jù)。Java 提供了一種強(qiáng)大的方式來(lái)實(shí)現(xiàn)與數(shù)據(jù)庫(kù)的交互,即 JDBC(Java 數(shù)據(jù)庫(kù)連接)。本文將深入探討 JDBC 的各個(gè)方面,從基本概念到實(shí)際編程示例

    2024年02月07日
    瀏覽(26)
  • 通過(guò)JDBC連接數(shù)據(jù)庫(kù)并用Java把數(shù)據(jù)寫(xiě)入數(shù)據(jù)庫(kù)

    通過(guò)JDBC連接數(shù)據(jù)庫(kù)并用Java把數(shù)據(jù)寫(xiě)入數(shù)據(jù)庫(kù)

    目錄 1.新建項(xiàng)目 2.在src包下新建lib包,用來(lái)存放jar包(下載對(duì)應(yīng)jar包復(fù)制到lib包里) 3.右鍵導(dǎo)入的jar包,找到并單擊\\\"添加到庫(kù)\\\"(add....) 4.在src包下新建bean包,新建class類 5.class類中寫(xiě)數(shù)據(jù)庫(kù)表中對(duì)應(yīng)的列名的set get方法、空參、有參(String方法)注意:類名為私有類(private),新建類時(shí)數(shù)

    2024年02月02日
    瀏覽(97)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包