JavaWeb笔记:JDBC总结
JavaWeb筆記:JDBC總結
目錄
JavaWeb筆記:JDBC總結
一、JDBC概述
二、開發一個JDBC程序(重要)
三、JDBC常用的類和接口詳解
1、java.sql.Drivermanager類 : 創建連接
2、java.sql.Connection接口:一個連接
3、java.sql.Statement接口: 操作sql語句,并返回相應結果的對象(小貨車)
4、java.sql.ResultSet接口: 結果集(客戶端存表數據的對象)
5、釋放資源?
四、使用JDBC實現CRUD操作
五、實現一個用戶登錄的功能??
六、SQL注入問題:preparedStatement
一、JDBC概述
為什么要使用JDBC?
JDBC:java database connectivity SUN公司提供的一套操作數據庫的標準規范。
JDBC與數據庫驅動的關系:接口與實現的關系。
JDBC規范(掌握四個核心對象):
DriverManager:用于注冊驅動
Connection: 表示與數據庫創建的連接
Statement: 操作數據庫sql語句的對象
ResultSet: 結果集或一張虛擬表
開發一個JDBC程序的準備工作:
> JDBC規范在哪里:
?JDK中:
java.sql.*;
javax.sql.*;
> 數據庫廠商提供的驅動:jar文件
? *.jar
二、開發一個JDBC程序(重要)
實現查詢數據庫中的數據顯示在java的控制臺中
1、創建數據庫表,并向表中添加測試數據
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、創建java project項目,添加數據庫驅動(*.jar)
3、實現JDBC操作
?? ??? ?//1、注冊驅動
?? ??? ?//2、創建連接
?? ??? ?//3、得到執行sql語句的Statement對象
?? ??? ?//4、執行sql語句,并返回結果
?? ??? ?//5、處理結果
?? ??? ?//6關閉資源
?
三、JDBC常用的類和接口詳解
1、java.sql.Drivermanager類 : 創建連接
a、注冊驅動
DriverManager.registerDriver(new com.mysql.jdbc.Driver());不建議使用
原因有2個:
> 導致驅動被注冊2次。
> 強烈依賴數據庫的驅動jar
解決辦法:
Class.forName("com.mysql.jdbc.Driver");
b、與數據庫建立連接
static Connection getConnection(String url, String user, String password)?
? ? ? ? ? 試圖建立到給定數據庫 URL 的連接。
getConnection("jdbc:mysql://localhost:3306/day06", "root", "root");
URL:SUN公司與數據庫廠商之間的一種協議。
jdbc:mysql://localhost:3306/day06
協議 子協議 ?IP :端口號 數據庫
mysql: jdbc:mysql://localhost:3306/day14 或者 jdbc:mysql:///day14(默認本機連接)
oracle: jdbc:oracle:thin:@localhost:1521:sid
?? ??? ?Properties info = new Properties();//要參考數據庫文檔
?? ??? ?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接口:一個連接
接口的實現在數據庫驅動中。所有與數據庫交互都是基于連接對象的。
Statement ?createStatement(); //創建操作sql語句的對象
3、java.sql.Statement接口: 操作sql語句,并返回相應結果的對象(小貨車)
接口的實現在數據庫驅動中。用于執行靜態 SQL 語句并返回它所生成結果的對象。?
ResultSet ?executeQuery(String sql) 根據查詢語句返回結果集。只能執行select語句。
?int executeUpdate(String sql) 根據執行的DML(insert update delete)語句,返回受影響的行數。
boolean execute(String sql) ?此方法可以執行任意sql語句。返回boolean值,表示是否返回ResultSet結果集。僅當執行select語句,且有返回結果時返回true, 其它語句都返回false;
4、java.sql.ResultSet接口: 結果集(客戶端存表數據的對象)
a、封裝結果集的。
提供一個游標,默認游標指向結果集第一行之前。
調用一次next(),游標向下移動一行。
提供一些get方法。
封裝數據的方法
Object getObject(int columnIndex); 根據序號取值,索引從1開始
Object getObject(String ColomnName); 根據列名取值。
將結果集中的數據封裝到javaBean中
java的數據類型與數據庫中的類型的關系
byte ? ? ? ? ?tityint
short ? ? ? ? smallint
int ? ? ? ? ? int
long ? ? ? ? ?bigint
float ? ? ? ? float
double ? ? ? ?double
String ? ? ? ?char varchar?
? ? ? ? Date ? ? ? ? date
boolean next()?? ?將光標從當前位置向下移動一行
int getInt(int colIndex)?? ?以int形式獲取ResultSet結果集當前行指定列號值
int getInt(String colLabel)?? ?以int形式獲取ResultSet結果集當前行指定列名值
float getFloat(int colIndex)?? ?以float形式獲取ResultSet結果集當前行指定列號值
float getFloat(String colLabel)?? ?以float形式獲取ResultSet結果集當前行指定列名值
String getString(int colIndex)?? ?以String 形式獲取ResultSet結果集當前行指定列號值
String getString(String colLabel)?? ?以String形式獲取ResultSet結果集當前行指定列名值
Date getDate(int columnIndex); ?
Date getDate(String columnName);
void close()?? ?關閉ResultSet 對象
b、可移動游標的方法
?boolean next() ?將光標從當前位置向前移一行。?
?? ? boolean previous()?
? ? ? ? ? ? ?將光標移動到此 ResultSet 對象的上一行。?
? ? ?boolean absolute(int row) 參數是當前行的索引,從1開始
? ? ? ? ??? ?根據行的索引定位移動的指定索引行。
?void afterLast()?
? ? ? ? ? 將光標移動到末尾,正好位于最后一行之后。?
?void beforeFirst()?
? ? ? ? ? 將光標移動到開頭,正好位于第一行之前。?
?
5、釋放資源?
資源有限,要正確關閉。
? ? ??
四、使用JDBC實現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.注冊驅動/*不建議使用,會導致驅動被創建兩次,強烈依賴數據庫的驅動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.得到執行sql語句的對象StatementStatement statement;statement=connection.createStatement();//4.執行sql語句,并返回結果ResultSet resultSet;resultSet=statement.executeQuery("SELECT *FROM users");List<User> list=new ArrayList<>();//5.處理結果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.關閉資源resultSet.close();statement.close();connection.close();for (User u:list) {System.out.println(u);}}@Testpublic void testSelect1() throws Exception {//1.注冊驅動/*不建議使用,會導致驅動被創建兩次,強烈依賴數據庫的驅動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.得到執行sql語句的對象StatementStatement statement;statement=connection.createStatement();//4.執行sql語句,并返回結果ResultSet resultSet;resultSet=statement.executeQuery("SELECT *FROM users");List<User> list=new ArrayList<>();resultSet.afterLast();resultSet.previous();//5.處理結果//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.關閉資源resultSet.close();statement.close();connection.close();System.out.println(user);}@Testpublic void testInsert() throws Exception {//1.注冊驅動/*不建議使用,會導致驅動被創建兩次,強烈依賴數據庫的驅動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.得到執行sql語句的對象StatementStatement statement;statement=connection.createStatement();//4.執行sql語句,并返回結果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.關閉資源statement.close();connection.close();}@Testpublic void testUpdate() throws Exception {//1.注冊驅動/*不建議使用,會導致驅動被創建兩次,強烈依賴數據庫的驅動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.得到執行sql語句的對象StatementStatement statement;statement=connection.createStatement();//4.執行sql語句,并返回結果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.關閉資源statement.close();connection.close();}@Testpublic void testDelete() throws Exception {//1.注冊驅動/*不建議使用,會導致驅動被創建兩次,強烈依賴數據庫的驅動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.得到執行sql語句的對象StatementStatement statement;statement=connection.createStatement();//4.執行sql語句,并返回結果int i=statement.executeUpdate("DELETE FROM users WHERE id=4");if (i>0){System.out.println("Success");}//6.關閉資源statement.close();connection.close();} }?
?
?
五、實現一個用戶登錄的功能?
?
這里用dbinfo.properties文件輸入JDBC驅動信息。把對應的用戶名、密碼、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;}//關閉資源的方法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:預編譯對象, 是Statement對象的子類。
特點:
性能要高
會把sql語句先編譯
sql語句中的參數會發生變化,過濾掉用戶輸入的關鍵字。
補充例子:
?
總結
以上是生活随笔為你收集整理的JavaWeb笔记:JDBC总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 量子计算机首次成功模拟化学反应
- 下一篇: Java总结:SpringBoot的使用