日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

JavaWeb学习总结(九)--JDBC入门

發(fā)布時間:2025/5/22 java 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JavaWeb学习总结(九)--JDBC入门 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

?一、什么是JDBC

? ? ?JDBC(Java DataBase Connectivity)就是Java數(shù)據(jù)庫連接,說白了就是用Java語言來操作數(shù)據(jù)庫。原來我們操作數(shù)據(jù)庫是在控制臺使用SQL語句來操作數(shù)據(jù)庫,JDBC是用Java語言向數(shù)據(jù)庫發(fā)送SQL語句。

?

組成JDBC的2個包:
   java.sql
   javax.sql
?開發(fā)JDBC應(yīng)用需要以上2個包的支持外,還需要導(dǎo)入相應(yīng)JDBC的數(shù)據(jù)庫實現(xiàn)(即數(shù)據(jù)庫驅(qū)動)。

?

二、實現(xiàn)代碼

package cn.zy.jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import org.junit.Test;public class Demo01 {/** 得到數(shù)據(jù)庫連接*/public static Connection getConnection() throws Exception{//加載驅(qū)動Class.forName("com.mysql.jdbc.Driver");//mysql的urlString url = "jdbc:mysql://localhost:3306/testdb";Connection con = DriverManager.getConnection(url,"root","123456");return con;}/** 實現(xiàn)增刪改*/@Testpublic void insert() throws Exception{//得到連接Connection con = getConnection();//Statement語句的發(fā)送器,它的功能就是向數(shù)據(jù)庫發(fā)送sql語句!Statement stmt = con.createStatement();String sql = "insert user(name,password) value('scott','tiger')";//執(zhí)行sql stmt.executeUpdate(sql);}/** 查詢*/@Testpublic void query() throws Exception{Connection con = getConnection();Statement stmt = con.createStatement();String sql = "select * from user";//得到查詢出來的結(jié)果集ResultSet rs = stmt.executeQuery(sql);//輸出查詢到的結(jié)果while (rs.next()){String username = rs.getString("name");String password = rs.getString("password");System.out.println(username + ','+ password);}/** 關(guān)閉資源*/rs.close();stmt.close();con.close();} }

?

三、JDBC對象介紹

在JDBC中常用的類有:

  • DriverManager
  • Connection
  • Statement
  • ResultSet

3.1 DriverManager

?Jdbc程序中的DriverManager用于加載驅(qū)動,并創(chuàng)建與數(shù)據(jù)庫的鏈接,這個API的常用方法:

?? ?DriverManager.getConnection(url, user, password);

常用數(shù)據(jù)庫URL地址的寫法:

?

  • Oracle寫法:jdbc:oracle:thin:@localhost:1521:sid ? ? ? ? (driverClassName:oracle.jdbc.driver.OracleDriver)
  • SqlServer寫法:jdbc:microsoft:sqlserver://localhost:1433; DatabaseName=sid
  • MySql寫法:jdbc:mysql://localhost:3306/sid

?

3.2 Connection

? ?Jdbc程序中的Connection,它用于代表數(shù)據(jù)庫的鏈接,Collection是數(shù)據(jù)庫編程中最重要的一個對象,客戶端與數(shù)據(jù)庫所有交互都是通過connection對象完成的,這個對象的常用方法:

  • createStatement():創(chuàng)建向數(shù)據(jù)庫發(fā)送sql的statement對象。
  • prepareStatement(sql) :創(chuàng)建向數(shù)據(jù)庫發(fā)送預(yù)編譯sql的PrepareSatement對象。
  • prepareCall(sql):創(chuàng)建執(zhí)行存儲過程的callableStatement對象。
  • setAutoCommit(boolean?autoCommit):設(shè)置事務(wù)是否自動提交。
  • commit() :在鏈接上提交事務(wù)。
  • rollback() :在此鏈接上回滾事務(wù)。

3.3 Statement

Jdbc程序中的Statement對象用于向數(shù)據(jù)庫發(fā)送SQL語句, Statement對象常用方法:

  • executeQuery(String?sql) :用于向數(shù)據(jù)發(fā)送查詢語句。
  • executeUpdate(String?sql):用于向數(shù)據(jù)庫發(fā)送insert、update或delete語句
  • execute(String sql):用于向數(shù)據(jù)庫發(fā)送任意sql語句
  • addBatch(String?sql) :把多條sql語句放到一個批處理中。
  • executeBatch():向數(shù)據(jù)庫發(fā)送一批sql語句執(zhí)行。

3.4 ResultSet

Jdbc程序中的ResultSet用于代表Sql語句的執(zhí)行結(jié)果。Resultset封裝執(zhí)行結(jié)果時,采用的類似于表格的方式。ResultSet 對象維護(hù)了一個指向表格數(shù)據(jù)行的游標(biāo),初始的時候,游標(biāo)在第一行之前,調(diào)用ResultSet.next() 方法,可以使游標(biāo)指向具體的數(shù)據(jù)行,進(jìn)行調(diào)用方法獲取該行的數(shù)據(jù)。
  ResultSet既然用于封裝執(zhí)行結(jié)果的,所以該對象提供的都是用于獲取數(shù)據(jù)的get方法:
  獲取任意類型的數(shù)據(jù)
    getObject(int index)
    getObject(string columnName)
  獲取指定類型的數(shù)據(jù),例如:
    getString(int index)
    getString(String columnName)

  ResultSet還提供了對結(jié)果集進(jìn)行滾動的方法:

  • next():移動到下一行
  • Previous():移動到前一行
  • absolute(int row):移動到指定行
  • beforeFirst():移動resultSet的最前面。
  • afterLast() :移動到resultSet的最后面。

3.5?PreparedStatement

??PreperedStatement是Statement的子類,它的實例對象可以通過調(diào)用Connection.preparedStatement()方法獲得,相對于Statement對象而言:PreperedStatement可以避免SQL注入的問題。在實際項目中,應(yīng)該都使用PreparedStatement.
  Statement會使數(shù)據(jù)庫頻繁編譯SQL,可能造成數(shù)據(jù)庫緩沖區(qū)溢出。PreparedStatement可對SQL進(jìn)行預(yù)編譯,從而提高數(shù)據(jù)庫的執(zhí)行效率。并且PreperedStatement對于sql中的參數(shù),允許使用占位符的形式進(jìn)行替換,簡化sql語句的編寫。

?

?注意MySQL中默認(rèn)是沒有開啟預(yù)編譯的,如果需要打開需要修改url:jdbc:mysql://localhost:3306/test?useServerPrepStmts=true

四、使用JdbcUtils和PreparedStatement

1. 創(chuàng)建users表

CREATE TABLE users(id INT PRIMARY KEY,NAME VARCHAR(40),PASSWORD VARCHAR(40),email VARCHAR(60),birthday DATE );

2. 新建一個Java工程,導(dǎo)入驅(qū)動包,在src下創(chuàng)建一個db.properties文件

?

?在db.properties中編寫MySQL數(shù)據(jù)庫的連接信息,如下所示:

driver=com.mysql.jdbc.Driver url=jdbc\:mysql\://localhost\:3306/testdb username=root password=123456

3.編寫一個JdbcUtils工具類,用于連接數(shù)據(jù)庫,獲取數(shù)據(jù)庫連接和釋放數(shù)據(jù)庫連接,代碼如下:

package cn.zy.utils;import java.io.InputStream; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Properties;public class JdbcUtils {private static Properties props = null;private static String driver = null;private static String url = null;private static String username = null;private static String password = null;//只在JdbcUtils類被加載時執(zhí)行一次!static {try {// 給props進(jìn)行初始化,即加載dbconfig.properties文件到props對象中InputStream in = JdbcUtils.class.getClassLoader().getResourceAsStream("db.properties");Properties prop = new Properties();prop.load(in);//獲取數(shù)據(jù)庫的驅(qū)動driver = prop.getProperty("driver");//獲取urlurl= prop.getProperty("url");//獲取用戶名username = prop.getProperty("username");//獲取密碼password = prop.getProperty("password");//加載驅(qū)動 Class.forName(driver);} catch (Exception e) {throw new ExceptionInInitializerError(e);}}/** 獲取數(shù)據(jù)庫連接對象*/public static Connection getConnection() throws SQLException{return DriverManager.getConnection(url,username,password);}/** 釋放資源*/public static void release(Connection conn,Statement st,ResultSet rs){if(rs!=null){try{//關(guān)閉存儲查詢結(jié)果的ResultSet對象 rs.close();}catch (Exception e) {e.printStackTrace();}rs = null;}if(st!=null){try{//關(guān)閉負(fù)責(zé)執(zhí)行SQL命令的Statement對象 st.close();}catch (Exception e) {e.printStackTrace();}}if(conn!=null){try{//關(guān)閉Connection數(shù)據(jù)庫連接對象 conn.close();}catch (Exception e) {e.printStackTrace();}}} }

?

4.使用PreparedStatement實現(xiàn)增刪改查

package cn.zy.test;import java.sql.Connection; import java.util.Date; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException;import org.junit.Test;import cn.zy.utils.JdbcUtils;public class JdbcUtilsTest {@Testpublic void insert(){Connection conn = null;PreparedStatement st = null;ResultSet rs = null;try {//獲取一個數(shù)據(jù)庫連接conn = JdbcUtils.getConnection();//要執(zhí)行的SQL模板,SQL中的參數(shù)使用?作為占位符String sql = "insert into users(id,name,password,email,birthday) values(?,?,?,?,?)";//通過conn對象獲取負(fù)責(zé)執(zhí)行SQL命令的prepareStatement對象st = conn.prepareStatement(sql);//為SQL語句中的參數(shù)賦值,注意,索引是從1開始的st.setInt(1, 1);st.setString(2,"scott");st.setString(3,"tiger");st.setString(4, "zy5724@163.com");st.setDate(5, new java.sql.Date(new Date().getTime()));int num = st.executeUpdate();if (num>0){System.out.print("更新成功");}} catch (SQLException e) {e.printStackTrace();}finally{JdbcUtils.release(conn, st, rs);}}@Testpublic void query(){Connection conn = null;PreparedStatement st = null;ResultSet rs = null;try {//獲取一個數(shù)據(jù)庫連接conn = JdbcUtils.getConnection();//要執(zhí)行的SQL模板,SQL中的參數(shù)使用?作為占位符String sql = "select * from users where id=?";//通過conn對象獲取負(fù)責(zé)執(zhí)行SQL命令的prepareStatement對象st = conn.prepareStatement(sql);st.setInt(1, 1);rs = st.executeQuery();if (rs.next()){System.out.println(rs.getString("name"));}} catch (SQLException e) {e.printStackTrace();}finally{JdbcUtils.release(conn, st, rs);}} }

?

總結(jié)

以上是生活随笔為你收集整理的JavaWeb学习总结(九)--JDBC入门的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。