JDBC和连接池
JDBC
所有的数据库操作框架都是用在JDBC的基础上做多次封装的,因为JDBC的操作很复杂
- 引入Jar包
- 连接数据库操作
- 书写sql语句,传参
- 查询,取值
- 关闭连接
//1.注册驱动(静态方法)(包名+类名)
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接对象(导包都导sql里面的,不导jdbc里的;多态!报异常是因为用户输入的串可能写错)后面设置下数据格式
String url="jdbc:mysql://localhost:3306/java0603?useUnicode=true&characterEncoding=UTF-8";
String user="root";
String password="123456";
// 3.连接数据库
Connection conn=DriverManager.getConnection(url,user,password);
// 写sql语句
String sql="select count(*) from user where uname=? and pwd=?";
PreparedStatement pst=conn.prepareStatement(sql);
//给sql语句的?赋值
pst.setString(1,"pdt1997");
pst.setString(2, "xxxx");
ResultSet rs= pst.executeQuery();
//5.处理结果集
int count=0;
while(rs.next()){
count=rs.getInt(1);//因为就一列
System.out.println(count);
}
//6.释放资源
rs.close();
pst.close();
conn.close();
因为每次操作都需要连接一次,结束需要断开一次,所有就需要封装一个永远在连接状态的单例模式工具库
public class JDBCUtils {
//获取连接对象的方法(静态的)
public static Connection getConn(){
Connection conn=null;
try {
//1.注册驱动(静态方法)(包名+类名)
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接对象(导包都导sql里面的,不导jdbc里的;多态!报异常是因为用户输入的串可能写错)后面设置下数据格式
String url="jdbc:mysql://localhost:3306/java0603?useUnicode=true&characterEncoding=UTF-8";
String user="root";
String password="123456";
conn=DriverManager.getConnection(url,user,password);
} catch (ClassNotFoundException | SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn;
}
//释放资源
public static void close(Connection conn,Statement sta){
if(sta!=null){
try {
sta.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//释放资源2
public static void close(Connection conn,Statement sta,ResultSet rs){
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(sta!=null){
try {
sta.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
//1.获得连接对象
Connection conn=JDBCUtils.getConn();
//测试下是地址不System.out.println(conn);
//2.获取语句执行平台
String sql="insert into test (name) values(?)";
PreparedStatement pst=conn.prepareStatement(sql);
//3.执行sql
pst.setString(1, "xxx");
int row=pst.executeUpdate();
System.out.println(row);
//4.释放资源
JDBCUtils.close(conn, pst);
}
连接池
现在常用的开源数据连接池主要有c3p0
、dbcp
两种
- dbcp没有自动的去回收空闲连接的功能,c3p0有自动回收空闲连接功能
- 两者主要是对数据连接的处理方式不同!C3P0提供最大空闲时间,DBCP提供最大连接数,C3P0当连接超过最大空闲连接时间时,当前连接就会被断掉;DBCP当连接数超过最大连接数时,所有连接都会被断开
public class DBCPUtil {
private static DataSource dataSource;
static{
try{
//1、将properties文件夹在到输入流中
InputStream is = DBCPUtil.class.getClassLoader().getResourceAsStream("dbcp.properties");
//2、创建properties对象,用于读取第一步得到的输入流
Properties ps = new Properties();
//3、使用上述的properties对象,加载本地的properties文件
ps.load(is);
//4、使用连接池工厂类,创建连接池对象
DataSource dataSource = BasicDataSourceFactory.createDataSource(ps);
}catch (Exception e){
e.printStackTrace();
}
}
//用于从连接池中,获取一个连接对象的操作方法
public static Connection getConnection(){
try{
return dataSource.getConnection();
}catch (Exception e){
e.printStackTrace();
return null;
}
}
//用于释放数据库的连接资源
public static void close(Connection conn, Statement state,ResultSet resultSet){
try{
if(conn!=null){
conn.close();
conn = null;
}
if(state!=null){
state.close();
state = null;
}
if (resultSet!=null){
resultSet.close();
resultSet = null;
}
}catch (Exception e){
e.printStackTrace();
}
}
}
public static void main(String[] args) {
Connection connection = null;
PreparedStatement ps = null;
try {
connection = DBCPUtil.getConnection();
String sql = "insert into users(username,password) values(?,?)";
ps = connection.prepareStatement(sql);
ps.setString(1, "张三");
ps.setString(2, "123456");
ps.execute();
} catch (Exception e) {
e.printStackTrace();
} finally {
DBCPUtils.close(connection, ps);
}
}
配置文件
# 连接设置
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/jdbc
username=root
password=
# 初始化连接
initialSize=10
# 最大连接数量
maxActive=200
# 最大空闲连接
maxIdle=20
# 最小空闲连接
minIdle=5
# 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒
maxWait=60000
# JDBC驱动建立连接时附带的连接属性属性的格式必须为这样:[属性名=property;]
# 注意:"user" 与 "password" 两个属性会被明确地传递,因此这里不需要包含他们
connectionProperties=useUnicode=true;characterEncoding=UTF8
# 指定由连接池所创建的连接的自动提交(auto-commit)状态。
defaultAutoCommit=true
了解一下就好,这个不是开发用的,开发现在还是用mybatis
JDBC和连接池的更多相关文章
- c3p0、dbcp、tomcat jdbc pool 连接池配置简介及常用数据库的driverClass和驱动包
[-] DBCP连接池配置 dbcp jar包 c3p0连接池配置 c3p0 jar包 jdbc-pool连接池配置 jdbc-pool jar包 常用数据库的driverClass和jdbcUrl ...
- jdbc数据连接池dbcp要导入的jar包
jdbc数据连接池dbcp要导入的jar包 只用导入commons-dbcp-x.y.z.jarcommons-pool-a.b.jar
- 关于JDBC和连接池我学到的(转载保存)
1.JDBC数据库连接池的必要性 在使用开发基于数据库的web程序时,传统的模式基本是按以下步骤: 在主程序(如servlet.beans)中建立数据库连接. 进行sql操作 断开数据库连接. 这种模 ...
- JDBC之 连接池
JDBC之 连接池 有这样的一种现象: 用java代码操作数据库,需要数据库连接对象,一个用户至少要用到一个连接.现在假设有成千上百万个用户,就要创建十分巨大数量的连接对象,这会使数据库承受极大的压力 ...
- JDBC数据源连接池(4)---自定义数据源连接池
[续上文<JDBC数据源连接池(3)---Tomcat集成DBCP>] 我们已经 了解了DBCP,C3P0,以及Tomcat内置的数据源连接池,那么,这些数据源连接池是如何实现的呢?为了究 ...
- JDBC数据源连接池(3)---Tomcat集成DBCP
此文续<JDBC数据源连接池(2)---C3P0>. Apache Tomcat作为一款JavaWeb服务器,内置了DBCP数据源连接池.在使用中,只要进行相应配置即可. 首先,确保Web ...
- JDBC数据源连接池(2)---C3P0
我们接着<JDBC数据源连接池(1)---DBCP>继续介绍数据源连接池. 首先,在Web项目的WebContent--->WEB-INF--->lib文件夹中添加C3P0的j ...
- DBCP,C3P0与Tomcat jdbc pool 连接池的比较
hibernate开发组推荐使用c3p0; spring开发组推荐使用dbcp(dbcp连接池有weblogic连接池同样的问题,就是强行关闭连接或数据库重启后,无法reconnect,告诉连接被重置 ...
- JDBC数据源连接池的配置和使用实例
个人学习参考所用,勿喷! 使用JDBC建立数据库连接的两种方式: 1.在代码中使用DriverManager获得数据库连接.这种方式效率低,并且其性能.可靠性和稳定性随着用户访问量得增加逐渐下降. 2 ...
- mysql,jdbc、连接池
show processlist; select * from information_schema.processlist; Command: The type of command the thr ...
随机推荐
- Spring Boot 缓存应用 Memcached 入门教程
本章学习 Mmecached 在 Spring Boot 中的使用教程.Memcached 与 Redis 各有好处.本文主要学习 Spring Boot 中如何应用集成 Mmecached spri ...
- django之路由分组,路由分发,FBV,CBV,ORM框架
今日的内容: a. 路由系统 1. 创建app 2. 路由的分组 3. 路由的分发 - 正则表达式匹配 b. django的orm(模型model) 1. 创建模型的步骤 2. orm基本的增删改查 ...
- C#多个泛型约束问题
多个约束之间使用逗号隔开,但不重复T约束. 1. private void AddControl<T>(TabPage tabPage, T userControl) where T: U ...
- maven项目pom继承关系
<dependency>部分下添加<exclusions>标记 Dependencies:是可选依赖(Optional Dependencies) Exclusions:是依赖 ...
- Educational Codeforces Round 81 (Rated for Div. 2)
A 0~9需要多少笔画,自取7和1,判奇偶 #include<bits/stdc++.h> using namespace std; #define ll long long #defin ...
- 树莓派4B踩坑指南 - (12)谷歌浏览器书签同步
书签和插件不能同步真的是不方便..使用时删掉※符号 过程比较复杂,坑很多,但确认有效 免费访问说明: https://github.com/max2max/fre※es※s 软件安装 https:// ...
- SVN 锁定无法提交命令执行失败
有个项目使用svn 高版本客户端作业,转换到低版本的环境下,出现锁定,命令执行失败. 使用cleanup 没有效果, 网上建议的svn无法Cleanup解决方法: Step1:到 sqlite官网 ( ...
- MRCP接口MRCPRecog 简介
功能:开始一个语音识别,一边讲话,一边识别,需要ASR服务器. 原型:MRCPRecog (grammar, options) grammar ---- 语法文件,可以是一个xml文件 options ...
- sqlmap命令手册
http://127.0.0.1/sqli-labs-master/Less-1/?id=1 当给sqlmap上面这么一个url的时候,它会自动: 1.判断可注入的参数 2.判断可以用那种SQL注入技 ...
- DVWA靶机的命令执行漏洞
之前在打攻防世界的时候出现过类似的题目,这里再重温一下 (靶机一共低中高三个安全等级,这里只演示低中等级) (1)Security:low 根据提示让我们输入地址ping一下,之后返回以下内容,可以判 ...