文章目錄
step 1 : 引入mysql-jdbc驅動包
我們通過JDBC API 訪問數據庫時,需要用到第三方的驅動類,這些驅動類根據JDBC API 規範實現了訪問相應數據庫的一些列方法。這裏我們要訪問MySQL 數據庫,因此這裏引用的是 mysql 驅動。
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.15</version>
</dependency>
step 2 : 加載驅動
Class.forName()方法用於註冊驅動程序類,此方法用於動態加載驅動程序類。
public static void main(String[] args) {
//加載驅動
try {
//驅動類 com.mysql.jdbc.Driver
Class.forName("com.mysql.jdbc.Driver");
System.out.println("數據庫驅動加載成功 !");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
當運行以上代碼,控制檯會打印出這麼一句話:
數據庫驅動加載成功 !
Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.
很明顯,驅動類【com.mysql.jdbc.Driver】已被棄用。 新的驅動程序類是`com.mysql.cj.jdbc.Driver’。 驅動程序通過SPI自動註冊,通常不需要手動加載驅動程序類。
注意:從JDBC 4.0開始,顯式註冊驅動程序是可選的。 我們只需要將相應的驅動jar放在類路徑中,然後JDBC驅動程序管理器就可以自動檢測並加載驅動程序。
step 3 : 建立與數據庫的連接
使用DriverManager.getConnection()方法來創建一個Connection對象,它代表一個數據庫的物理連接
public static void main(String[] args) {
//連接對象
Connection conn = null;
//SQL statement 對象
Statement stmt = null;
try {
//01.加載驅動
Class.forName("com.mysql.cj.jdbc.Driver");
System.out.println("數據庫驅動加載成功 !");
//02.創建連接對象
conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/lkf_db?characterEncoding=UTF-8",
"root", "root");
System.out.println("連接成功,獲取連接對象: " + c);
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
}
step 4 : 創建Statement
Connection接口的createStatement()方法用於創建語句對象(Statement )。 Statement 對象負責對數據庫執行查詢。
public static void main(String[] args) {
//連接對象
Connection conn = null;
//SQL statement 對象
Statement stmt = null;
try {
//01.加載驅動
Class.forName("com.mysql.cj.jdbc.Driver");
System.out.println("數據庫驅動加載成功 !");
//02.創建連接對象
conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/lkf_db?characterEncoding=UTF-8",
"root", "root");
System.out.println("連接成功,獲取連接對象: " + conn);
//3.創建Statement
stmt = conn.createStatement();
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
}
step 5 : 執行SQL語句
public static void main(String[] args) {
//連接對象
Connection conn = null;
//SQL statement 對象
Statement stmt = null;
try {
//01.加載驅動
Class.forName("com.mysql.cj.jdbc.Driver");
System.out.println("數據庫驅動加載成功 !");
//02.創建連接對象
conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/lkf_db?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT",
"root", "root");
//03.創建Statement
stmt = conn.createStatement();
System.out.println("連接成功,獲取連接對象: " + conn);
//04.執行SQL語句
String sql = "CREATE TABLE `tb_user2` (\n" +
" `id` bigint(20) NOT NULL AUTO_INCREMENT,\n" +
" `user_name` varchar(30) DEFAULT NULL COMMENT '用戶名',\n" +
" `sex` int(1) DEFAULT '0' COMMENT '性別(0-男;1-女)',\n" +
" `age` int(100) DEFAULT '0' COMMENT '年齡',\n" +
" `birthday` datetime DEFAULT NULL COMMENT '生日',\n" +
" `email` varchar(30) DEFAULT NULL COMMENT '郵箱',\n" +
" `mobile` varchar(20) DEFAULT NULL COMMENT '手機號',\n" +
" `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '創建時間',\n" +
" `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時間',\n" +
" `status_flag` int(11) DEFAULT '0' COMMENT '狀態(0-正常;1-停用)',\n" +
" PRIMARY KEY (`id`)\n" +
") ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8\n";
int count = stmt.executeUpdate(sql);
System.out.println("返回結果count:" + count);
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
}
如果遇到以下錯誤提示:
java.sql.SQLException: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.
是因爲新版本的數據庫驅動需要指定UTC時區,將url地址後加上時區即可解決,“jdbc:mysql://localhost:3306/lkf_db?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT”
step 6 : 關閉連接
Connection接口的close()方法用於關閉連接,ResultSet 和 Statement 對象將會自動關閉。
public static void main(String[] args) {
//連接對象
Connection conn = null;
//SQL statement 對象
Statement stmt = null;
try {
//01.加載驅動
Class.forName("com.mysql.cj.jdbc.Driver");
System.out.println("數據庫驅動加載成功 !");
//02.創建連接對象
conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/lkf_db?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT",
"root", "root");
//03.創建Statement
stmt = conn.createStatement();
System.out.println("連接成功,獲取連接對象: " + conn);
//04.執行SQL語句
String sql = "CREATE TABLE `tb_user2` (\n" +
" `id` bigint(20) NOT NULL AUTO_INCREMENT,\n" +
" `user_name` varchar(30) DEFAULT NULL COMMENT '用戶名',\n" +
" `sex` int(1) DEFAULT '0' COMMENT '性別(0-男;1-女)',\n" +
" `age` int(100) DEFAULT '0' COMMENT '年齡',\n" +
" `birthday` datetime DEFAULT NULL COMMENT '生日',\n" +
" `email` varchar(30) DEFAULT NULL COMMENT '郵箱',\n" +
" `mobile` varchar(20) DEFAULT NULL COMMENT '手機號',\n" +
" `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '創建時間',\n" +
" `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時間',\n" +
" `status_flag` int(11) DEFAULT '0' COMMENT '狀態(0-正常;1-停用)',\n" +
" PRIMARY KEY (`id`)\n" +
") ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8\n";
int count = stmt.executeUpdate(sql);
System.out.println("返回結果count:" + count);
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
} finally {
//05、關閉連接對象
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
注意:從Java 7開始,JDBC能夠使用try-with-resources語句來自動關閉Connection,ResultSet和Statement類型的資源。
try-with-resource
JDK1.7開始,java引入了 try-with-resources,將 try-catch-finally 簡化爲 try-catch,在編譯時會自動轉化爲 try-catch-finally 語句。它要求在 try-with-resources 聲明中定義的變量必須實現 AutoCloseable 接口,這樣系統可以自動調用它們的close方法,從而替代了finally中關閉資源的功能。
public static void main( String[] args ) {
try (
//01-創建連接
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/lkf_db?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT",
"root", "root");
//02-創建 statement 對象
Statement stmt = conn.createStatement();
) {
//03-執行SQL語句
String sql = "CREATE TABLE `tb_user2` (\n" +
" `id` BIGINT(20) NOT NULL AUTO_INCREMENT,\n" +
" `user_name` VARCHAR(30) DEFAULT NULL COMMENT '用戶名',\n" +
" `sex` INT(1) DEFAULT '0' COMMENT '性別(0-男;1-女)',\n" +
" `age` INT(100) DEFAULT '0' COMMENT '年齡',\n" +
" `birthday` DATETIME DEFAULT NULL COMMENT '生日',\n" +
" `email` VARCHAR(30) DEFAULT NULL COMMENT '郵箱',\n" +
" `mobile` VARCHAR(20) DEFAULT NULL COMMENT '手機號',\n" +
" `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '創建時間',\n" +
" `update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時間',\n" +
" `status_flag` INT(11) DEFAULT '0' COMMENT '狀態(0-正常;1-停用)',\n" +
" PRIMARY KEY (`id`)\n" +
") ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8\n";
int count = stmt.executeUpdate(sql);
System.out.println("返回結果count:" + count);
} catch (SQLException e) {
printSQLException(e);
}
}
public static void printSQLException( SQLException ex ) {
for (Throwable e : ex) {
if (e instanceof SQLException) {
e.printStackTrace(System.err);
System.err.println("SQLState: " + ((SQLException) e).getSQLState());
System.err.println("Error Code: " + ((SQLException) e).getErrorCode());
System.err.println("Message: " + e.getMessage());
Throwable t = ex.getCause();
while (t != null) {
System.out.println("Cause: " + t);
t = t.getCause();
}
}
}
}