通過(guò) JDBC , Java 程序可以非常方便的操作各種主流數(shù)據(jù)庫(kù),這是 Java 的魅力所在
JDBC 介紹
JDBC 全稱(chēng):Java Database Connectivity,即實(shí)現(xiàn) Java 和數(shù)據(jù)庫(kù)的連接,是一種可以執(zhí)行 SQL 的 Java API
需要知道闻蛀,JDBC 之所以能相同的 API 操作不同的數(shù)據(jù)庫(kù),是因?yàn)?API 只提供了接口,沒(méi)有實(shí)現(xiàn)類(lèi)险耀,實(shí)現(xiàn)類(lèi)由各個(gè)數(shù)據(jù)庫(kù)廠商提供(即驅(qū)動(dòng)程序),這樣程序員使用 JDBC 時(shí)只要面向標(biāo)準(zhǔn)的 JDBC API 編程即可玖喘,不必?fù)?dān)心不同的數(shù)據(jù)庫(kù)會(huì)寫(xiě)不同的程序甩牺。
當(dāng)需要切換數(shù)據(jù)庫(kù)時(shí),更換不同的實(shí)現(xiàn)類(lèi)(即數(shù)據(jù)庫(kù)驅(qū)動(dòng))即可累奈,這是面向接口編程的典型應(yīng)用
JDBC 的基本工作
- 與數(shù)據(jù)庫(kù)建立連接
- 執(zhí)行 SQL
- 獲得 SQL 語(yǔ)句的執(zhí)行結(jié)果
JDBC API
DriverManager 管理不同的驅(qū)動(dòng)
Connection 連接數(shù)據(jù)庫(kù)
Statement(PreparedStatement) 增刪改查
CallableStatement 調(diào)用數(shù)據(jù)庫(kù)中的存儲(chǔ)過(guò)程/存儲(chǔ)函數(shù)
ResultSet 返回結(jié)果集
步驟
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import com.blog.dao.IUserDao;
import com.blog.entity.User;
public class UserDaoImpl implements IUserDao{
String driver = "com.mysql.cj.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/blog?useSSL=false&serverTimezone=UTC";
String name = "root";
String pass = "root";
public User login(User user) {
Connection con = null;
PreparedStatement pst = null;
ResultSet resultSet = null;
User re = new User();
try {
//加載數(shù)據(jù)庫(kù)驅(qū)動(dòng)
Class.forName(driver);
//獲取數(shù)據(jù)庫(kù)連接
con = DriverManager.getConnection(url,name,pass);
//SQL預(yù)編譯
String sql = "select uname,unname from user where uname = ? and upass = ?";
pst = con.prepareStatement(sql);
pst.setString(1, user.getUname());
pst.setString(2, user.getUpass());
resultSet = pst.executeQuery();
while (resultSet.next()) {
String name = resultSet.getString("uname");
String nname = resultSet.getString("unname");
re.setUname(name);
re.setUnname(nname);
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("加載數(shù)據(jù)庫(kù)驅(qū)動(dòng)失敗");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("數(shù)據(jù)庫(kù)連接失敗");
}finally {
try {
if (resultSet != null) resultSet.close();
if (pst != null) pst.close();
if (con != null) con.close();
} catch (Exception e2) {
// TODO: handle exception
System.out.println("resultSet關(guān)閉失敗");
}
}
return re;
}
}
注意 :Java7 改寫(xiě)了 Connection 贬派、PreparedStatement 、ResultSet 接口澎媒,它們的關(guān)閉會(huì)由AutoCloseable 接口實(shí)現(xiàn)搞乏,因此可以交由 try 語(yǔ)句來(lái)關(guān)閉