JDBC(一)
一、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
4String sql = "xxxxx";
boolean flag = stmt.execute(sql); //能够执行所有SQL,通常发送DDL语句
ResultSet rs = stmt.executeQuery(sql); //通常发送DQL语句
int flag = stmt.executeUpdate(sql); //通常发送DML语句如果执行查询,处理结果集
查询的结果放在ResultSet对象的一系列行中
ResultSet对象的最初位置在行首1
2ResultSet.next(); //用来在行间移动,返回true表示有记录,false表示无记录
ResultSet.getXXX(); //方法用来取得字段的内容关闭连接
1
2stmt.close();
conn.close();
二、数据库厂商实现
Oracle,MySQL等
三、连接管理
通过连接工具类获取连接:编写一个访问数据库的工具类,此后所以访问数据库的操作都从工具类中获取连接
数据配置有两种方式:
- 直接把数据配置写在工具类中
- 把数据库配置写在一个properties属性文件里,工具类读取属性文件,逐行获取数据库参数
建议采用第二种方式
db.properties 属性文件,将配置保存为db.properties1
2
3
4driverClass=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
11public 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
5private 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);