这几天一直在研究JDBC,相比于之前那种简单的代码,更需要追求封装性更好的代码,这样耦合度才会降低,比如,各种数据库的配置都放在一个properties文件中,这样在维护时就可以不用修改代码,直接修改配置文件的数据库信息即可。这个例子我用的是Mysql数据库,首先目录结构如下图所示:
jdbc.properties中的主要内容如下图所示,localhost:3306/后面是数据库的名称
然后接下来就到了重头戏了,代码部分,这里我封装了一个公共类,然后里面暂时写了两个方法,连接数据库和释放资源,当然这一次的实例不涉及到select操作,所以释放资源没有,不过道理是一样的,不过释放资源时,相比statement,connection。ResultSet对象是要先释放的
1 公共类:JDBCUtils 2 3 package com.jdbc.basedemo; 4 5 import java.io.IOException; 6 import java.io.InputStream; 7 import java.sql.Connection; 8 import java.sql.DriverManager; 9 import java.sql.ResultSet; 10 import java.sql.SQLException; 11 import java.sql.Statement; 12 import java.util.Properties; 13 14 /* 15 * 操作数据库的公共类,里面是一些公共方法 16 * */ 17 public class JDBCUtils { 18 // 获取数据库连接 19 // 连接数据库 20 21 public static Connection getConnection() throws ClassNotFoundException, IOException, SQLException { 22 // 定义相关变量 23 String driverClass = null; 24 String jdbcUrl = null; 25 String user = null; 26 String password = null; 27 28 // 读取配置文件jdbc.properties 29 InputStream in = JDBCUtils.class.getClassLoader().getResourceAsStream("jdbc.properties"); 30 31 Properties properties = new Properties(); 32 properties.load(in); 33 driverClass = properties.getProperty("driver"); 34 jdbcUrl = properties.getProperty("jdbcUrl"); 35 user = properties.getProperty("user"); 36 password = properties.getProperty("password"); 37 // 加载数据库驱动 38 Class.forName(driverClass); 39 // 获取连接 40 Connection conn = DriverManager.getConnection(jdbcUrl, user, password); 41 return conn; 42 } 43 44 // 释放资源的方法 45 46 public static void closeSource(ResultSet rs, Statement statement, Connection conn) { 47 if (rs != null) { 48 try { 49 rs.close(); 50 } catch (Exception e) { 51 // TODO: handle exception 52 e.printStackTrace(); 53 } 54 } 55 if (statement != null) { 56 try { 57 statement.close(); 58 } catch (Exception e) { 59 // TODO: handle exception 60 e.printStackTrace(); 61 } 62 } 63 if (conn != null) { 64 try { 65 conn.close(); 66 } catch (Exception e) { 67 // TODO: handle exception 68 e.printStackTrace(); 69 } 70 } 71 } 72 73 }
然后写了一个测试类,里面封装了一个公共的执行SQL的方法:
1 TestJDBCDemo文件: 2 3 package com.jdbc.basedemo; 4 5 import java.io.IOException; 6 import java.sql.Connection; 7 import java.sql.SQLException; 8 import java.sql.Statement; 9 10 import org.junit.Test; 11 12 public class TestJDBCDemo { 13 14 public static void main(String[] args) { 15 // TODO Auto-generated method stub 16 17 } 18 19 // 封装一个通用的更新方法,适用于INSERT,UPDATE,DELETE 20 public void updateData(String sql) { 21 // 获取连接 22 Connection conn = null; 23 Statement statement = null; 24 try { 25 conn = JDBCUtils.getConnection();// 获得连接 26 statement = conn.createStatement(); // 创建statement对象 27 statement.executeUpdate(sql); 28 System.out.println(sql); 29 System.out.println("SQL执行成功"); 30 } catch (ClassNotFoundException e) { 31 // TODO Auto-generated catch block 32 e.printStackTrace(); 33 } catch (IOException e) { 34 // TODO Auto-generated catch block 35 e.printStackTrace(); 36 } catch (SQLException e) { 37 // TODO Auto-generated catch block 38 e.printStackTrace(); 39 } finally { 40 JDBCUtils.closeSource(rs,statement, conn); 41 System.out.println("资源关闭成功"); 42 } 43 44 }
// 测试方法
//这里用的是Junit框架,需要Junit的jar包
@Test
public void test01() {
String sql = "UPDATE userinfo SET username='伊戈达拉' WHERE username like '%杜兰特%'";
updateData(sql);
}
}
最后控制台运行结果截图附上: