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 ...
随机推荐
- 【代码总结】SQL语句设计
1.根据空值(NULL)检索条件 select * from user where age is not null; //查询年龄为null的所有用户 2.使用IN进行范围对比查询 ,5的所有用户 , ...
- jquery发送请求的各种方法
地址链接:https://www.cnblogs.com/java-dyb/p/10910566.html 关于向服务器传递数据的一些补充: json字符串与json对象之间的转换: JSON.par ...
- gitlab回退到某次commit——本地+远程
## 查看所有commits记录$ git log ## gitlab回退到某次commit$ git reset --hard 3018a546427e1f865524b82b488d6a2721d ...
- 静态成员、final成员、面向对象接口
静态成员 静态属性定义时在访问控制关键字后面加static 在类定义中使用静态成员的时候,用self关键字后面跟着::操作符,在访问静态成员的时候::后面需要跟$符号 在类定义外部访问静态属性,用类名 ...
- php封装的mysqli类完整实例
本文实例讲述了php封装的mysqli类.分享给大家供大家参考,具体如下:类: <?php header('content-type:text/html;charset=utf-8'); /* ...
- 解决PLSQL 查询后显示中文为问号(???)问题
我的问题已解决,在装oracle的服务器上配置了下面的两个环境变量后,重启服务器,重新录入中文,在查询即可正确显示中文. 原因: 本机(装oracle的服务器)没有配置数据库字符集环境变量,或是与数据 ...
- slice 、 substr 、replace
slice( 参数1 [,参数2] ) (注意不要让[参数1]下标越过[参数2]下标,否则会得到空字符串,且[参数2]是不包含在截取范围内的) 参数1:截取字符的[起始下标]. 值为正 ...
- UDP通讯代码
UDP客户端代码: import socket # 创建套接字 socket.AF_INET:IPV4 socket.SOCK_DGRAM:UDP协议 udp_client=socket.socket ...
- Spring注解@Qualifier、@Autowired、@Primary
@Qualifier 1.当一个接口有多个实现类,且均已注入到Spring容器中了,使用@AutoWired是byType的,而这些实现类类型都相同,此时就需要使用@Qualifier明确指定使用那个 ...
- Python学习第十五课——类的基本思想(实例化对象,类对象)
类的基本思想 类:把一类事物的相同的特征和动作整合到一起就是类类是一个抽象的概念 对象:就是基于类而创建的一个具体的事物(具体存在的)也是特征和动作整合到一块 对象写法 # 对象写法 def scho ...