一、 目的:簡化書寫
二、分析:
需求不想傳遞引數,但是還要保證工具類的通用性
解決:組態檔
jdbc.properties
url =jdbc:mysql://localhost:3306/
username =root
password =gcy123456
driver =com.mysql.jdbc.Driver
Connection conn = null;
Statement state = null;
ResultSet rs = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306","root","root");
String sql = "select *from stu";
state = conn.createStatement();
rs = state.executeQuery(sql);
while (rs.next()) {
Singer singer = new Singer();
singer.setId(rs.getInt("id"));
singer.setUsername(rs.getString("username"));
singer.setAge(rs.getInt("age"));
singer.setSex(rs.getInt("sex"));
singer.setGrade(rs.getInt("grade"));
ls.add(singer);
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
//判斷一下防止空指標異常
if (rs!=null) {
rs.close();
}
if (state!=null) {
state.close();
}
if (conn!=null) {
conn.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
增:
說明:預期目的是為了將(’‘18000001’’,小紅,’‘18’’,1,’‘78’’)資料插入到資料庫中,執行後結果如圖所示。
package com.gcy.javaweb.preparedstatement;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Properties;
import org.junit.Test;
public class PreparedStatementTest {
@Test
//向student表中插入一條資料
public void testInsert(){
Connection con = null;
PreparedStatement ps = null;
try {
//1.讀取組態檔的4個基本資訊
InputStream is = ConnectionTest.class.getClassLoader().getResourceAsStream("jdbc.properties");
Properties pros = new Properties();
pros.load(is);
String user = pros.getProperty("user");
String password = pros.getProperty("password");
String url = pros.getProperty("url");
String driverClass = pros.getProperty("driverClass");
//2.載入驅動
Class.forName(driverClass);
//3.獲取連線
con = DriverManager.getConnection(url,user,password);
System.out.println(con);
//4.預編譯SQL語句,返回PreparedStatement的範例
String sql = "insert into student(id,username,age,sex,grade)values(?,?,?,?,?)";//?:預留位置
ps = con.prepareStatement(sql);
//5.填充預留位置
ps.setString(1, "18000001");
ps.setString(2, "小紅");
ps.setString(3, "18");
ps.setString(4, "1");
ps.setString(5, "78");
//6.執行SQL
ps.execute();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
//7.資源關閉
try {
if(ps != null)
ps.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
if(con != null)
con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
刪:
說明:預期目的是為了將學號為18000000資料從資料庫中刪除,執行後結果如圖所示。
@Test
public void testCommonUpdate() {
String sql = "DELETE FROM 'student'WHERE id='18000000'";
update(sql,2);
}
//通用的增刪改操作
public void update(String sql,Object ...args){//sql中預留位置的個數與可變形參長度相同
Connection con = null;
PreparedStatement ps = null;
try {
//1.獲取資料庫連線
con = JDBCUtils.getConnection();
//2.預編譯SQL語句,返回PraparedStatement的範例
ps = con.prepareStatement(sql);
//3.填充預留位置
for(int i=0;i<args.length;i++) {
ps.setObject(i+1, args[i]);//引數宣告:列號從1開始
}
//4.執行SQL
ps.execute();
}
catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
//5.資源的關閉
JDBCUtils.closeResource(con,ps);
}
}
改:
說明:預期目的是為了將學號為18000000資料姓名改為小蘭,執行後結果如圖所示。
//修改student表的一條記錄
@Test
public void testUpdate() {
//1.獲取資料庫連線
Connection con = null;
PreparedStatement ps = null;
try {
con = JDBCUtils.getConnection();
//2.預編譯SQL語句,返回PraparedStatement的範例
String sql = "update student set username =? where id = ?";
ps = con.prepareStatement(sql);
//3.填充預留位置
ps.setObject(1, "小蘭");
ps.setObject(2, "18000000");//第二列 第三行
//4.執行SQL
ps.execute();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
//5.資源的關閉
JDBCUtils.closeResource(con,ps);
}
}
}
查:
說明:預期目的是為了在資料庫中查詢學號為18036059的學生資訊,執行後結果如圖所示。
package com.javaweb3.preparedstatement;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import org.junit.Test;
import com.javaweb4.util.JDBCUtils;
/**
* 針對於student表的查詢
* @author gcy
*
*/
public class StudentForQuery {
@Test
public void testQuery1(){
Connection con = null;
PreparedStatement ps = null;
//執行並返回結果集
ResultSet resultSet = null;
try {
con = JDBCUtils.getConnection();
String sql = "select id,username,age,sex,grade from student where id = ?";
ps = con.prepareStatement(sql);
ps.setObject(1, "18036059");
resultSet = ps.executeQuery();
//處理結果集
if(resultSet.next()) {//判斷結果集的下一條是否有資料,如果有資料返回true,並且指標下移;如果返回false,指標不會下移
//獲取當前字條資料的各個欄位值
int id = resultSet.getInt(1);
String username = resultSet.getString(2);
String age = resultSet.getString(3);
String sex = resultSet.getString(4);
String grade = resultSet.getString(5);
// Date birth = resultSet.getDate(4);
/*處理結果集
* 方式一:
*/
System.out.println(id+","+username+","+age+","+sex+","+grade);
// //方式二:
// Object[] data = new Object[] {id,name,email,birth};
// for(int i=0;i<data.length;i++) {
// System.out.print(data[i]+" ");
// }
}
}catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
//關閉資源
JDBCUtils.closeResource(con, ps, resultSet);
}
}
}
三、對以上程式碼的說明
以上對資料庫資料的增刪查操作全都是使用PreparedStatement實現的,PreparedStatement是從Statement擴充套件而來的。不使用Statement是因為它不僅需要拼寫sql語句,更嚴重的是存在SQL隱碼攻擊的問題。PreparedStatement是預編譯的,對於批次處理可以大大提高效率。
四、總結
以上就是本人對JDBC和DBUtils工具類的全部認識和簡單的運用方法,不足之處歡迎大家批評指正!