java連線資料庫

一隻小呆呆發表於2020-09-23

一、建立一個maven專案

1.建立專案

在這裡插入圖片描述

2.選擇maven=》next

在這裡插入圖片描述

3.自定義組名專案名=》next

在這裡插入圖片描述

4.finish

在這裡插入圖片描述

二、在maven中央倉庫中找到5.1.17的資料庫依賴

<dependencies>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.17</version>
</dependency>
</dependencies>

在這裡插入圖片描述

出現此,表明下載完成
在這裡插入圖片描述

三、編寫程式碼連線資料庫

1.建立Test類測試

在這裡插入圖片描述

2.準備工作

要連線的資料庫
在這裡插入圖片描述

連線資料庫的ip=》在虛擬機器中檢視網路連線
在這裡插入圖片描述

埠號=》Navicat新建MySQL
在這裡插入圖片描述

使用者名稱:root
密碼:123456

3.編寫程式碼

1.方法一,在篩選時會發生sql注入

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

//連線資料庫需要知道,資料庫的ip地址(master),埠號,使用者名稱,密碼 要連線的資料庫名稱
//通過視覺化工具Navicat,找到埠號,通過虛擬機器中的網路連線知道ip
//ip:192.168.154.110  port:3306 username:root  password:123456
public class Test {
    public static void main(String[] args) throws  Exception{
        //1.以對映方式載入Driver,丟擲異常
        Class.forName("com.mysql.jdbc.Driver");
        //2.建立連線
        Connection conn = DriverManager.getConnection("jdbc:mysql://master:3306/shujuku", "root", "123456");
        //3.執行sql語句
        //方式一
        //3.1.1建立sqlyu語句
        String sql="select * from student;";
        //3.1.2通過建立的連線物件建立執行器,用來執行sql語句
        Statement statement = conn.createStatement();
        //3.1.3通過執行器執行sql語句,得到結果集
        ResultSet rs = statement.executeQuery(sql);
        //3.1.4將執行的結果在控制檯顯示
        while(rs.next()){
            int id = rs.getInt("id");
            String name = rs.getString("name");
            int age = rs.getInt("age");
            String sex = rs.getString("sex");
            System.out.println(id+"--"+name+"--"+age+"--"+sex);
        }
         conn.close();
        statement.close();
        rs.close();

    }
}

在這裡插入圖片描述
如果sql語句為篩選語句,在該引數的時候可能會注入sql語句,導致結果出錯
sql注入

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

//連線資料庫需要知道,資料庫的ip地址(master),埠號,使用者名稱,密碼 要連線的資料庫名稱
//通過視覺化工具Navicat,找到埠號,通過虛擬機器中的網路連線知道ip
//ip:192.168.154.110  port:3306 username:root  password:123456
public class Test {
    public static void main(String[] args) throws  Exception{
        //1.以對映方式載入Driver,丟擲異常
        Class.forName("com.mysql.jdbc.Driver");
        //2.建立連線
        Connection conn = DriverManager.getConnection("jdbc:mysql://master:3306/shujuku", "root", "123456");
        //3.執行sql語句
        //方式一
        //3.1.1建立sqlyu語句
        //查詢ID為1005的學生資訊,本來是作為引數,加在sql後面,但是如果加上其他語句,
        // 不僅僅是引數,還會成為sql的邏輯語句
        String studntid="1005 or 1=1";
        String sql="select * from student where id="+studntid;
        //3.1.2通過建立的連線物件建立執行器,用來執行sql語句
        Statement statement = conn.createStatement();
        //3.1.3通過執行器執行sql語句,得到結果集
        ResultSet rs = statement.executeQuery(sql);
        //3.1.4將執行的結果在控制檯顯示
        while(rs.next()){
            int id = rs.getInt("id");
            String name = rs.getString("name");
            int age = rs.getInt("age");
            String sex = rs.getString("sex");
            System.out.println(id+"--"+name+"--"+age+"--"+sex);
        }
         conn.close();
        statement.close();
        rs.close();
    }
}

結果不是查詢不到,而是遍歷輸出,因為or 1= 1的存在使得每條結果都成立
在這裡插入圖片描述

2.方法二

避免sql注入

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class Test1 {
    public static void main(String[] args) throws Exception{
        Class.forName("com.mysql.jdbc.Driver");
        Connection conn = DriverManager.getConnection("jdbc:mysql://master:3306/shujuku", "root", "123456");
        String sql="select * from student where id=?";//給上佔位符
        //方式二
        //3.2.1建立執行器
        PreparedStatement ps = conn.prepareStatement(sql);
        ps.setString(1,"1005 or 1=1");//第一個佔位符給1,如果有兩個問號,設定兩次,下次給2
        //3.2.1執行語句,獲取結果集
        ResultSet rs = ps.executeQuery();
        while (rs.next()){
            int id = rs.getInt("id");
            String name = rs.getString("name");
            int age = rs.getInt("age");
            String sex = rs.getString("sex");
            System.out.println(id+"--"+name+"--"+age+"--"+sex);
        }
        conn.close();
        ps.close();
        rs.close();
    }
}

