利用JDBC操作mysql資料庫,實現增刪改查的功能
阿新 • • 發佈:2021-01-27
資料庫連線被用於向資料庫伺服器傳送命令和 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;
}