1. 程式人生 > 其它 >利用JDBC操作mysql資料庫,實現增刪改查的功能

利用JDBC操作mysql資料庫,實現增刪改查的功能

技術標籤:JDBC資料庫javamysqljdbcsql

資料庫連線被用於向資料庫伺服器傳送命令和 SQL 語句,並接受資料庫伺服器返回的結果。其實一個數據庫連
接就是一個Socket連線

一、增加操作

//向資料庫中新增一條資訊
	@Test
	public void test1() {
		
		Connection conn=null;
		PreparedStatement ps=null;
		
		try {
			//1.讀取配置檔案
			InputStream is = ClassLoader.getSystemClassLoader().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.獲取連線
			conn = DriverManager.getConnection(url, user, password);
			//4.預編譯sql語句,返回PreparedStatement的例項
			String sql = "insert into student(sno,sname,ssex,sage,sdept)value(?,?,?,?,?)";//?為佔位符
			ps = conn.prepareStatement(sql);
			//5.填充佔位符
			ps.setString(1, "1466223131");
			ps.setString(2, "李二");
			ps.setString(3, "男");
			ps.setString(4, "23");
			ps.setString(5, "商學院");
			//6.執行sql操作
			ps.execute();
			System.out.println("修改成功!");
		} catch (Exception e) {
			e.getStackTrace();
		}finally {
			//7.資源關閉
			try {
				if (ps!=null) 
				ps.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
			try {
				if (conn!=null) 
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
			
		}
		
	}

結果如下:
在這裡插入圖片描述

此處程式碼雖然完成了預期的功能,但是並不是一段好的程式碼,程式碼冗餘量,硬編碼太多,下面我們將對它進行修改,以減小冗餘和耦合。

二、修改操作

/**
	 * 
	 *@Description 獲取資料庫連線
	 *@author 
	 *@data 
	 */
	public static Connection getConnection() throws Exception {
		//1.讀配置檔案中的4個基本資訊
				InputStream is = ClassLoader.getSystemClassLoader().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.獲取連線
				Connection conn =DriverManager.getConnection(url, user, password);
				return conn;
	}
	/**
	 * 
	 *@Description 關閉資源
	 *@author 
	 *@data 
	 */
	public static void closeResource(PreparedStatement ps,Connection conn) {
		//7.資源關閉
		try {
			if (ps!=null) 
			ps.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		try {
			if (conn!=null) 
			conn.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}


//修改資料庫的一條資訊
	@Test
	public void test2() {
		
		Connection conn=null;
		PreparedStatement ps=null;
		try {
			//1.獲取資料庫連線
			conn = JDBCUtils.getConnection();
			
			//2.預編譯sql語句,返回PreparedStatement的例項
			String sql = "update student set sname = ? where sno = ?";
			ps = conn.prepareStatement(sql);
			
			//3.填充佔位符
			ps.setObject(1, "莫扎特");
			ps.setObject(2, "5720183576");
			//4.執行
			ps.execute();
			System.out.println("修改成功!");
		}  catch (Exception e) {
			e.printStackTrace();
		}
		//5.資源關閉
		JDBCUtils.closeResource(ps, conn);
	}

這裡將資料庫的連線和關閉放在了一個工具類中,方便使用,減少冗餘。下面繼續來降低耦合。
結果如下:

結果如下:
在這裡插入圖片描述

三、通用的增、刪、改 操作

public void update(String sql,Object ...args) {
		Connection conn=null;
		PreparedStatement ps=null;
		try {
			//資料庫連線
			conn = JDBCUtils.getConnection();
			//預編譯sql語句
			ps = conn.prepareStatement(sql);
			//填充佔位符
			for (int i = 0; i < args.length; i++) {
				ps.setObject(i+1, args[i]);
			}
			//執行
			ps.execute();
			System.out.println("操作成功!");
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			//關閉資源
			JDBCUtils.closeResource(ps, conn);
		}
		
	}

這裡將硬編碼部分抽離出這塊程式碼,降低耦合

//程式碼測試
@Test
	public void test3() {
		
//		String sql = "delete from student where sno = ?";
//		update(sql, "123456789");
		
		String sql = "insert into student(sno,sname,ssex,sage,sdept)value(?,?,?,?,?)";
		update(sql, "1235435465","張三","男","22","計算機學院");
		
	}

結果如下:
在這裡插入圖片描述

四、查詢操作


	public Student queryForStudent(String sql,Object...args) {
		
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			conn = JDBCUtils.getConnection();
			
			ps = conn.prepareStatement(sql);
			
			for (int i = 0; i < args.length; i++) {
				ps.setObject(i+1, args[i]);
			}
			
			rs = ps.executeQuery();
			//獲取結果集的元資料
			ResultSetMetaData rsmd = rs.getMetaData();
			//獲取結果集的列數
			int columnCount = rsmd.getColumnCount();
			
			if (rs.next()) {
				Student student = new Student();
				//處理一行資料的每一個列
				for (int i = 0; i < columnCount; i++) {
					Object columnValue = rs.getObject(i+1);
					
					//獲取列名
					String columnLabel = rsmd.getColumnLabel(i+1);
					
					//給student的某個屬性賦值為value,利用反射
					Field field = Student.class.getDeclaredField(columnLabel);
					field.setAccessible(true);
					field.set(student, columnValue);
				
				}
				System.out.println("查詢成功!");
				return student;
			}
		}  catch (Exception e) {
			e.printStackTrace();
		}finally {
			JDBCUtils.closeResource(ps, conn,rs);
		}
			return null;
	}
//查詢測試
	@Test
	public void test4() {
		
		String sql = "select sno,sname,ssex,sage,sdept from student where sno = ? ";
		Student student = queryForStudent(sql,"1235435465");
		System.out.println(student);
		
	}

說明:使用PreparedStatement實現的查詢操作可以替換Statement實現的查詢操作,解決Statement拼串和
SQL注入問題

結果如下:
在這裡插入圖片描述

五、針對不同表的查詢,利用泛型

public <T>T queryForStudent(Class<T> clazz,String sql,Object...args) {
		
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			conn = JDBCUtils.getConnection();
			
			ps = conn.prepareStatement(sql);
			
			for (int i = 0; i < args.length; i++) {
				ps.setObject(i+1, args[i]);
			}
			
			rs = ps.executeQuery();
			//獲取結果集的元資料
			ResultSetMetaData rsmd = rs.getMetaData();
			//獲取結果集的列數
			int columnCount = rsmd.getColumnCount();
			
			if (rs.next()) {
				T t = clazz.newInstance();
				//處理一行資料的每一個列
				for (int i = 0; i < columnCount; i++) {
					Object columnValue = rs.getObject(i+1);
					
					//獲取列名
					String columnLabel = rsmd.getColumnLabel(i+1);
					
					//給t的某個屬性賦值為value,利用反射
					Field field = clazz.class.getDeclaredField(columnLabel);
					field.setAccessible(true);
					field.set(t, columnValue);
				
				}
				System.out.println("查詢成功!");
				return t;
			}
		}  catch (Exception e) {
			e.printStackTrace();
		}finally {
			JDBCUtils.closeResource(ps, conn,rs);
		}
			return null;
	}