日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

java 入侵 mysql_Java访问数据库Mysql

發(fā)布時(shí)間:2023/12/19 数据库 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 入侵 mysql_Java访问数据库Mysql 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、概述

本文主要介紹Java接連數(shù)據(jù)庫的基本方法和步驟,并對(duì)其中的幾個(gè)要點(diǎn)進(jìn)行簡(jiǎn)要說明。

二、數(shù)據(jù)庫訪問步驟

在Java中連接數(shù)據(jù)庫進(jìn)行的訪問主要有以下幾個(gè)步驟:

加載數(shù)據(jù)庫驅(qū)動(dòng)

注冊(cè)數(shù)據(jù)庫驅(qū)動(dòng)

建立到數(shù)據(jù)庫的連接

訪問數(shù)據(jù)庫

首先,要調(diào)用Class.ForName()加載并注冊(cè)mysql驅(qū)動(dòng)程序類,加載驅(qū)動(dòng)程序驅(qū)動(dòng)類后,需要注冊(cè)驅(qū)動(dòng)程序類的一個(gè)實(shí)例,DriverManager類負(fù)責(zé)管理驅(qū)動(dòng)程序,這個(gè)類提供了registerDriver()方法來注冊(cè)驅(qū)動(dòng)程序類的實(shí)例,并且我們不需要親自調(diào)用這個(gè)方法,因?yàn)镈rive接口的驅(qū)動(dòng)程序類都包含了靜態(tài)代碼塊,在這個(gè)代碼塊中會(huì)調(diào)用registerDriver()方法來注冊(cè)自身的一個(gè)實(shí)例。

然后調(diào)用DriverManager類的getConnection方法建立到數(shù)據(jù)庫的連接。在建立連接后,需要對(duì)數(shù)據(jù)庫進(jìn)行訪問。在java.sql包中定義了三個(gè)接口:Statement、PrepareStatement和CallableStatement,分別對(duì)應(yīng)不同的調(diào)用方式。其中:

Statement:用于執(zhí)行靜態(tài)的sql語句。

PrepareStatement:從Statement接口繼承而來,它的對(duì)象表示一條預(yù)編譯過的sql語句,通過調(diào)用Connection對(duì)象的prepareStatement()方法得到。

CallableStatement:用于執(zhí)行sql存儲(chǔ)過程,該接口從PrepareStatement接口繼承而來,通過調(diào)用Connection對(duì)象的prepareCall()方法得到CallableStatement對(duì)象。

完整的訪問數(shù)據(jù)庫代碼如下:

packagecom.test;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.ResultSet;importjava.sql.SQLException;importjava.sql.Statement;public classCreateDB

{public static voidmain(String[] args)

{

String url="jdbc:mysql://localhost:3306";

String user="root";

String password="281889";

String driverclass="com.mysql.jdbc.Driver";//JDBC類名

try{//加載JDBC驅(qū)動(dòng),當(dāng)這個(gè)類被加載時(shí),類加載器會(huì)執(zhí)行該類的靜態(tài)代碼塊從而注冊(cè)驅(qū)動(dòng)程序的一個(gè)實(shí)例

Class.forName(driverclass);//建立數(shù)據(jù)庫的連接

Connection conn=DriverManager.getConnection(url,user,password);//訪問數(shù)據(jù)庫

Statement stmt=conn.createStatement();

stmt.execute("use information_schema");int i=0;

ResultSet rs1=stmt.executeQuery("SELECT * FROM information_schema.SCHEMATA where SCHEMA_NAME='student'");while(rs1.next()) //判斷是否含有student數(shù)據(jù)庫

i++;if(i==0)

stmt.executeUpdate("create database student");

stmt.executeUpdate("use student");int j=0;

ResultSet rs2=stmt.executeQuery("select * from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA='student' and TABLE_NAME='stuinfo' ");while(rs2.next()) //判斷數(shù)據(jù)庫中是否含有stuinfo表

j++;if(j==0)

stmt.executeUpdate("create table stuinfo(sno INT not null primary key,name VARCHAR(50) not null,age int,sex VARCHAR(50))");

stmt.addBatch("insert into stuinfo values(0420,'阿斌',25,'男')");

stmt.executeBatch();

stmt.close();

stmt=null;

conn.close();

conn=null;

}catch(ClassNotFoundException e)

{//TODO 自動(dòng)生成的 catch 塊

e.printStackTrace();

}catch(SQLException e)

{//TODO 自動(dòng)生成的 catch 塊

e.printStackTrace();

}

}

}

三、要點(diǎn)說明

1、execute(String sql)、executeUpdate(String sql)和executeQuery(String sql)的區(qū)別:

execute:執(zhí)行返回多個(gè)結(jié)果集的sql語句。

Returns:true?if the first result is a ResultSet?object

false?if it is an update count or there are no results

executeUpdate:執(zhí)行類似insert、update或者delete的sql語句。

Returns:(1) the row count for SQL Data Manipulation Language (DML) statements

(2) 0 for SQL statements that return nothing

executeQuery:執(zhí)行指定的sql語句,返回一個(gè)ResultSet對(duì)象,用于查看執(zhí)行的結(jié)果。

Returns:a?ResultSet?object that contains the data produced by the given query;

ps:executeQuery返回的ResultSet永遠(yuǎn)都不會(huì)為null

2、ResultSet對(duì)象

ResultSet對(duì)象以邏輯表格的形式封裝了執(zhí)行數(shù)據(jù)庫操作的結(jié)果集,其對(duì)象維護(hù)了一個(gè)指向當(dāng)前數(shù)據(jù)行的游標(biāo),初始狀態(tài)下游標(biāo)在第一行之前,可以通過next()方法移動(dòng)游標(biāo)到下一行。

3、Statement 與 PreparedStatement的區(qū)別(摘錄自http://www.jb51.net/article/58343.htm):

1.語法不同

Statement只支持靜態(tài)編譯,SQL語句是寫死的。

PreparedStatement支持預(yù)編譯,用?號(hào)來占位。

2.效率不同

Statement每次都要發(fā)送一條SQL語句,不支持緩存,執(zhí)行效率低。

PreparedStatement支持預(yù)編譯,緩存在數(shù)據(jù)庫,只需發(fā)送參數(shù),執(zhí)行效率快。

3.安全性不同

Statement容易被注入。

注入:狡猾的分子可以編寫特殊的SQL語句來入侵?jǐn)?shù)據(jù)庫。

例如:要查詢某個(gè)用戶的信息

一般情況:SELECT * FROM user_list where username=xxx and password=xxx;(這里的xxx本應(yīng)為用戶填寫自己的用戶名和密碼)

注入情況:SELECT * FROM user_list where username='abc' or 1=1 -- password=xxx;

這樣1=1恒等,而且在password前加上了“--”號(hào),后面的內(nèi)容成為了注釋不被執(zhí)行。也就是說,這樣就能不用密碼地查詢所有的用戶信息。

PreparedStatement,因?yàn)橐?guī)定了SQL語句中的參數(shù),所以可以防止注入。

4、判斷mysql中是否已存在某數(shù)據(jù)庫:

stmt.execute("use information_schema");int i=0;

ResultSet rs1=stmt.executeQuery("SELECT * FROM information_schema.SCHEMATA where SCHEMA_NAME='student'");while(rs1.next()) //判斷是否含有student數(shù)據(jù)庫

i++;if(i==0)

stmt.executeUpdate("create database student");

5、判斷數(shù)據(jù)庫中是否已存在某表:

int j=0;

ResultSet rs2=stmt.executeQuery("select * from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA='student' and TABLE_NAME='stuinfo' ");while(rs2.next()) //判斷數(shù)據(jù)庫中是否含有stuinfo表

j++;if(j==0)

stmt.executeUpdate("create table stuinfo(sno INT not null primary key,name VARCHAR(50) not null,age int,sex VARCHAR(50))");

總結(jié)

以上是生活随笔為你收集整理的java 入侵 mysql_Java访问数据库Mysql的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。