(一)JDBC过程
1,注册驱动com.mysql.jdbc.Driver
DriverManager.registerDriver(new Driver());
这种注册方式有两个缺点 :
解决方案: Class.forName(“com.mysql.jdbc.Driver”);
2,获取数据库连接java.sql.Connection
Connection conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/jtdb", "root","root");
3,获取传输器java.sql.Statement
Statement st = conn.createStatement();
常用方法:
executeQuery() --- 用来执行查询的SQL
executeUpdate() -- 用来执行增删改的SQL
4,执行SQL。java.sql.ResultSet
String sql ="select * from user";
ResultSet rs = st.executeQuery(sql);
5,遍历结果集
while(rs.next()){
//根据列的索引获取第一列的数据
String id = rs.getString(1);
//根据列的索引获取第二列的数据
String username = rs.getString(2);
//根据列的索引获取第三列的数据
String password = rs.getString(3);
System.out.println(id+username+password);
}
6,释放资源
在jdbc的开发中,释放资源的过程是必须要保证完成的,jdbc资源非常稀缺。在释放资源的过程中,会发生异常,这个时候为了保证资源一定会被释放,需要把释放资源的代码放在finally语句块中,来保证finally块中的代码一定会被执行到。
正着开,倒着关
rs.close();//释放结果集资源
st.close();//释放传输器资源
conn.close();//释放连接资源
(二)对其进行优化和改进(JDBCUtils工具类)
因为每次 第一步注册驱动 和 第二步获取数据库连接 和 第六步释放资源 每次连接数据库这三步都是一样的。所以将其封装成工具方法。对其进行调用就可以了,没有必要每次进行重写。
我们将注册驱动不要写死,并将jdbcUrl和root和password都放到属性文件中,这样可以灵活的修改。
编写属性文件注意事项:
位置:src new-file jdbc.properties 后缀名:properties
格式:key=value,想要获取value时,通过get(key)来实现。
调用属性文件中的内容,需要用到
ResourceBundle rb = ResourceBundle.getBundle("jdbc"); //标红的为你的属性文件的名字,后缀必须为properties!!!
1 public class JDBCUtils { 2 3 4 5 //1,私有化构造函数,外界无法直接创建对象 6 7 private JDBCUtils(){} 8 9 10 11 //终极优化:只加载一次属性文件 12 13 static ResourceBundle rb = null; 14 15 static{ 16 17 //a,,,,读取属性文件 18 19 rb = ResourceBundle.getBundle("jdbc"); 20 21 } 22 23 24 25 26 27 //2,提供公共的,静态的,getConnection 方法, 28 29 //用来给外界提供数据库连接 30 31 public static Connection getConnection(){ 32 33 try { 34 35 36 37 //1,注册驱动 38 39 //b,,获取属性文件里的内容 40 41 Class.forName(rb.getString("driverClass")); 42 43 44 45 //2,获取数据库连接 46 47 String url=rb.getString("jdbcUrl"); 48 49 String user=rb.getString("user"); 50 51 String password=rb.getString("password"); 52 53 54 55 Connection conn = 56 57 DriverManager.getConnection( 58 59 url, user, password); 60 61 62 63 return conn; 64 65 } catch (Exception e) { 66 67 e.printStackTrace(); 68 69 } 70 71 return null; 72 73 } 74 75 76 77 //3,提供公共的,静态的,close方法, 78 79 //用来释放资源 80 81 public static void close(ResultSet rs, 82 83 Statement st, 84 85 Connection conn){ 86 87 //释放结果集资源 88 89 //非空判断,防止空指针异常 90 91 if(rs!=null){ 92 93 try { 94 95 rs.close(); 96 97 } catch (SQLException e) { 98 99 e.printStackTrace(); 100 101 }finally{ 102 103 rs=null;//手动置空 104 105 } 106 107 } 108 109 //释放传输器资源 110 111 //非空判断,防止空指针异常 112 113 if(st!=null){ 114 115 try { 116 117 st.close(); 118 119 } catch (SQLException e) { 120 121 e.printStackTrace(); 122 123 }finally{ 124 125 st=null;//手动置空 126 127 } 128 129 } 130 131 //释放数据库连接资源 132 133 //非空判断,防止空指针异常 134 135 if(conn!=null){ 136 137 try { 138 139 conn.close(); 140 141 } catch (SQLException e) { 142 143 e.printStackTrace(); 144 145 }finally{ 146 147 conn=null;//手动置空 148 149 } 150 151 } 152 153 154 155 156 157 }
测试代码如下所示
1 public class TestUtils { 2 3 //单元测试方法:@Test + void 4 5 @Test 6 7 public void hello(){ 8 9 Connection conn = null;//声明连接对象 10 11 Statement st = null;//声明传输器对象 12 13 ResultSet rs = null;//声明结果集对象 14 15 16 17 try { 18 19 //1,注册驱动 2,获取数据库连接 20 21 conn = JDBCUtils.getConnection(); 22 23 24 25 // 3,获取传输器java.sql.Statement 26 27 st = conn.createStatement(); 28 29 30 31 // 4,执行SQL。java.sql.ResultSet 32 33 String sql ="select * from user"; 34 35 rs = st.executeQuery(sql); 36 37 38 39 // 5,遍历结果集 40 41 while(rs.next()){ 42 43 //根据列的索引获取第一列的数据 44 45 // String id = rs.getString(1); 46 47 //根据列的名字获取第一列的数据 48 49 String id = rs.getString("id"); 50 51 // int id1 = rs.getInt(1); 52 53 54 55 //根据列的索引获取第二列的数据 56 57 String username = rs.getString(2); 58 59 60 61 //根据列的索引获取第三列的数据 62 63 String password = rs.getString(3); 64 65 66 67 System.out.println(id+username+password); 68 69 70 71 } 72 73 74 75 } catch (SQLException e) { 76 77 e.printStackTrace(); 78 79 }finally{//保证资源一定会被释放 80 81 // 6,释放资源 82 83 JDBCUtils.close(rs, st, conn); 84 85 } 86 87 88 89 } 90 91 }