JavaWeb笔记:JDBC总结
JavaWeb筆記:JDBC總結(jié)
目錄
JavaWeb筆記:JDBC總結(jié)
一、JDBC概述
二、開發(fā)一個JDBC程序(重要)
三、JDBC常用的類和接口詳解
1、java.sql.Drivermanager類 : 創(chuàng)建連接
2、java.sql.Connection接口:一個連接
3、java.sql.Statement接口: 操作sql語句,并返回相應(yīng)結(jié)果的對象(小貨車)
4、java.sql.ResultSet接口: 結(jié)果集(客戶端存表數(shù)據(jù)的對象)
5、釋放資源?
四、使用JDBC實(shí)現(xiàn)CRUD操作
五、實(shí)現(xiàn)一個用戶登錄的功能??
六、SQL注入問題:preparedStatement
一、JDBC概述
為什么要使用JDBC?
JDBC:java database connectivity SUN公司提供的一套操作數(shù)據(jù)庫的標(biāo)準(zhǔn)規(guī)范。
JDBC與數(shù)據(jù)庫驅(qū)動的關(guān)系:接口與實(shí)現(xiàn)的關(guān)系。
JDBC規(guī)范(掌握四個核心對象):
DriverManager:用于注冊驅(qū)動
Connection: 表示與數(shù)據(jù)庫創(chuàng)建的連接
Statement: 操作數(shù)據(jù)庫sql語句的對象
ResultSet: 結(jié)果集或一張?zhí)摂M表
開發(fā)一個JDBC程序的準(zhǔn)備工作:
> JDBC規(guī)范在哪里:
?JDK中:
java.sql.*;
javax.sql.*;
> 數(shù)據(jù)庫廠商提供的驅(qū)動:jar文件
? *.jar
二、開發(fā)一個JDBC程序(重要)
實(shí)現(xiàn)查詢數(shù)據(jù)庫中的數(shù)據(jù)顯示在java的控制臺中
1、創(chuàng)建數(shù)據(jù)庫表,并向表中添加測試數(shù)據(jù)
create database day06;
use day06;
create table users(
?? ?id int primary key auto_increment,
?? ?name varchar(40),
?? ?password varchar(40),
?? ?email varchar(60),
?? ?birthday date
)character set utf8 collate utf8_general_ci;
insert into users(name,password,email,birthday) values('zs','123456','zs@sina.com','1980-12-04');
insert into users(name,password,email,birthday) values('lisi','123456','lisi@sina.com','1981-12-04');
insert into users(name,password,email,birthday) values('wangwu','123456','wangwu@sina.com','1979-12-04');
2、創(chuàng)建java project項(xiàng)目,添加數(shù)據(jù)庫驅(qū)動(*.jar)
3、實(shí)現(xiàn)JDBC操作
?? ??? ?//1、注冊驅(qū)動
?? ??? ?//2、創(chuàng)建連接
?? ??? ?//3、得到執(zhí)行sql語句的Statement對象
?? ??? ?//4、執(zhí)行sql語句,并返回結(jié)果
?? ??? ?//5、處理結(jié)果
?? ??? ?//6關(guān)閉資源
?
三、JDBC常用的類和接口詳解
1、java.sql.Drivermanager類 : 創(chuàng)建連接
a、注冊驅(qū)動
DriverManager.registerDriver(new com.mysql.jdbc.Driver());不建議使用
原因有2個:
> 導(dǎo)致驅(qū)動被注冊2次。
> 強(qiáng)烈依賴數(shù)據(jù)庫的驅(qū)動jar
解決辦法:
Class.forName("com.mysql.jdbc.Driver");
b、與數(shù)據(jù)庫建立連接
static Connection getConnection(String url, String user, String password)?
? ? ? ? ? 試圖建立到給定數(shù)據(jù)庫 URL 的連接。
getConnection("jdbc:mysql://localhost:3306/day06", "root", "root");
URL:SUN公司與數(shù)據(jù)庫廠商之間的一種協(xié)議。
jdbc:mysql://localhost:3306/day06
協(xié)議 子協(xié)議 ?IP :端口號 數(shù)據(jù)庫
mysql: jdbc:mysql://localhost:3306/day14 或者 jdbc:mysql:///day14(默認(rèn)本機(jī)連接)
oracle: jdbc:oracle:thin:@localhost:1521:sid
?? ??? ?Properties info = new Properties();//要參考數(shù)據(jù)庫文檔
?? ??? ?info.setProperty("user", "root");
?? ??? ?info.setProperty("password","root");
getConnection(String url, Properties info)?
getConnection(String url)?
DriverManager.getConnection("jdbc:mysql://localhost:3306/day14?user=root&password=root");
?
2、java.sql.Connection接口:一個連接
接口的實(shí)現(xiàn)在數(shù)據(jù)庫驅(qū)動中。所有與數(shù)據(jù)庫交互都是基于連接對象的。
Statement ?createStatement(); //創(chuàng)建操作sql語句的對象
3、java.sql.Statement接口: 操作sql語句,并返回相應(yīng)結(jié)果的對象(小貨車)
接口的實(shí)現(xiàn)在數(shù)據(jù)庫驅(qū)動中。用于執(zhí)行靜態(tài) SQL 語句并返回它所生成結(jié)果的對象。?
ResultSet ?executeQuery(String sql) 根據(jù)查詢語句返回結(jié)果集。只能執(zhí)行select語句。
?int executeUpdate(String sql) 根據(jù)執(zhí)行的DML(insert update delete)語句,返回受影響的行數(shù)。
boolean execute(String sql) ?此方法可以執(zhí)行任意sql語句。返回boolean值,表示是否返回ResultSet結(jié)果集。僅當(dāng)執(zhí)行select語句,且有返回結(jié)果時返回true, 其它語句都返回false;
4、java.sql.ResultSet接口: 結(jié)果集(客戶端存表數(shù)據(jù)的對象)
a、封裝結(jié)果集的。
提供一個游標(biāo),默認(rèn)游標(biāo)指向結(jié)果集第一行之前。
調(diào)用一次next(),游標(biāo)向下移動一行。
提供一些get方法。
封裝數(shù)據(jù)的方法
Object getObject(int columnIndex); 根據(jù)序號取值,索引從1開始
Object getObject(String ColomnName); 根據(jù)列名取值。
將結(jié)果集中的數(shù)據(jù)封裝到j(luò)avaBean中
java的數(shù)據(jù)類型與數(shù)據(jù)庫中的類型的關(guān)系
byte ? ? ? ? ?tityint
short ? ? ? ? smallint
int ? ? ? ? ? int
long ? ? ? ? ?bigint
float ? ? ? ? float
double ? ? ? ?double
String ? ? ? ?char varchar?
? ? ? ? Date ? ? ? ? date
boolean next()?? ?將光標(biāo)從當(dāng)前位置向下移動一行
int getInt(int colIndex)?? ?以int形式獲取ResultSet結(jié)果集當(dāng)前行指定列號值
int getInt(String colLabel)?? ?以int形式獲取ResultSet結(jié)果集當(dāng)前行指定列名值
float getFloat(int colIndex)?? ?以float形式獲取ResultSet結(jié)果集當(dāng)前行指定列號值
float getFloat(String colLabel)?? ?以float形式獲取ResultSet結(jié)果集當(dāng)前行指定列名值
String getString(int colIndex)?? ?以String 形式獲取ResultSet結(jié)果集當(dāng)前行指定列號值
String getString(String colLabel)?? ?以String形式獲取ResultSet結(jié)果集當(dāng)前行指定列名值
Date getDate(int columnIndex); ?
Date getDate(String columnName);
void close()?? ?關(guān)閉ResultSet 對象
b、可移動游標(biāo)的方法
?boolean next() ?將光標(biāo)從當(dāng)前位置向前移一行。?
?? ? boolean previous()?
? ? ? ? ? ? ?將光標(biāo)移動到此 ResultSet 對象的上一行。?
? ? ?boolean absolute(int row) 參數(shù)是當(dāng)前行的索引,從1開始
? ? ? ? ??? ?根據(jù)行的索引定位移動的指定索引行。
?void afterLast()?
? ? ? ? ? 將光標(biāo)移動到末尾,正好位于最后一行之后。?
?void beforeFirst()?
? ? ? ? ? 將光標(biāo)移動到開頭,正好位于第一行之前。?
?
5、釋放資源?
資源有限,要正確關(guān)閉。
? ? ??
四、使用JDBC實(shí)現(xiàn)CRUD操作
import org.junit.Test;import javax.jws.soap.SOAPBinding; import java.sql.*; import java.util.ArrayList; import java.util.List;public class testCRUD {@Testpublic void testSelect() throws Exception {//1.注冊驅(qū)動/*不建議使用,會導(dǎo)致驅(qū)動被創(chuàng)建兩次,強(qiáng)烈依賴數(shù)據(jù)庫的驅(qū)動jarDriverManager.registerDriver(new com.mysql.jdbc.Driver());*///用反射加載驅(qū)動Class.forName("com.mysql.jdbc.Driver");//2.獲取連接ConnectionConnection connection;connection=DriverManager.getConnection("jdbc:mysql://localhost:3306/day06","root","ylh013954");//3.得到執(zhí)行sql語句的對象StatementStatement statement;statement=connection.createStatement();//4.執(zhí)行sql語句,并返回結(jié)果ResultSet resultSet;resultSet=statement.executeQuery("SELECT *FROM users");List<User> list=new ArrayList<>();//5.處理結(jié)果while (resultSet.next()){User user=new User();user.setId(resultSet.getInt("id"));user.setName(resultSet.getString("name"));user.setPassword(resultSet.getString("password"));user.setEmail(resultSet.getString("email"));user.setBirthday(resultSet.getDate("birthday"));list.add(user);}//6.關(guān)閉資源resultSet.close();statement.close();connection.close();for (User u:list) {System.out.println(u);}}@Testpublic void testSelect1() throws Exception {//1.注冊驅(qū)動/*不建議使用,會導(dǎo)致驅(qū)動被創(chuàng)建兩次,強(qiáng)烈依賴數(shù)據(jù)庫的驅(qū)動jarDriverManager.registerDriver(new com.mysql.jdbc.Driver());*///用反射加載驅(qū)動Class.forName("com.mysql.jdbc.Driver");//2.獲取連接ConnectionConnection connection;connection=DriverManager.getConnection("jdbc:mysql://localhost:3306/day06","root","ylh013954");//3.得到執(zhí)行sql語句的對象StatementStatement statement;statement=connection.createStatement();//4.執(zhí)行sql語句,并返回結(jié)果ResultSet resultSet;resultSet=statement.executeQuery("SELECT *FROM users");List<User> list=new ArrayList<>();resultSet.afterLast();resultSet.previous();//5.處理結(jié)果//while (resultSet.next()){User user=new User();user.setId(resultSet.getInt("id"));user.setName(resultSet.getString("name"));user.setPassword(resultSet.getString("password"));user.setEmail(resultSet.getString("email"));user.setBirthday(resultSet.getDate("birthday"));list.add(user);// }//6.關(guān)閉資源resultSet.close();statement.close();connection.close();System.out.println(user);}@Testpublic void testInsert() throws Exception {//1.注冊驅(qū)動/*不建議使用,會導(dǎo)致驅(qū)動被創(chuàng)建兩次,強(qiáng)烈依賴數(shù)據(jù)庫的驅(qū)動jarDriverManager.registerDriver(new com.mysql.jdbc.Driver());*///用反射Class.forName("com.mysql.jdbc.Driver");//2.獲取連接ConnectionConnection connection;connection= DriverManager.getConnection("jdbc:mysql://localhost:3306/day06","root","ylh013954");//3.得到執(zhí)行sql語句的對象StatementStatement statement;statement=connection.createStatement();//4.執(zhí)行sql語句,并返回結(jié)果int i=statement.executeUpdate("INSERT INTO users VALUES( 4,'tom','123','tom@163.com','2015-09-28')");if (i>0){System.out.println("Success");}//6.關(guān)閉資源statement.close();connection.close();}@Testpublic void testUpdate() throws Exception {//1.注冊驅(qū)動/*不建議使用,會導(dǎo)致驅(qū)動被創(chuàng)建兩次,強(qiáng)烈依賴數(shù)據(jù)庫的驅(qū)動jarDriverManager.registerDriver(new com.mysql.jdbc.Driver());*///用反射Class.forName("com.mysql.jdbc.Driver");//2.獲取連接ConnectionConnection connection;connection= DriverManager.getConnection("jdbc:mysql://localhost:3306/day06","root","ylh013954");//3.得到執(zhí)行sql語句的對象StatementStatement statement;statement=connection.createStatement();//4.執(zhí)行sql語句,并返回結(jié)果int i=statement.executeUpdate("UPDATE users SET NAME='jerry',PASSWORD='333',email='jerry@163.com' WHERE id=4;");if (i>0){System.out.println("Success");}//6.關(guān)閉資源statement.close();connection.close();}@Testpublic void testDelete() throws Exception {//1.注冊驅(qū)動/*不建議使用,會導(dǎo)致驅(qū)動被創(chuàng)建兩次,強(qiáng)烈依賴數(shù)據(jù)庫的驅(qū)動jarDriverManager.registerDriver(new com.mysql.jdbc.Driver());*///用反射Class.forName("com.mysql.jdbc.Driver");//2.獲取連接ConnectionConnection connection;connection= DriverManager.getConnection("jdbc:mysql://localhost:3306/day06","root","ylh013954");//3.得到執(zhí)行sql語句的對象StatementStatement statement;statement=connection.createStatement();//4.執(zhí)行sql語句,并返回結(jié)果int i=statement.executeUpdate("DELETE FROM users WHERE id=4");if (i>0){System.out.println("Success");}//6.關(guān)閉資源statement.close();connection.close();} }?
?
?
五、實(shí)現(xiàn)一個用戶登錄的功能?
?
這里用dbinfo.properties文件輸入JDBC驅(qū)動信息。把對應(yīng)的用戶名、密碼、URL換成你自己的就OK。
User:
import java.util.Date;public class User {private int id;private String name;private String password;private String email;private Date birthday;public User() {}public User(int id, String name, String password, String email, Date birthday) {this.id = id;this.name = name;this.password = password;this.email = email;this.birthday = birthday;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}@Overridepublic String toString() {return "User{" +"id=" + id +", name='" + name + '\'' +", password='" + password + '\'' +", email='" + email + '\'' +", birthday=" + birthday +'}';} }?
Login:
import java.util.Scanner;public class Login {public static void main(String[] args) {Scanner in=new Scanner(System.in);System.out.println("請輸入用戶名:");String name=in.next();System.out.println("請輸入密碼:");String password=in.next();DoLogin doLogin=new DoLogin();User user=doLogin.findUser(name,password);if (user!=null){System.out.println("歡迎使用"+user.getName());}else {System.out.println("用戶名或密碼錯誤");}} }?
Dlogin:
import com.xy.jdbc.User; import com.xy.login.DBUtils;import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.Statement;public class DoLogin {public User findUser(String name,String password){Connection connection=null;PreparedStatement statement=null;ResultSet resultSet=null;User user=null;try {connection= DBUtils.getConnection();String sql="SELECT *FROM users WHERE name= ? AND password=?";statement=connection.prepareStatement(sql);//給?賦值statement.setString(1,name);statement.setString(2,password);resultSet=statement.executeQuery(sql);if (resultSet.next()){user=new User();user.setId(resultSet.getInt(1));user.setName(resultSet.getString(2));user.setPassword(resultSet.getString(3));user.setEmail(resultSet.getString(4));user.setBirthday(resultSet.getDate(5));}} catch (Exception e) {e.printStackTrace();}finally {DBUtils.closeAll(resultSet,statement,connection);}return null;}}?
DBUtils:
import java.sql.*; import java.util.ResourceBundle;public class DBUtils {private static String driverClass;private static String url;private static String user;public static String password;static {//綁定文件ResourceBundle resourceBundle=ResourceBundle.getBundle("dbinfo");//給上面4個變量賦值driverClass=resourceBundle.getString("driverClass");url=resourceBundle.getString("url");user=resourceBundle.getString("user");password=resourceBundle.getString("password");try {Class.forName(driverClass);}catch (Exception e){e.printStackTrace();}}//得到連接的方法public static Connection getConnection() throws Exception {Class.forName("com.mysql.jdbc.Driver");Connection connection= DriverManager.getConnection(url,user,password);return connection;}//關(guān)閉資源的方法public static void closeAll(ResultSet resultSet, Statement statement, Connection connection){if (resultSet!=null){try {resultSet.close();} catch (SQLException e) {e.printStackTrace();}resultSet=null;}if (statement!=null){try {statement.close();} catch (SQLException e) {e.printStackTrace();}statement=null;}if (connection!=null){try {connection.close();} catch (SQLException e) {e.printStackTrace();}connection=null;}}}?
?
dbinfo.properties:
driverClass=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/day06 user=root password=ylh013954?
?
?
?
?
六、SQL注入問題:preparedStatement
preparedStatement:預(yù)編譯對象, 是Statement對象的子類。
特點(diǎn):
性能要高
會把sql語句先編譯
sql語句中的參數(shù)會發(fā)生變化,過濾掉用戶輸入的關(guān)鍵字。
補(bǔ)充例子:
?
總結(jié)
以上是生活随笔為你收集整理的JavaWeb笔记:JDBC总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 量子计算机首次成功模拟化学反应
- 下一篇: 论文学习9-Bidirectional