
关于JDBC的学习,其使用原理大致如下:
这里可以看到,Java提出了接口,又各个厂商自行实现,并且提供了驱动[JAR包],有驱动JDBC就可以进行连接使用该对应数据库。
我们列举5个JDBC的连接方式
在进行连接前先个获取数据库连接的各个要素
Driver的意思为驱动
Driver driver = null;
String url = null;
Properties info = null;
//Driver的connect方法获取连接信息
//连接对象 Connection
Connection connection = driver.connect(url,info);
//这个是驱动的实现类
//关于这个名字的cj是新版 8.0数据库必加的一段,包括后续URL也有需要加上的内容
Driver driver = new com.mysql.cj.jdbc.Driver();
URL
URL为互联网定位符,相信学过一些网页知识等,一定见过URL。
jdbc:mysql//localhost:3306/test
在注册驱动时,如果用的mysql 8.0 版本的一定要在网上下载和导入 8.0版本 jar包,而且8.0版本的 url 写法 不是 “jdbc:mysql://localhost:3306/数据库名” ,而是要在后面添加时区字段 serverTimezone=UTC —》 最终格式如下 “jdbc:mysql://localhost:3306/数据库名?serverTimezone=UTC”
还有最重要一点 ,mysql8.0 驱动类 Driver 路径是"com.mysql.cj.jdbc.Driver" ,中间多了个 cj
然而看完上面两段加粗内容,URL的写法应该如下
jdbc:mysql://127.0.0.1:3306/test?useSSL=false&
serverTimezone=UTC
关于每个数据库的URL写法差异都很大,而标准写法,则去下载的驱动里查找文档寻找URL写法[多为:README],详细自寻百度得知方法。
这里只是 5.0版本的写法,8.0不一样。
URL的写法也是固定的。
String url = "jdbc:mysql://127.0.0.1:3306/test?
useSSL=false&serverTimezone=UTC";//写法是固定的 version 8.0+ 写法
jdbc:主协议
mysql:子协议
127...1:IP地址
3306:端口号
test:数据库名
?useSSL=fasle&serverTimezone=UTC:时区字段为8.0数据库新增内容
//按照结构分解一遍来记忆会简单点
/*
主协议:jdbc
子协议:mysql
IP地址:localhost
端口:3306
数据库名:database name
时区字段: ?useSSL=false&serverTimezone=UTC
*/
String url = "jdbc:mysql://127.0.0.1:3306/test?useSSL=false&serverTimezone=UTC";
URL多写几次就行了,不难。
Properties类配置文件的 *** 作类Properties类(java.util.Properties)
setProperty(String key, String value)
调用 Hashtable 的方法 put
键值 key:value
//将用户名和密码封装在Properties类里
Properties info = new Properties();
info.setProperty("user","root");
info.setProperty("password","123456789");
现在我们调用一下方法运行程序来测试是否获得了数据库连接,注意需要抛出异常,这里直接使用main方法抛出最大的异常交给JVM处理即可。
import java.sql.Connection;
import java.sql.Driver;
import java.util.Properties;
public class ExceuteDDL{
public void test() throws Exception{
Driver driver = new com.mysql.cj.jdbc.Driver();
//按照结构分解一遍来记忆会简单点
/*
主协议:jdbc
子协议:mysql
IP地址:localhost
端口:3306
数据库名:database name
时区字段: ?useSSL=false&serverTimezone=UTC
*/
String url = "jdbc:mysql://127.0.0.1:3306/test?useSSL=false&serverTimezone=UTC";
//将用户名和密码封装在Properties类里
Properties info = new Properties();
info.setProperty("user","root");
info.setProperty("password","123456789");
//Driver的connect方法获取连接信息
//连接对象 Connection
Connection connection = driver.connect(url,info);
System.out.println(connection);
}
public static void main(String[] args)throws Exception {
new ExceuteDDL().test();
}
}
com.mysql.cj.jdbc.ConnectionImpl@22635ba0
这代表了成功连接了数据库
这里其实就是上面内容的总和。
连接方式二是对连接方式一的迭代
public void test() throws Exception{
Driver driver = new com.mysql.cj.jdbc.Driver();
这行代码是第三方的API,会影响到程序代码的移植性
如果需要程序更换其他数据库,一定不要以这样的方式出现。
这里通过反射来包装驱动类,来动态的获取。
反射是最后的内容,现在没有讲到,先使用个大概即可。
public void test2()throws Exception{
//获取Driver实现类对象:使用反射
Class.forName("com.mysql.cj.jdbc.Driver");
这里一定会出现异常,所以我们test2上抛出一个Exception异常交给调用它的方法 main方法。
Driver driver = (Driver)clazz.newInstance();//返回的是Object类型 通过强制转换来获取
import java.sql.Connection;
import java.sql.Driver;
import java.util.Properties;
public class ExceuteDDL{
public void test2()throws Exception{
//获取Driver实现类对象:使用反射
Class clazz = Class.forName("com.mysql.cj.jdbc.Driver");
//clazz.newInstance();//有构造器也有权限
Driver driver = (Driver)clazz.newInstance();//返回的是Object类型 通过强制转换来获取
//提供要连接的数据库
String url = "jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC";
Properties info = new Properties();
info.setProperty("user","root");
info.setProperty("password","123456789");
//获取连接
Connection conn = driver.connect(url,info);
System.out.println(conn);
}
public static void main(String[] args)throws Exception {
new ExceuteDDL().test2();
}
}
这种连接方式的通用性更好,但是也看到了关于反射的clazz.newInstance()方法已经被标志为了过时方法,相信还会有比第二种连接方式更好的连接方式。
从程序的角度来看,没有出现任何第三方的API,使程序有比较好的移植性。
方式三:使用DriverManager来替换Driver
DriverManager被直接翻译为 驱动管理器(管理者)后面的Manager也代表了经理的意思,为管理者。
sun公司提供的具体类 为class不是interface
//注册驱动
DriverManager.registerDriver(driver);
//获取连接
DriverManager.getConnection(url,user,password);
//获取Driver实现类的对象
Class clazz = Class.forName("com.mysql.cj.jdbc.Driver");//记得加cj
Driver driver = (Driver) clazz.newInstance();//记得强制转换
//提供其他三个连接基本信息
String url = "jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC";
String password = "123456789";
String user = "root";
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.util.Properties;
public class ExceuteDDL{
public void test3()throws Exception{
//获取Driver实现类的对象
Class clazz = Class.forName("com.mysql.cj.jdbc.Driver");
Driver driver = (Driver) clazz.newInstance();//记得强制转换
//提供其他三个连接基本信息
String url = "jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC";
String password = "123456789";
String user = "root";
//注册驱动
DriverManager.registerDriver(driver);
//获取连接
Connection conn = DriverManager.getConnection(url,user,password);
System.out.println(conn);
}
public static void main(String[] args)throws Exception {
new ExceuteDDL().test3();
}
}
连接方式四
连接方式四是在连接方式三之上的优化
如何优化?
首先三个连接基本信息是固定的
关于注册驱动是有优化的空间的
这里将先前的注册代码全部注释掉
只保留
Class.forName("com.mysql.cj.jdbc.Driver");
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.util.Properties;
public class ExceuteDDL{
public void test4()throws Exception{
//获取Driver实现类的对象
//Class clazz = Class.forName("com.mysql.cj.jdbc.Driver");
//注册驱动
//DriverManager.registerDriver(driver);
//Driver driver = (Driver) clazz.newInstance();//记得强制转换
Class.forName("com.mysql.cj.jdbc.Driver");
//提供其他三个连接基本信息
String url = "jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC";
String password = "123456789";
String user = "root";
//获取连接
Connection conn = DriverManager.getConnection(url,user,password);
System.out.println(conn);
}
public static void main(String[] args)throws Exception {
new ExceuteDDL().test4();
}
}
这里有静态代码块,静态代码块的机制是加载类时自动运行,而非运行时实例执行。
在Mysql的Driver实现类中,声明了如下的静态注册 *** 作,所以可以省略手动显式注册驱动。
方法四可以只是加载驱动,不需要显式注册驱动。
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.util.Properties;
public class ExceuteDDL{
public void test4()throws Exception{
//获取Driver实现类的对象
//Class clazz = Class.forName("com.mysql.cj.jdbc.Driver");
//注册驱动
//DriverManager.registerDriver(driver);
//Driver driver = (Driver) clazz.newInstance();//记得强制转换
//Class.forName("com.mysql.cj.jdbc.Driver");
//提供其他三个连接基本信息
String url = "jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC";
String password = "123456789";
String user = "root";
//获取连接
Connection conn = DriverManager.getConnection(url,user,password);
System.out.println(conn);
}
public static void main(String[] args)throws Exception {
new ExceuteDDL().test4();
}
}
这里我们甚至连反射 Class.forName()都注释掉了,但是运行还是成功了。
我们再导入JAR包的时候就已经自动读取了这个驱动的路径,但是我们并不能省略刚刚的反射加载驱动。
只是MySQL可以注释掉,如果是Orcale就不好使了。
我们通常不要直接把连接信息放到源代码中,有点low和灵活性太差。
最终版连接如下:
(final版)将数据库需要的四个基本连接信息声明在配置文件中,通过读取配置文件的方式获取连接。
user=root
password=123456789
url=jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC
driverClass=com.mysql.cj.jdbc.Driver
改为 ini文件后缀名也行。
这种写法的好处为:
1.实现了数据与代码分离。实现了解耦
2.如果需要修改配置文件信息,就可以避免重新打包。
以上就是所有的数据库连接获取方式。
所以我们尽量使用第五种连接方式
由于时间紧迫,这个文章到止为止了,返回第十三章的学习吧。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)