1.what 什么是JDBC
:JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。
2.how 怎么使用JDBC
导包 →加载JDBC驱动程序 → 建立数据库连接Connection → 创建执行SQL的语句Statement → 处理执行结果ResultSet → 释放资源
mysql导包:maven搜索mysql
oracle导包:maven搜索OJDBC
装载MySql驱动:Class.forName(“com.mysql.jdbc.Driver”);
装载Oracle驱动:Class.forName(“oracle.jdbc.driver.OracleDriver”);
获取MySQL数据库连接:
Connection conn = DriverManage`这里写代码片`r.getConnection("jdbc:mysql://host:port/database", "user", "password");
获取Oracle数据库连接
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@host:port:databaseName", "user", "password");
获取连接代码实例(Oracle):
try {
//1.注册驱动,加载oracle驱动的类对象(具体厂商实现)
Class.forName("oracle.jdbc.driver.OracleDriver");
//2.创建连接:通过sun提供的实现类DiverManager来获取连接
Connection conn=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:xe", "system", "123");
System.out.println(conn);
//尝试关闭连接
conn.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
使用properties作为配置文件,封装获取连接
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
public class DBTool {
private static String url;
private static String user;
private static String pwd;
static{
//使用静态块读取配置文件中的参数
Properties p=new Properties();
try {
p.load(DBTool.class.getClassLoader()
.getResourceAsStream("db.properties"));
String driver=p.getProperty("driver");
url=p.getProperty("url");
user=p.getProperty("user");
pwd=p.getProperty("pwd");
//注册驱动
Class.forName(driver);
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException("读取db.properties失败",e);
} catch (ClassNotFoundException e) {
e.printStackTrace();
throw new RuntimeException("找不到这个驱动类",e);
}
}
public static Connection getConnection() throws SQLException{
return DriverManager.getConnection(url, user,pwd);
}
public static void close(Connection conn){
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException("关闭异常",e);
}
}
}
}
同时贴上配置文件(db.properties)注:properties是格式,同.xml
#database connection parameters
driver=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@127.0.0.1:1521:xe
user=system
pwd=123
3.连接池(数据源)
(对比线程池:只要看见“池”就要想到1.管理数量 2.复用,提高效率)
why
3.1使用DriverManager的问题
1).它没有管理连接上限,并发量大时很容易导致数据库崩溃
2).每次调用它,它都创建新连接,而不是复用连接,效率低
连接池可以解决上述问题
1).它能管理连接上限,避免数据库崩溃
2).它可以让我们复用连接,提高效率
3.2连接池是怎么工作的
创建连接池对象时,它会自动连接数据库,并创建一批(配)连接(空闲)
当调用连接池方法时,它会返回一个连接,并将此连接标记为占用态
当使用完连接后,需将连接归还给连接池,它会将连接数据清空,标记为空闲态(不会像diverManager直接杀死)
当连接池发现空闲连接即将用尽(配)时,它会再次自动创建一批(配)新连接
当占用连接已达数据库上限(配)时,连接池会让调用者等待
当高峰期过后,连接池会自动关闭一批(配)连接
3.3要点
连接池由sun设计出接口DataSource
由厂商提供实现类(DBCP提供的实现类是BasicDataSource)
3.4常用的连接池
DBCP
C3P0
代码示例:使用连接池(DBCP)创建公共的数据库连接工具类
导包:maven搜索(commons-dbcp)与OJDBC
import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
import org.apache.commons.dbcp.BasicDataSource;
public class DBUtil {
private static BasicDataSource ds;
static{
//加载参数
Properties pro=new Properties();
try {
pro.load(DBUtil.class.getClassLoader()
.getResourceAsStream("db.properties"));
//获取这些参数
String driver =pro.getProperty("diver");
String url=pro.getProperty("url");
String user=pro.getProperty("user");
String pwd=pro.getProperty("pwd");
String initsize=pro.getProperty("init_size");
String maxsize=pro.getProperty("max_size");
//创建连接池
ds=new BasicDataSource();
//给它设置参数
ds.setDriverClassName(driver);
ds.setUrl(url);
ds.setUsername(user);
ds.setPassword(pwd);
ds.setInitialSize(Integer.parseInt(initsize));
ds.setMaxActive(Integer.parseInt(maxsize));
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException("加载配置文件失败",e);
}
}
/**
* 由连接池创建的连接,其实现类由连接池提供
* @return
* @throws SQLException
*/
public static Connection getConnection() throws SQLException{
return ds.getConnection();
}
/**
* 连接池提供的实现类,其close方法内部逻辑是,
* 将连接归还给连接池,即它会清空连接对象中的数据
* 并且将连接标记为空闲态
* @param conn
*/
public static void close(Connection conn){
if(conn!= null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException("归还连接失败",e);
}
}
}
public static void rollBack(Connection conn){
if(conn!=null){
try {
conn.rollback();
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException("回滚事物失败",e);
}
}
}
}
同时贴上配置文件
#database connection parameters
driver=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@127.0.0.1:1521:xe
user=system
pwd=123
#datasource parameters
init_size=1
max_size=3
注:一个连接就是一个线程