JDBC------通过DriverManger获取数据库连接
一.驱动管理类
之前使用的是原始的方法即 Driver 接口获取数据库连接, 但是我们在开发中一般都用 DriverManger即驱动管理类来实现不同数据库的连接.
1.建立连接
-
可以调用 DriverManager 类的 getConnection() 方法建立到数据库的连接
-
JDBC URL 用于标识一个被注册的驱动程序, 驱动程序管理器通过这个 URL 选择正确的驱动程序, 从而建立到数据库的连接.
-
JDBC URL的标准由三部分组成, 各部分间用冒号分隔.
------jdbc: <子协议>:<子名称>
------协议: JDBC URL中的协议总是jdbc
------子协议: 子协议用于标识一个数据库驱动程序
------子名称: 一种标识数据库的方法. 子名称可以依不同的子协议而变化, 用子名称的目的是为了定位数据库提供足够的信息
2.加载与注册JDBC驱动
-
加载 JDBC 驱动需调用 Class 类的静态方法 forName(), 向其传递要加载的 JDBC 驱动的类名.
-
DriverManager 类是驱动程序管理器类, 负责管理驱动程序.
-
通常不用显式调用 DriverManager 类的 registerDriver() 方法来注册驱动程序类的实例, 因为 Driver 接口的驱动程序类都包含了静态代码块, 在这个静态代码块中, 会调用DriverManager.registerDriver() 方法来注册自身的一个实例.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| import java.io.InputStream; import java.sql.Connection; import java.sql.DriverManager; import java.util.Properties;
import org.junit.Test;
public class Test { @Test public void TestDriverManger() throws Exception { String driverClass = null; String url = null; String user = null; String password = null; InputStream in = getClass().getClassLoader().getResourceAsStream("jdbc.properties"); Properties properties = new Properties(); properties.load(in); driverClass = properties.getProperty("driver"); url = properties.getProperty("jdbc"); user = properties.getProperty("user"); password = properties.getProperty("password"); Class.forName(driverClass); Connection connection = DriverManager.getConnection(url, user, password); System.out.println(connection); connection.close(); } }
|
使用DriverManger的好处:
- 可以通过重载的 getConnection() 方法获取数据库连接, 较为方便
- 可以同时管理多个驱动程序: 若注册了多个数据库连接, 根据调用 getConnection() 方法时传入的参数来连接不同的数据库, 并返回不同的数据库连接.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| import java.sql.Connection; import java.sql.DriverManager; import org.junit.Test;
public class Test { @Test public void TestDriverManger() throws Exception { String driver1 = "com.microsoft.sqlserver.jdbc.SQLServerDriver"; String driver2 = "com.mysql.cj.jdbc.Driver"; String url1 = "jdbc:sqlserver://127.0.0.1:1433;DatabaseName=SPJDB"; String url2 = "jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=false"; String user1 = "root"; String user2 = "root"; String password1 = "root"; String password2 = "root"; Class.forName(driver1); Connection conn1 = DriverManager.getConnection(url1, user1, password1); System.out.println(conn1); Class.forName(driver2); Connection conn2 = DriverManager.getConnection(url2, user2, password2); System.out.println(conn2); conn1.close(); conn2.close(); } }
|
二.访问数据库
–Statement
–PrepatedStatement
–CallableStatement
1.Statement
-
通过调用 Connection 对象的 createStatement() 方法获取该对象
-
该对象用于执行静态的 SQL 语句, 并且返回执行结果
-
Statement 接口中定义了下列方法用于执行 SQL 语句:
–ResultSet excuteQuery(String sql): 传入的sql可以是 select
–int excuteUpdate(String sql): 传入的sql可以是 insert update delete, 不能是 select
更新数据库
数据库的更新操作一般指: Insert Delete Update SQL操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| import java.sql.Connection; import java.sql.DriverManager; import java.sql.Statement; import org.junit.Test; public class Test { @Test public void TestDriverManger() throws Exception { String driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver"; String url = "jdbc:sqlserver://localhost:1433;DatabaseName=SPJDB"; String user = "root"; String password = "root"; String sql = "Insert into SPJ values(1,1,2,1000);"; Class.forName(driver); Connection conn = DriverManager.getConnection(url, user, password); Statement statement = conn.createStatement(); statement.executeUpdate(sql); statement.close(); conn.close(); } }
|
在这里, 我们想写一个通用的方法, 该方法可以执行 INSERT UPDATE DELETE 语句. 同时, 我们还想将一些常用的 JDBC 操作封装在一起, 方便管理与使用.
JDBCTools类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
| import java.io.InputStream; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; import java.util.Properties;
public class JDBCTools {
public static Connection getConnection() throws Exception { InputStream is = JDBCTools.class.getClassLoader().getResourceAsStream("jdbc.properties"); Properties pro = new Properties(); pro.load(is); String url = pro.getProperty("jdbc"); String user = pro.getProperty("user"); String password = pro.getProperty("password"); Class.forName(pro.getProperty("driver")); Connection conn = DriverManager.getConnection(url, user, password); return conn; }
public static void release(Statement state,Connection conn) { if(state != null) { try { state.close(); } catch (SQLException e) { e.printStackTrace(); } } if(conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } }
|
TestJDBCTools类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| import java.sql.Connection; import java.sql.DriverManager; import java.sql.Statement; import org.junit.Test;
public class TestJDBCTools { @Test public void test01() { String sql = "DELETE from SPJ where S_num=1 and P_num=1 and J_num=2;"; update(sql); }
public void update(String sql) { Connection conn = null; Statement state = null; try { conn = JDBCTools.getConnection(); state = conn.createStatement(); state.executeUpdate(sql); } catch (Exception e) { e.printStackTrace(); }finally { JDBCTools.release(state, conn); } } }
|
查询数据库
我在这里说的查询数据库, 指的是 Select SQL操作
通过 ResultSet 对象来操作查询的结果集
-
通过调用 Statement 对象的 excuteQuery() 方法创建该对象
-
ResultSet 对象以逻辑表格的形式封装了执行数据库操作的结果集, ResultSet 接口由数据库厂商实现
-
ResultSet 对象维护了一个指向当前数据行的游标, 初始的时候, 游标在第一行之前, 可以通过 ResultSet 对象的 next() 方法移动到下一行
-
ResultSet 接口的常用方法:
–boolean next()
–getXxx() , Xxx 可以是: String Int Time Date …
……
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| import java.sql.Connection; import java.sql.Date; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import org.junit.Test;
public class TestJDBCTools { @Test public void test02() { Connection conn = null; Statement state = null; ResultSet rs = null; String sql = "select * from Student"; try { conn = JDBCTools.getConnection(); state = conn.createStatement(); rs = state.executeQuery(sql); while(rs.next()) { int id = rs.getInt(1); String name = rs.getString("name"); String eamil = rs.getString(3); Date date = rs.getDate(4); System.out.print(id+";"); System.out.print(name+";"); System.out.print(eamil+";"); System.out.println(date); } } catch (Exception e) { e.printStackTrace(); }finally { JDBCTools.release(rs, state, conn); } } }
|