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和连接池的更多相关文章

  1. c3p0、dbcp、tomcat jdbc pool 连接池配置简介及常用数据库的driverClass和驱动包

    [-] DBCP连接池配置 dbcp jar包 c3p0连接池配置 c3p0 jar包 jdbc-pool连接池配置 jdbc-pool jar包 常用数据库的driverClass和jdbcUrl ...

  2. jdbc数据连接池dbcp要导入的jar包

    jdbc数据连接池dbcp要导入的jar包 只用导入commons-dbcp-x.y.z.jarcommons-pool-a.b.jar

  3. 关于JDBC和连接池我学到的(转载保存)

    1.JDBC数据库连接池的必要性 在使用开发基于数据库的web程序时,传统的模式基本是按以下步骤: 在主程序(如servlet.beans)中建立数据库连接. 进行sql操作 断开数据库连接. 这种模 ...

  4. JDBC之 连接池

    JDBC之 连接池 有这样的一种现象: 用java代码操作数据库,需要数据库连接对象,一个用户至少要用到一个连接.现在假设有成千上百万个用户,就要创建十分巨大数量的连接对象,这会使数据库承受极大的压力 ...

  5. JDBC数据源连接池(4)---自定义数据源连接池

    [续上文<JDBC数据源连接池(3)---Tomcat集成DBCP>] 我们已经 了解了DBCP,C3P0,以及Tomcat内置的数据源连接池,那么,这些数据源连接池是如何实现的呢?为了究 ...

  6. JDBC数据源连接池(3)---Tomcat集成DBCP

    此文续<JDBC数据源连接池(2)---C3P0>. Apache Tomcat作为一款JavaWeb服务器,内置了DBCP数据源连接池.在使用中,只要进行相应配置即可. 首先,确保Web ...

  7. JDBC数据源连接池(2)---C3P0

    我们接着<JDBC数据源连接池(1)---DBCP>继续介绍数据源连接池. 首先,在Web项目的WebContent--->WEB-INF--->lib文件夹中添加C3P0的j ...

  8. DBCP,C3P0与Tomcat jdbc pool 连接池的比较

    hibernate开发组推荐使用c3p0; spring开发组推荐使用dbcp(dbcp连接池有weblogic连接池同样的问题,就是强行关闭连接或数据库重启后,无法reconnect,告诉连接被重置 ...

  9. JDBC数据源连接池的配置和使用实例

    个人学习参考所用,勿喷! 使用JDBC建立数据库连接的两种方式: 1.在代码中使用DriverManager获得数据库连接.这种方式效率低,并且其性能.可靠性和稳定性随着用户访问量得增加逐渐下降. 2 ...

  10. mysql,jdbc、连接池

    show processlist; select * from information_schema.processlist; Command: The type of command the thr ...

随机推荐

  1. C:gcc的基本使用

    分布编译 预处理:gcc -E hello.c -o hello.i 编 译:gcc -S hello.i -o hello.s 汇 编:gcc -c hello.s -o hello.o 链 接:g ...

  2. Web Storage API:localStorage 和 SessionStorage

    Web Storage API 提供了存储机制,通过该机制,浏览器可以安全地存储键值对,比使用 cookie 更加直观. 参考:https://developer.mozilla.org/zh-CN/ ...

  3. map或者对象转换

    map或者对象转换为具有相同字段的对象 List<Example> errorCodeExcelBeanList = JSONObject.parseArray(((JSONObject) ...

  4. 重新梳理IT知识之java-02语法(二)

    1.如何获取一个随机数 比如:10-99 调用方法:Math.random //Math.random方法得到的是double类型的值范围在[0.0,1.0),一般需要加工后才可满足开发要求. 代码: ...

  5. pytoch 安装

    注意替换清华源,否则直接安装速度会很慢. conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud ...

  6. mysql事务隔离分析

    首先说明下,这里主要内容为整理总结网络搜索的零散信息. 写在最前面,mysql事务是在Innodb引擎中得以实现的,如果这点不了解的话,请自行了解. 事务直接数据的可见性通过MVCC(多版本并发控制) ...

  7. 项目中常用的全局宏定义#define

    一 关于屏幕大小 #pragma mark - 屏幕宽高 #define SCREEN_BOUNDS ([UIScreen mainScreen].bounds) #define SCREEN_WID ...

  8. [Misc] ZSH 常用快捷键

    安装 zsh 终端执行 brew install zsh 终端执行 vim ~/.bash_profile 命令,打开 .bash_profile 文件 如果没有 vim,请自行安装 在打开的文件中, ...

  9. .net core 2.1控制台使用Quartz.net实现定时任务执行

    权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/qq_33435149/article/de ...

  10. C# Lambda排序

    1.按照多个字段进行排序:xxxList.OrderBy(c => c.RoadCode).ThenBy(c => c.Qdzh),表示先按照RoadCode字段进行排序再按照Qdzh字段 ...