2020-10-08

2020-10-10 17:00:04

JDBCUtils

一、 目的:簡化書寫
二、分析:

  • 1,註冊驅動
  • 2,抽取一個方法獲取連線物件

需求不想傳遞引數,但是還要保證工具類的通用性
解決:組態檔

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工具類的全部認識和簡單的運用方法,不足之處歡迎大家批評指正!