目录
一、导入连接MySQL的包
首先我们需要下载对应的用于MySQL连接的jar包,从官网选择自己安装的对应的MySQL版本。
然后打开idea,选择文件->项目结构
在库中选择Java,然后将我们刚刚下载的包导入。
右下角点击应用。就可以愉快地使用了。
二、如何连接MySQL
要素一:Driver实现接口类
Driver接口介绍
java.sql.Driver 接口是所有 JDBC 驱动程序需要实现的接口。这个接口是提供给数据库厂商使用的,不同数据库厂商提供不同的实现。
在程序中不需要直接去访问实现了 Driver 接口的类,而是由驱动程序管理器类(java.sql.DriverManager)去调用这些Driver实现。
Oracle的驱动:oracle.jdbc.driver.OracleDriver
mySql的驱动: com.mysql.jdbc.Driver
加载与注册JDBC驱动
加载驱动:加载 JDBC 驱动需调用 Class 类的静态方法 forName(),向其传递要加载的 JDBC 驱动的类名
Class.forName(“com.mysql.jdbc.Driver”);
注册驱动:DriverManager 类是驱动程序管理器类,负责管理驱动程序
使用DriverManager.registerDriver(com.mysql.jdbc.Driver)来注册驱动
通常不用显式调用 DriverManager 类的 registerDriver() 方法来注册驱动程序类的实例,因为 Driver 接口的驱动程序类都包含了静态代码块,在这个静态代码块中,会调用 DriverManager.registerDriver() 方法来注册自身的一个实例。
要素二:URL
JDBC URL 用于标识一个被注册的驱动程序,驱动程序管理器通过这个 URL 选择正确的驱动程序,从而建立到数据库的连接。
JDBC URL的标准由三部分组成,各部分间用冒号分隔。
jdbc:子协议:子名称
协议:JDBC URL中的协议总是jdbc
子协议:子协议用于标识一个数据库驱动程序
子名称:一种标识数据库的方法。子名称可以依不同的子协议而变化,用子名称的目的是为了定位数据库提供足够的信息。包含主机名(对应服务端的ip地址),端口号,数据库名
jdbc:mysql://localhost:3306/test
其中jdbc是协议,mysql是子协议,localhost:3306/test是子名称
几种常用数据库的 JDBC URL
MySQL的连接URL编写方式:
jdbc:mysql://主机名称:mysql服务端口号/数据库名称?参数=值&参数=值
jdbc:mysql://localhost:3306/test
jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8(如果JDBC程序与服务器端的字符集不一致,会导致乱码,那么可以通过参数指定服务器端的字符集)
jdbc:mysql://localhost:3306/test?user=root&password=123456
Oracle 9i的连接URL编写方式:
jdbc:oracle:thin:@主机名称:oracle服务端口号:数据库名称
jdbc:oracle:thin:@localhost:1521:test
SQLServer的连接URL编写方式:
jdbc:sqlserver://主机名称:sqlserver服务端口号:DatabaseName=数据库名称
jdbc:sqlserver://localhost:1433:DatabaseName=test
要素三:用户名和密码
user,password可以用“属性名=属性值”方式告诉数据库
可以调用 DriverManager 类的 getConnection() 方法建立到数据库的连接
三、方法实现
方式一
// 方式一:
@Test
public void testConnection1() throws SQLException {
// 获取Driver实现类对象
// driver是驱动的意思。
Driver driver = new com.mysql.cj.jdbc.Driver();
// url:http://localhost:8080/gmall/keyboard.jpg
// jdbc:mysql:协议
// localhost:ip地址
// 3306:默认mysql的端口号
// test:test数据库
String url = "jdbc:mysql://localhost:3306/test";
// 将用户名和密码封装在Properties中
Properties info = new Properties();
info.setProperty("user", "root");
info.setProperty("password", "abc123");
Connection conn = driver.connect(url, info);
System.out.println(conn);
}
方式二
方式二是对方式一的优化,为了让程序具有更好的可移植性,尽量不要再程序中出现第三方的API。比方说我们这时不想使用MySQL了,想使用oracle了,怎么才能更好地实现代码的可移植性呢?
我们可以使用反射的机制来知道我们当前想要创建的数据库链接的对象是谁。
// 方式二:对方式一的迭代:在如下的程序中不出现第三方的api,使得程序具有更好的可移植性
@Test
public void testConnection2() throws Exception {
// 1.获取Driver实现类对象:使用反射
Class clazz = Class.forName("com.mysql.cj.jdbc.Driver");
Driver driver = (Driver) clazz.newInstance();
// 2.提供要连接的数据库
String url = "jdbc:mysql://localhost:3306/test";
// 3.提供连接需要的用户名和密码
Properties info = new Properties();
info.setProperty("user", "root");
info.setProperty("password", "abc123");
// 4.获取连接
Connection conn = driver.connect(url, info);
System.out.println(conn);
}
方式三
使用drivermanager替换driver,因为drivermanager是一个基础的为了管理jdbc的驱动的服务
// 方式三:使用DriverManager替换Driver
@Test
public void testConnection3() throws Exception {
// 1.获取Driver实现类的对象
Class clazz = Class.forName("com.mysql.cj.jdbc.Driver");
Driver driver = (Driver) clazz.newInstance();
// 2.提供另外三个连接的基本信息:
String url = "jdbc:mysql://localhost:3306/test";
String user = "root";
String password = "abc123";
// 注册驱动
DriverManager.registerDriver(driver);
// 获取连接
Connection conn = DriverManager.getConnection(url, user, password);
System.out.println(conn);
}
方法四
// 方式四:可以只是加载驱动,不用显示的注册驱动过了。
@Test
public void testConnection4() throws Exception {
// 1.提供三个连接的基本信息:
String url = "jdbc:mysql://localhost:3306/test";
String user = "root";
String password = "abc123";
// 2.加载Driver
Class.forName("com.mysql.cj.jdbc.Driver");
//相较于方式三,可以省略如下的操作:
// Driver driver = (Driver) clazz.newInstance();
// // 注册驱动
// DriverManager.registerDriver(driver);
//为什么可以省略上述操作呢?
/*
* 在mysql的Driver实现类中,声明了如下的操作:
* static {
try {
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
*/
// 3.获取连接
Connection conn = DriverManager.getConnection(url, user, password);
System.out.println(conn);
}
为什么可以省略注册驱动的步骤呢?从下面的原码中看出,其中的driver内置已经实现了注册的功能。
当然我们也可以更加激进一点,将加载驱动类的代码都给省掉,我们发现我们的代码依旧能够连接到MySQL
@Test
public void testConnection4() throws Exception {
// 1.提供三个连接的基本信息:
String url = "jdbc:mysql://localhost:3306/test";
String user = "root";
String password = "abc123";
// 3.获取连接
Connection conn = DriverManager.getConnection(url, user, password);
System.out.println(conn);
}
这是因为我们在如下的目录中查找之后,发现编译器在对应的包下的文件中保存了我们driver的路径。 但是最好不要省略掉,因为MySQL可以省略,但是并不代表着其它的数据库可以省略,可移植性较差。
方法五
我们上面的方法中的url,user,driver和密码的话,我们最好使用读取配置文件的形式将其读取到我们的程序中,这样在切换成其它配置的时候具有更好的可移植性。
在我们当前项目的src文件下创建一个
在这个文件中我们去填写我们上述的四个配置信息
注意这里的等号左右两边最好不要有空格,否则可能会被识别为空格再加上我们其它的配置文件。
user=root
password=abc123
url=jdbc:mysql://localhost:3306/test?rewriteBatchedStatements=true
driverClass=com.mysql.cj.jdbc.Driver
@Test
public void getConnection5() throws Exception{
//1.读取配置文件中的4个基本信息
//我们自定义的类需要系统加载去加载
//在我们getResourceAsStream中指明我们的文件名,就是我们刚刚的配置文件
//默认的识别路径就是在src下的,所以直接写刚刚的文件名就行
//然后通过这行代码生成对应的流,inputstream
InputStream is = ConnectionTest.class.getClassLoader().getResourceAsStream("jdbc.properties");
Properties pros = new Properties();
//加载我们刚刚生成的is流
pros.load(is);
//分别通过pros.getProperty的形式来获取我们刚刚的key所对应的值
String user = pros.getProperty("user");
String password = pros.getProperty("password");
String url = pros.getProperty("url");
String driverClass = pros.getProperty("driverClass");
//2.加载驱动
Class.forName(driverClass);
//3.获取连接
Connection conn = DriverManager.getConnection(url, user, password);
System.out.println(conn);
}
方式五(final版):将数据库连接需要的4个基本信息声明在配置文件中,通过读取配置文件的方式,获取连接
此种方式的好处?
1.实现了数据与代码的分离。实现了解耦
2.如果需要修改配置文件信息,可以避免程序重新打包。