MySQL 數據庫-JDBC
1.事務
事務(Transaction):要么都成功,要么都失敗
事務原則:ACID原則(原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability))
- 原子性:要么都成功,要么都失敗
- 一致性:事務前后的數據完整性要保證一致(如,轉賬操作后,兩個人的總額不變)
- 持久性:事務一旦提交不可逆,被持久化到了數據庫中(事務沒提交,恢復到原狀態;事務提交了,持久化到數據庫的)
- 隔離性:針對多個用戶同時操作,主要排除其他事務對本次事務的影響
臟讀:指一個事務讀取了另外一個事務未提交的數據
幻讀:指在一個事務內讀到了別的事務插入的數據,導致前后讀取不一致
2.數據庫備份
導出:
- mysqldump -hlocalhost -uroot -pxxx database_name table_name1 table_name2 > path/new.sql
- mysqldump -hlocalhost -uroot -pxxx database_name > path/new.sql
導入:
- source path/source.sql(登錄情況下)
- mysql -u用戶名 -p密碼 庫名 < 備份文件
3.JDBC
步驟:
- 加載驅動
- 連接數據庫 DriverManager
- 獲得執行SQL的對象 Statement
- 獲得返回的結果集
- 釋放連接
JDBC 連接代碼
import java.sql.*;
public class JdbcFirstDemo {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
// 1.加載驅動
Class.forName("com.mysql.jdbc.Driver"); // 固定寫法,加載驅動
// 2.用戶信息和 url
String url = "jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf-8&useSSL=true";
String username = "root";
String password = "root";
// 3,連接成功,數據庫對象
Connection connection = DriverManager.getConnection(url, username, password);
// 4.執行SQL的對象
Statement statement = connection.createStatement();
// 5.執行SQL的對象,去執行 SQL,可能存在結果,查看返回結果
String sql = "select * from users";
ResultSet resultSet = statement.executeQuery(sql);//返回的結果,結果集中封裝了所有結果
while (resultSet.next()){
System.out.println("id=" + resultSet.getObject("id"));
System.out.println("name=" + resultSet.getObject("name"));
System.out.println("age=" + resultSet.getObject("age"));
System.out.println("=======================");
}
// 6.釋放連接
resultSet.close();
statement.close();
connection.close();
}
}
執行SQL對象
statement.executeQuery(sql);// 查詢操作
statement.execute(sql);// 執行任何SQL
statement.executeUpdate(sql);//更新、插入、刪除都用這個,返回一個受影響的行數
一般將數據庫的連接配置都放在 .properties 文件中
4.SQL注入問題
4.1.SQL 代碼問題
問題代碼:String sql = "select * from users where `NAME`='"+username+"' AND `password` ='"+password+"'";
相當于:username 賦值為 'or 1=1 --+
本質:會將值拼接到SQL語句中
4.2.PreparedStatement 對象
通過預編譯防御SQL注入
本質:把傳遞進來的參數當作字符
防止SQL注入
import java.sql.Connection;
import java.sql.PreparedStatement;
public class SQLInjection {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement st = null;
try{
conn = JdbcUtils.getConnection();
// 使用 ? 占位符代替參數
String sql = "insert into users(id,name,password) values(?,?,?)";
st = conn.prepareStatement(sql);// 預編譯SQL,先寫SQL,然后不執行
// 手動給參數賦值
st.setInt(1,1);// id
st.setString(2,"xiaoming");// name
st.setString(3,"123456");// password
// 執行
int i = st.executeUpdate();
if (i > 0) System.out.println("插入成功!");
} catch (Exception e){
e.printStackTrace();
}finally {
JdbcUtils.release(conn, st, null);
}
}
}

浙公網安備 33010602011771號