首先来看一个程序
程序结构图 JdbcDemo1代码
public class JdbcDemo1 { public static void main(String[] args) throws Exception{ //1.注册驱动 DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver()); //2.获取连接 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/spring?useSSL=false&serverTimezone=GMT%2B8&characterEncoding=utf8&rewriteBatchedStatements=true","root","root"); //3.获取操作数据库的预处理对象 PreparedStatement pstm = conn.prepareStatement("select * from account"); //4.执行SQL,得到结果集 ResultSet rs = pstm.executeQuery(); //5.遍历结果集 while(rs.next()){ System.out.println(rs.getString("name")); } //6.释放资源 rs.close(); pstm.close(); conn.close(); } }pom依赖
<dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.11</version> </dependency> </dependencies>数据库表结构和数据 运行main方法结果: 上面的代码中注册驱动这一步使用new com.mysql.cj.jdbc.Driver()来注册驱动,从而导致我们无法抽取工具类,它的独立性是很差的。也就是耦合度(耦合指的是程序间的依赖关系,包括类之间的依赖和方法之间的依赖)较高。实际开发中,应该做到编译器不依赖,运行期才依赖。
所以我们改造上面的代码为(我们平时的写法):
public class JdbcDemo1 { public static void main(String[] args) throws Exception{ //1.注册驱动 // DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver()); Class.forName("com.mysql.cj.jdbc.Driver"); //2.获取连接 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/spring?useSSL=false&serverTimezone=GMT%2B8&characterEncoding=utf8&rewriteBatchedStatements=true","root","root"); //3.获取操作数据库的预处理对象 PreparedStatement pstm = conn.prepareStatement("select * from account"); //4.执行SQL,得到结果集 ResultSet rs = pstm.executeQuery(); //5.遍历结果集 while(rs.next()){ System.out.println(rs.getString("name")); } //6.释放资源 rs.close(); pstm.close(); conn.close(); } }所以,我们解耦(解耦指的是降低程序间的依赖关系,但是并不能完全消除)的思路: 第一步:利用反射来创建对象,而避免使用new关键字
但是同时引发出新的问题,如何我的驱动想要oracle而不是mysql,就得去改Class.forName()方法中的字符串,这我觉得是很不ok的。那怎么解决呢?看第二步
第二步:通过读取配置文件来获取要创建的对象全限定名。