JavaWeb学习总结(九)--JDBC入门
?一、什么是JDBC
? ? ?JDBC(Java DataBase Connectivity)就是Java數據庫連接,說白了就是用Java語言來操作數據庫。原來我們操作數據庫是在控制臺使用SQL語句來操作數據庫,JDBC是用Java語言向數據庫發送SQL語句。
?
組成JDBC的2個包:
java.sql
javax.sql
?開發JDBC應用需要以上2個包的支持外,還需要導入相應JDBC的數據庫實現(即數據庫驅動)。
?
二、實現代碼
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 {/** 得到數據庫連接*/public static Connection getConnection() throws Exception{//加載驅動Class.forName("com.mysql.jdbc.Driver");//mysql的urlString url = "jdbc:mysql://localhost:3306/testdb";Connection con = DriverManager.getConnection(url,"root","123456");return con;}/** 實現增刪改*/@Testpublic void insert() throws Exception{//得到連接Connection con = getConnection();//Statement語句的發送器,它的功能就是向數據庫發送sql語句!Statement stmt = con.createStatement();String sql = "insert user(name,password) value('scott','tiger')";//執行sql stmt.executeUpdate(sql);}/** 查詢*/@Testpublic void query() throws Exception{Connection con = getConnection();Statement stmt = con.createStatement();String sql = "select * from user";//得到查詢出來的結果集ResultSet rs = stmt.executeQuery(sql);//輸出查詢到的結果while (rs.next()){String username = rs.getString("name");String password = rs.getString("password");System.out.println(username + ','+ password);}/** 關閉資源*/rs.close();stmt.close();con.close();} }?
三、JDBC對象介紹
在JDBC中常用的類有:
- DriverManager
- Connection
- Statement
- ResultSet
3.1 DriverManager
?Jdbc程序中的DriverManager用于加載驅動,并創建與數據庫的鏈接,這個API的常用方法:
?? ?DriverManager.getConnection(url, user, password);
常用數據庫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,它用于代表數據庫的鏈接,Collection是數據庫編程中最重要的一個對象,客戶端與數據庫所有交互都是通過connection對象完成的,這個對象的常用方法:
- createStatement():創建向數據庫發送sql的statement對象。
- prepareStatement(sql) :創建向數據庫發送預編譯sql的PrepareSatement對象。
- prepareCall(sql):創建執行存儲過程的callableStatement對象。
- setAutoCommit(boolean?autoCommit):設置事務是否自動提交。
- commit() :在鏈接上提交事務。
- rollback() :在此鏈接上回滾事務。
3.3 Statement
Jdbc程序中的Statement對象用于向數據庫發送SQL語句, Statement對象常用方法:
- executeQuery(String?sql) :用于向數據發送查詢語句。
- executeUpdate(String?sql):用于向數據庫發送insert、update或delete語句
- execute(String sql):用于向數據庫發送任意sql語句
- addBatch(String?sql) :把多條sql語句放到一個批處理中。
- executeBatch():向數據庫發送一批sql語句執行。
3.4 ResultSet
Jdbc程序中的ResultSet用于代表Sql語句的執行結果。Resultset封裝執行結果時,采用的類似于表格的方式。ResultSet 對象維護了一個指向表格數據行的游標,初始的時候,游標在第一行之前,調用ResultSet.next() 方法,可以使游標指向具體的數據行,進行調用方法獲取該行的數據。
ResultSet既然用于封裝執行結果的,所以該對象提供的都是用于獲取數據的get方法:
獲取任意類型的數據
getObject(int index)
getObject(string columnName)
獲取指定類型的數據,例如:
getString(int index)
getString(String columnName)
ResultSet還提供了對結果集進行滾動的方法:
- next():移動到下一行
- Previous():移動到前一行
- absolute(int row):移動到指定行
- beforeFirst():移動resultSet的最前面。
- afterLast() :移動到resultSet的最后面。
3.5?PreparedStatement
??PreperedStatement是Statement的子類,它的實例對象可以通過調用Connection.preparedStatement()方法獲得,相對于Statement對象而言:PreperedStatement可以避免SQL注入的問題。在實際項目中,應該都使用PreparedStatement.
Statement會使數據庫頻繁編譯SQL,可能造成數據庫緩沖區溢出。PreparedStatement可對SQL進行預編譯,從而提高數據庫的執行效率。并且PreperedStatement對于sql中的參數,允許使用占位符的形式進行替換,簡化sql語句的編寫。
?
?注意MySQL中默認是沒有開啟預編譯的,如果需要打開需要修改url:jdbc:mysql://localhost:3306/test?useServerPrepStmts=true
四、使用JdbcUtils和PreparedStatement
1. 創建users表
CREATE TABLE users(id INT PRIMARY KEY,NAME VARCHAR(40),PASSWORD VARCHAR(40),email VARCHAR(60),birthday DATE );2. 新建一個Java工程,導入驅動包,在src下創建一個db.properties文件
?
?在db.properties中編寫MySQL數據庫的連接信息,如下所示:
driver=com.mysql.jdbc.Driver url=jdbc\:mysql\://localhost\:3306/testdb username=root password=1234563.編寫一個JdbcUtils工具類,用于連接數據庫,獲取數據庫連接和釋放數據庫連接,代碼如下:
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類被加載時執行一次!static {try {// 給props進行初始化,即加載dbconfig.properties文件到props對象中InputStream in = JdbcUtils.class.getClassLoader().getResourceAsStream("db.properties");Properties prop = new Properties();prop.load(in);//獲取數據庫的驅動driver = prop.getProperty("driver");//獲取urlurl= prop.getProperty("url");//獲取用戶名username = prop.getProperty("username");//獲取密碼password = prop.getProperty("password");//加載驅動 Class.forName(driver);} catch (Exception e) {throw new ExceptionInInitializerError(e);}}/** 獲取數據庫連接對象*/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{//關閉存儲查詢結果的ResultSet對象 rs.close();}catch (Exception e) {e.printStackTrace();}rs = null;}if(st!=null){try{//關閉負責執行SQL命令的Statement對象 st.close();}catch (Exception e) {e.printStackTrace();}}if(conn!=null){try{//關閉Connection數據庫連接對象 conn.close();}catch (Exception e) {e.printStackTrace();}}} }?
4.使用PreparedStatement實現增刪改查
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 {//獲取一個數據庫連接conn = JdbcUtils.getConnection();//要執行的SQL模板,SQL中的參數使用?作為占位符String sql = "insert into users(id,name,password,email,birthday) values(?,?,?,?,?)";//通過conn對象獲取負責執行SQL命令的prepareStatement對象st = conn.prepareStatement(sql);//為SQL語句中的參數賦值,注意,索引是從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 {//獲取一個數據庫連接conn = JdbcUtils.getConnection();//要執行的SQL模板,SQL中的參數使用?作為占位符String sql = "select * from users where id=?";//通過conn對象獲取負責執行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);}} }?
總結
以上是生活随笔為你收集整理的JavaWeb学习总结(九)--JDBC入门的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 研究微信即时通讯的服务端、朋友圈、红包、
- 下一篇: ES6新特性5:类(Class)和继承(