一、JDBC标准

什么是JDBC?

JDBC(Java Database Connectivity),Java访问数据库的解决方案。

JDBC分为两部分:
A.接口(1) 由SUN公司统一提出
B.实现类(n) 也叫驱动,由数据库厂商实现
注意:

  • 只需要学习一套接口
  • 使用时要导入相应的驱动

JDBC工作过程:

  • 加载驱动

    1
    2
    //执行这个类的静态块,而该类的静态块中自行实现了注册的功能
    Class.forName("oracle.jdbc.OracleDriver");
  • 建立连接

    1
    Connection conn = DriverManager.getConnection("url","uesername","password");
  • 创建语句对象

    1
    Statement stmt = conn.createStatement();
  • 执行SQL语句

    1
    2
    3
    4
    String sql = "xxxxx";
    boolean flag = stmt.execute(sql); //能够执行所有SQL,通常发送DDL语句
    ResultSet rs = stmt.executeQuery(sql); //通常发送DQL语句
    int flag = stmt.executeUpdate(sql); //通常发送DML语句
  • 如果执行查询,处理结果集
    查询的结果放在ResultSet对象的一系列行中
    ResultSet对象的最初位置在行首

    1
    2
    ResultSet.next();	//用来在行间移动,返回true表示有记录,false表示无记录
    ResultSet.getXXX(); //方法用来取得字段的内容
  • 关闭连接

    1
    2
    stmt.close();
    conn.close();

二、数据库厂商实现

Oracle,MySQL等

三、连接管理

通过连接工具类获取连接:编写一个访问数据库的工具类,此后所以访问数据库的操作都从工具类中获取连接

数据配置有两种方式:

  • 直接把数据配置写在工具类中
  • 把数据库配置写在一个properties属性文件里,工具类读取属性文件,逐行获取数据库参数

建议采用第二种方式

db.properties 属性文件,将配置保存为db.properties

1
2
3
4
driverClass=com.oracle.driver.OracleDriver
url=xxxx
username=xxx
password=xxx

加载连接信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//静态块在加载类时执行一次
static {
//Properties是一个特殊的散列表(key和value都是String),读取速度快
Properties prop = new Properties();
//使用ClassLoader读取类路径(classpath/src)下的文件,得到一个输入流
InputStream inStream = DBUtil.class.getClassLoader().getResourceAsStream("db.properties");
try {
//从流中读取数据
prop.load(inStream);
driverClass = prop.getProperty("driverClass");
url = prop.getProperty("url");
username = prop.getProperty("username");
password = prop.getProperty("password");
//加载驱动
Class.forName(driverClass);
} catch(e) {
e.printException();
throw new RuntimeException();
}
}

设计方法的思路:
1.返回值类型
确定是否有运算结果,确定结果的类型
2.方法的参数列表
运算中是否有未知的数据参与

openConn() 方法

1
2
3
4
5
6
7
8
9
10
11
public static Connection openConn() {
Connection conn = null;
try {
conn = DriverManager.getConnection(url, username, password);
} catch(e) {
e.printException();
throw new RuntimeException();
}

return conn;
}

closeConn() 方法

1
public static void closeConn(Connection conn) {
     if(conn != null) {
          try {
              conn.close();
          } catch(e) {
               e.printException();
          }
     }
}

JUnit测试类,需要导入Unit.jar
JUnit测试方法有如下要求,才能直接执行:
1.public
2.无返回值
3.无参数
4.方法前加@Test

通过// TODO xxxx 记录待办事项,可以在Tasks中查看

四、连接池技术

使用DriverManager创建连接,适合在单线程场景下使用。多线程时,即多人访问数据库时,DriverManager并没有加以限制,一旦访问的人数超过上限,则数据库瘫痪,由此产生一个解决方案:数据库连接池。连接池可以帮助我们管理多线程下的连接,避免数据库瘫痪。

连接池中连接的释放与使用原则:

  • 应用启动时,创建初始化数目的连接
  • 当申请时无连接可用或者达到指定的最小连接数,按增量参数值创建新的连接
  • 动态检查:定时检查连接池,一旦发现数量小于最小连接数,则补充相应的新连接,保证连接池正常运转
  • 静态检查:空闲连接不足时,系统才检测是否达到最小连接数
  • 按需分配,用过归还,空闲超时释放,获取超时报错

连接池也只是接口,具体实现由厂商完成

常用的连接池:

  • Apache DBCP连接池,Tomcat使用的连接池组件
  • C3P0
    连接池都实现了DataSource接口,不同的连接池实现类不同,设置的参数名不同,但是不同连接池的方法是相同的。

通过DataSource获取连接

1
2
3
4
5
private BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName(driverClass);
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);

常用参数有

  • 初始连接数
  • 最大连接数
  • 最小连接数
  • 每次增加的连接数
  • 超时时间
  • 最大空闲连接
  • 最小空闲连接

若连接由连接池创建,则关闭连接就是将其归还给连接池,该连接的状态会变成空闲,可以继续复用。
连接池创建的连接不是原始的连接,而是它重新封装后的连接。典型的特征就是其执行关闭方法后是归还连接。

五、异常处理

异常的处理方式:
1.记录异常日志,便于分析解决问题

1
e.printStackTrace();

2.能处理则处理,如返回默认值等
3.解决不了时抛出给调用者处理

1
throw new RuntimeException("",  e);