JDBC連接資料庫六步: 1.Class.forName()載入資料庫連接驅動 2.DriverManager.getConnection()獲取數據連接對象 3.根據SQL獲取sq|會話對象 4.執行SQL,執行SQL前如果有參數值就設置參數值setXXX() 5.處理結果集 6.釋放資源 ...
JDBC連接資料庫
共六步
1.Class.forName()載入資料庫連接驅動
2.DriverManager.getConnection()獲取數據連接對象
3.根據SQL獲取sq|會話對象
4.執行SQL,執行SQL前如果有參數值就設置參數值setXXX()
5.處理結果集
6.釋放資源
0.前期工作
0.0文件jar
包下載,配置,刪除
目前常用的驅動版本就是5或者8(根據自己的資料庫版本判斷)-5和8的資料庫驅動下載地址
1.建一個
lib
文件夾與src
同級,把對應的jar
包放進從(CV就行)
2.右擊
jar
包->Add as Library
3.Name可以自己改,正常預設ok就行
4.出現下麵這樣就添加成功了
5.刪除的方法
File->Project Structure->Libraries,然後在中間找到要刪除的,點擊減號就行,記得別忘了Apply->OK(我喜歡兩步個人習慣,直接點OK也行)
下麵這4步可以不寫,寫他的好處是為了方便修改
0.1、聲明驅動
//5版本
private static String driver = "com.mysql.jdbc.Driver";
//8版本
private static String driver = "com.mysql.cj.jdbc.Driver";
他們的區別就是8版本比5版本多了一層
.cj
,這裡只是看看,實際用的時候不要解壓
0.2、聲明用戶名
正常情況下是
root
,如果修改了話根據你的實際情況而定
private static String username = "root";
0.3、聲明密碼
根據自身情況而定
private static String password = "123456";
0.4、資料庫完整地址
用
127.0.0.1
、localhost
(無網)或者本地IP(有網)
jdbc:mysql://localhost:3306
不寫後面的資料庫名也不會報錯多用於測試
useSSL
:不建議在沒有伺服器身份驗證的情況下建立SSL連接。如果不設置顯式選項,則必須建立預設的SSL連接。需要通過設置useSSL=false來顯式禁用SSL,或者設置useSSL=true併為伺服器證書驗證提供信任存儲。所以建議設置useSSL為false,有時遇到的問題可以這樣來考慮
characterEncoding
:設置字元集
timeZone
:設置時區,這個如果設置錯了,在處理時間問題時候顯示的時間會跟自己想象的不太一樣
舉個例子:日本時間比中國早一個小時
private static String url = "jdbc:mysql://localhost:3306/資料庫名字?useSSL=false&characterEncoding=utf8&timeZone=UTC";
一、Class.forName()載入資料庫連接驅動
會讓處理異常,這裡直接
try{}catch{}
Class.forName(driver);
二、DriverManager.getConnection()獲取數據連接對象
DriverManager.getConnection(url, username, password);
三、根據SQL獲取sq|會話對象
有2種方式
Statement
、PreparedStatement
建議用PreparedStatement
,用Statement
連接的話容易被sql註入
private PreparedStatement pstm;
//?是要傳入的數據,有幾個寫幾個
String sql = "SELECT * FROM user WHERE id = ?;";
pstm = conn.prepareStatement(sql);
四、執行SQL,執行SQL前如果有參數值就設置參數值setXXX()
//查詢用這個
private ResultSet rs= null;
//如上面第三步需要一個int類型的數據id
pstm.setInt(1,id);
rs = pstm.executeQuery();
//其他的增刪改,不需要返回結果集,他們返回一個整數,代表改變了幾條數據
n = pstm.executeUpdate();
五、處理結果集
//在查詢的時候使用處理結果
//找下一個,通常寫在while中
rs.next()
//獲取
rs.getString()
六、釋放資源
//這裡我封裝起來了省的來回寫一大堆
//正著寫,倒著關
//查詢關三個
ResultSet.close;
PreparedStatement.close;
Connection.close;
//其他關兩個
PreparedStatement.close;
Connection.close;
七、案例
案例一二六
整個可以直接全部複製,改改參數就行
import java.sql.*;
/**
* @Auther QY
* @Date 2023/11/16
*/
public class DBTools {
//(1)聲明驅動
//我這裡用的是8版本的
private static String driver = "com.mysql.cj.jdbc.Driver";
//(2)聲明用戶名
private static String username = "root";
//(3)聲明密碼
private static String password = "qy666";
//(4)資料庫的完整地址
private static String url = "jdbc:mysql://localhost:3306/資料庫名字?useSSL=false&characterEncoding=utf8&timeZone=UTC";
public static Connection ConnDB() {
Connection connection = null;
try {
//一、Class.forName()載入資料庫連接驅動
Class.forName(driver);
//二、DriverManager.getConnection()獲取數據連接對象
connection = DriverManager.getConnection(url, username, password);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return connection;
}
//六、釋放資源
public static void closeDB(Connection connection, PreparedStatement preparedStatement, ResultSet resultSet) {
//(1)關閉連接對象
if (connection != null) {
try {
connection.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
//(2)關閉數據操作對象
if (preparedStatement != null) {
try {
preparedStatement.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
//(3)關閉結果集對象
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
}
案例三四五
這裡可以看看大概結構,部分代碼可以複製
public class UserDaoImpl implements UserDao {
//聲明資料庫連接對象
private Connection conn = DruidTools.getConn();
//聲明資料庫操作對象
private PreparedStatement pstm;
//聲明結果集對象
private ResultSet rs= null;
/**
* 通過id號查一個用戶
* @param id
* @return
*/
@Override
public User selectUserById(int id) {
//聲明User
User user = null;
//寫sql
String sql = "SELECT * FROM user WHERE id = ?;";
try {
pstm = conn.prepareStatement(sql);
//設置參數的值
pstm.setInt(1,id);
rs = pstm.executeQuery();
if (rs.next()){
user = new User();
String username = rs.getString("username");
String password = rs.getString("password");
user.setId(id);
user.setUsername(username);
user.setPassword(password);
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
//查不到返回null
return user;
}
/**
* 查詢所有對象
* @return
*/
@Override
public List<User> selectUsers() {
List<User> users = new ArrayList<>();
//寫sql語句
String sql = "select * FRom user;" ;
User user;
try {
pstm = conn.prepareStatement(sql);
rs = pstm.executeQuery();
while (rs.next()){
//跟實體類對應
int id = rs.getInt("id");
String username = rs.getString("username");
String password = rs.getString("password");
user = new User();
user.setId(id);
user.setUsername(username);
user.setPassword(password);
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return users;
}
/**
* 添加用戶
* @param user
* @return
*/
@Override
public int insertUser(User user) {
//聲明變數
int n = 0;
String sql = "INSERT INTO user(username,password,realname,gender,address,email,regdate) " +
"VALUES(?,?,?,?,?,?,?);";
try {
pstm = conn.prepareStatement(sql);
pstm.setString(1,user.getUsername());
pstm.setString(2,user.getPassword());
pstm.setString(3,user.getRealname());
pstm.setString(4,user.getGender());
pstm.setString(5,user.getAddress());
pstm.setString(6,user.getEmail());
pstm.setTimestamp(7,user.getRegdate());
//執行添加
n = pstm.executeUpdate();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return n;
}
@Override
public Integer selectUserByUsername(String username) {
//聲明對象
Integer temp = null;
//寫sql
String sql = "SELECT id FROM user WHERE username = ?;";
//創建對象
try {
pstm = conn.prepareStatement(sql);
pstm.setString(1,username);
rs = pstm.executeQuery();
if (rs.next()){
temp = rs.getInt("id");
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return temp;
}
/**
* 修改密碼
* @param username
* @param newPassword
* @return
*/
@Override
public int updateUser(String username, String newPassword) {
int n = 0;
String sql = "UPDATE user SET password = ? WHERE username = ?;";
try {
pstm = conn.prepareStatement(sql);
pstm.setString(2,username);
pstm.setString(1,newPassword);
//執行修改
n = pstm.executeUpdate();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return n;
}
@Override
public int deleteUser(String username) {
int n = 0;
String sql = "DELETE FROM user WHERE username = ?;";
try {
pstm = conn.prepareStatement(sql);
pstm.setString(1,username);
//執行修改
n = pstm.executeUpdate();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return n;
}
}