原始的连接方案:

1 @Test2 public voidtestConnectin1() {3 try{4 //1.创建数据库驱动中对java.sql.Driver抽象类的实现类(即:Driver)的实例化对象

5 Driver driver = newcom.mysql.cj.jdbc.Driver();6 //2.提供connection方法的参数:url,指明具体操作的数据

7 String url = "jdbc:mysql://localhost:3306/test?serverTimezone=GMT%2B8";8 //3.提供connection方法的参数:info,即Properties类的对象,指明用户名和密码

9 Properties info = newProperties();10 info.setProperty("user", "root");11 info.setProperty("password", "password");12 //4.通过调用Driver实现类对象的connection方法获取数据库连接

13 Connection conn =driver.connect(url, info);14 System.out.println(conn);15 } catch(SQLException e) {16 e.printStackTrace();17 }18 }

可优化的地方:第一步显式地使用了第三方的数据库API(即:Driver),因而不具备良好的可移植性和通用性。

改进方案一:可以通过反射的方式动态的创建指定类的实例化对象

1 @Test2 public voidtestConnection2() {3 try{4 //1. 通过反射的方式来创建一个指定类(com.mysql.cj.jdbc.Driver)的实例化对象5   //获取了Class类的对象

6 Class cla = Class.forName("com.mysql.cj.jdbc.Driver");7   //通过Class的实例来创建指定类的实例化对象

8 Driver driver =(Driver) cla.newInstance();9 //2. 提供connection方法的参数:url,指明具体操作的数据

10 String url = "jdbc:mysql://localhost:3306/test?serverTimezone=GMT%2B8";11 //3.提供connection方法的参数:info,即Properties类的对象,指明用户名和密码

12 Properties info = newProperties();13 info.setProperty("user", "root");14 info.setProperty("password", "password");15 //4.通过调用Driver实现类对象的connection方法获取数据库连接

16 Connection conn =driver.connect(url, info);17 System.out.println(conn);18 } catch(Exception e) {19 e.printStackTrace();20 }21 }

改进方案二:使用DriverManager(驱动程序管理器类)替换Driver类

1 @Test2 public voidtestConnection3() {3 try{4 //1. 提供getConnection方法的三个基本参数:

5 String url = "jdbc:mysql://localhost:3306/test?serverTimezone=GMT%2B8";6 String user = "root";7 String password = "password";8 //2. 通过反射的方式来创建一个指定类(com.mysql.cj.jdbc.Driver)的实例化对象

9 Class cla = Class.forName("com.mysql.cj.jdbc.Driver");10 Driver driver =(Driver) cla.newInstance();11 //3. 注册驱动

12 DriverManager.registerDriver(driver);13 //4. 通过DriverManager获取数据库连接

14 Connection conn =DriverManager.getConnection(url, user, password);15 System.out.println(conn);16 } catch(Exception e) {17 e.printStackTrace();18 }19 }

改进方案三:

因为在mysql的驱动中可以发现对 java.sql.Driver 抽象类的实现Driver类中声明有以下的静态代码块:

1 static{2 try{3 DriverManager.registerDriver(newDriver());4 } catch(SQLException var1) {5 throw new RuntimeException("Can't register driver!");6 }7 }

该代码块在我们加载Driver类时执行( Class.forName("com.mysql.cj.jdbc.Driver") )帮我们完成注册驱动。

因此我们不需要自己重复的进行驱动的注册。

1 @Test2 public voidtestConnection4() {3 try{4 //1. 提供getConnection方法的三个基本参数:

5 String url = "jdbc:mysql://localhost:3306/test?serverTimezone=GMT%2B8";6 String user = "root";7 String password = "password";8 //2. 通过反射的方式来创建一个指定类(com.mysql.cj.jdbc.Driver)的实例化对象

9 Class.forName("com.mysql.cj.jdbc.Driver");10 //3. 通过DriverManager获取数据库连接

11 Connection conn =DriverManager.getConnection(url, user, password);12 System.out.println(conn);13 } catch(Exception e) {14 e.printStackTrace();15 }16 }

问题:用于连接的一些基本参数嵌入在代码中不利于代码的维护

最终方案:将数据库连接需要的4个基本信息声明在配置文件中,通过读取配置文件的方式,获取连接

将代码中的四个基本参数存放在工程的src目录下单独的 jdbc.properties 文件中:

1 user=root2 password=password3 url=jdbc:mysql://localhost:3306/test?serverTimezone=GMT%2B8

4 driverClass=com.mysql.cj.jdbc.Driver

1 @Test2 public voidtestConnerction() {3 try{4 //1.加载配置文件(使用getResourceAsStream加载src目录下的配置文件)5 //ClassLoader.getSystemClassLoader() 和 类名.class.getClassLoader(),两种方式都可以获取系统类加载器6 //方式一:调用运行时类的属性(.class)来获取Class对象

7 InputStream is = ConnectionTestCopy.class.getClassLoader().getResourceAsStream("jdbc.properties");8 //方式二:ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc.properties")

9 Properties pros = newProperties();10 pros.load(is);11 //读取配置文件中的信息

12 String user = pros.getProperty("user");13 String password = pros.getProperty("password");14 String url = pros.getProperty("url");15 String driverClass = pros.getProperty("driverClass");16 //加载驱动

17 Class.forName(driverClass);18 //获取连接

19 Connection conn =DriverManager.getConnection(url, user, password);20 System.out.println(conn);21 } catch(Exception e) {22 e.printStackTrace();23 }24 }