- 为什么要有JDBC连接池呢?
- JDBC连接池是什么?
1.说在前面
JDCB众所周知:就是java老大用来操作各种数据库(比如:Mysql,orale)小弟的一个规范。但是我每次要操作一下数据库就去创建一个数据库连接然后又将其close。我是不是疯了。
所以就有了JDBC连接池的概念:数据库连接池就是一个容器,里边放了多个数据库连接对象
2.这里介绍下我们国的龙头老大 阿里巴巴的数据库连接池Druid
第一步:还是我们熟悉的导入jar包
第二步:写配置文件:druid.properties
//驱动
driverClassName=com.mysql.jdbc.Driver
//操作哪个数据库固定写法:jdbc:数据库名://IP地址:端口号/数据库名
url=jdbc:mysql://127.0.0.1:3306/students(数据库名)
//用户账号
username=root
//用户密码
password=1234
//初始化的连接数量
initialSize=5
//最大的连接数量
maxActive=10
//最大超时时间
maxWait=3000
第三步:加载配置文件进内存
//1.使用Properties集合中的load()方法,将配置文件加载进进内存*
Properties pps=new Properties();
//2.使用类加载器获取配置文件的绝对路径并装入字节入流中(硬盘==》内存)
ClassLoader classLoader = druidDemo1(类对象).class.getClassLoader();
InputStream is = classLoader.getResourceAsStream("druid.properties");
//3.使用load()方法
load(is);
第四步:通过DruidDataSourceFactory 工厂类的createDataSource()方法获取数据库连接池对象啦~
//Data是是数据的意思。Source是 来源[池子] 的意思。Factory是工厂的意思。
//DruidDataSourceFactory 一起就是:Druid数据池的工厂
DataSource ds = DruidDataSourceFactory.createDataSource();
第五步:通过DataSource数据库连接池对象 的 getConnection()方法获取数据库连接对象啦~
Conndection conn = ds.getConnection();
- ps:注意:这里的数据库连接对象 和 前面的用DriverManager驱动管理类获取的数据库连接对象是不一样的。
- 至少这里数据库连接对象调用close()方法不是将数据库连接对象关闭,而是将 数据库连接对象 归还给:数据库连接池。(有点绕口)
第六步:写sql
String sql = "insert into 表名 (字段名) values(?,?,?)"
第七步:获取PerpareStatement对象,并给 ? 赋值 (防止sql注入).
PerpareStatement pstate = conn.perpareStatement(sql);
pstate.setXxx("int类型,写给第几个问号赋值","赋Xxx类型的值")
第八步:执行sql
pastate.executeUpdate();//execute是 执行 的意思。
第九步:归还数据库连接对象
调用close()方法
下边来个整个过程的详细代码+分析
案例:给db3的employee表添加一条记录*/
public class druidCase {
public static void main(String[] args) {
//为了防止下边对象创建时抛出异常所以这里要赋值为 null
Connection conn = null;
PreparedStatement pstmt = null;
try {
//1.获取数据库连接对象
conn = JDBCUtils.getConnection();
//开启事务
conn.setAutoCommit(false);
//2.写sql
String sql = "insert into employee values(?,?)";
//3.获取执行sql的对象[PreparedStatement对象在执行sql时 是不传参的。传参在获取对象时传!]
pstmt = conn.prepareStatement(sql);
//4.1 给 ? 赋值
pstmt.setString(1, "zero");
pstmt.setInt(2, 2000);
//4.2 执行sql
pstmt.executeUpdate();
//提交
conn.commit();
} catch (Exception e) {
//有异常回滚
try {
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
} finally {
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}