JavaWeb学习总结(九)--JDBC入门
?一、什么是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=1234563.編寫一個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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 研究微信即时通讯的服务端、朋友圈、红包、
- 下一篇: ES6新特性5:类(Class)和继承(