未查詢到
在這裡插入圖片描述

四、總結

格式1建立Statement步驟
	1.反射載入Driver
		Class.forName("com.mysql.jdbc.Driver");
	2.建立連線
		Connection conn=DriverManager.getConnection("jdbc:mysql://master:3306/shujia","root","123456");
	3.1.建立執行器
		Statement statement=conn.createStatement();
	3.2.執行器執行sql語句 獲得ResultSet結果集
		String sql="select * from student";
		ResultSet rs = statement.executeQuery(sql);
	4.解析結果
		 while(rs.next()){
            int id = rs.getInt("id");
            String name = rs.getString("name");
            int age = rs.getInt("age");
            String sex = rs.getString("sex");
            System.out.println(id+"-"+name+"-"+age+"-"+sex);
        }
    5.關閉
        rs.close();
        statement.close();
        conn.close();
格式2preparedStatement步驟
	1.反射載入Driver
		Class.forName("com.mysql.jdbc.Driver");
	2.建立連線
		Connection conn=DriverManager.getConnection("jdbc:mysql://master:3306/shujia","root","123456");
	3.1建立執行器 首先載入sql的格式
		//使用PreparedStatement執行器執行sql時,引數通過?進行傳遞
		String sql="select * from student where id=?";
		PreparedStatement ps = conn.prepareStatement(sql);
		//通過ps.set資料型別(index,value)進行賦值
		ps.setString(1,"1055");
	3.2通過執行器執行sql 獲取結果集
		ResultSet rs = ps.executeQuery();// 執行sql語句 獲取結果集
    4解析結果集
        while(rs.next()){
            int id = rs.getInt("id");
            String name = rs.getString("name");
            int age = rs.getInt("age");
            String sex = rs.getString("sex");
            System.out.println(id+"-"+name+"-"+age+"-"+sex);
        }
    5關閉
        rs.close();
        ps.close();
        conn.close();
sql注入:引數中可以有sql語句        
區別:Statment可以進行sql注入,PreparedStatement不行

為了避免多次開啟連線,可以把連線資訊寫入到工具類之中
	例如:// 工具類 連線工具 用於連線mysql
public class JDBCUtil {
    private static String driver=null;
    private static String url=null;
    private static String username=null;
    private static String password=null;
    private static Connection conn=null;
    static{
        Properties properties = new Properties();
        // 讀取配置檔案 通過反射的方式
        InputStream in = JDBCUtil.class.getClassLoader().getResourceAsStream("mysql.properties");
        // 把讀取到檔案的流放到properties中進行載入
        try {
            properties.load(in);
        } catch (IOException e) {
            e.printStackTrace();
        }
        driver=properties.getProperty("driver");
        url=properties.getProperty("url");
        username=properties.getProperty("username");
        password=properties.getProperty("password");
        try {
            Class.forName(driver);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        try {
           conn = DriverManager.getConnection(url, username, password);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    public static Connection getConnection()throws Exception{
        return conn;
    }
    public static void close(PreparedStatement ps, ResultSet rs,Connection conn){
        if(rs!=null){
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(ps!=null){
            try {
                ps.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(conn!=null){
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }


    }
    public static void close(PreparedStatement ps,Connection conn){
        if(ps!=null){
            try {
                ps.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(conn!=null){
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }


    }
}


配置檔案:避免程式上線之後,內容發生更改時,需要再次打包上傳
在Maven專案中自己提供了一個資源目錄resources,專門用於存放配置檔案
	配置檔案的格式:檔名稱.properties
	內容格式:KV格式
		例如:username=root
	讀取配置檔案步驟:
		1.建立Java提供的Properties物件,用於操作配置檔案
			Properties properties = new Properties();
		2.通過反射讀取配置檔案
			 InputStream in = 當前類名.class.getClassLoader().getResourceAsStream("配置檔名稱");
		3.Properties物件載入in
			properties.load(in);
		4.獲取配置檔案中的zhi
			properties.getProperties(String key);
	注意:是否正確讀取配置檔案,通過Ctrl+滑鼠左鍵點選 是否能進入到配置檔案中,可以就是正確讀取

java
java入門基礎學習(一)
java入門基礎學習(二)
java入門基礎學習(三)
java入門基礎學習(四)
java入門基礎學習(五)
java入門基礎學習(六)
java入門基礎學習(七)
java入門基礎學習(八)
java入門基礎學習(九)
java入門基礎學習(十)
java入門基礎學習(十一)
java入門基礎學習(十二)
java入門基礎學習(十三)
java入門基礎學習(十四)Maven Git
java總結,題目+筆記
java進階之常見物件(一)
java進階之常見物件(二)
java進階之氣泡排序
java進階之選擇排序
java進階之物件導向(封裝)
java進階之物件導向(程式碼塊、繼承)
java進階之物件導向(多型、抽象、介面)
java進階之匿名內部類、訪問修飾符、包
java進階之io流(位元組流,字元流)
Linux
Linux基礎一
Linux基礎二
Mysql
mysql一
mysql二
mysql三
mysql四

相關文章