数据库,数据源,连接池,jdbc等

java应用程序→JDBC驱动程序→数据库

这些概念很容易区分不开,这些就是java代码访问数据库的一些概念。首先,数据库相当于一个工厂,生产东西,是实体,而数据源相当于代理仓库,是一个变量,我们定义的一个数据源,可以随时修改指向不同的数据库。java应用程序就相当于消费者,通过jdbc来访问数据库。我们一般说的数据源指的就是数据库~
java应用程序访问数据库上述的概念都不用也是可以访问的,分别使用不同的数据库厂商各自的驱动就可以访问数据库,但这样就不能体现Java的可移植性了,而JDBC其实就是数据库连接。把java应用程序访问数据库的一系列过程定义出来一套统一的API,为多种关系数据库提供统一访问,不用为了因为java程序访问数据库不同而专门写不同的程序,它由一组用Java语言编写的类和接口组成。但是jdbc虽然统一了java应用程序访问数据库的统一方式,但是普通的JDBC数据库连接使用 DriverManager 来获取,每次向数据库建立连接的时候都要将 Connection加载到内存中,再验证用户名和密码(得花费0.05s~1s的时间)。需要数据库连接的时候,就向数据库要求一个,执行完成后再断开连接。这样的方式将会消耗大量的资源和时间。数据库的连接资源并没有得到很好的重复利用.若同时有几百人甚至几千人在线,频繁的进行数据库连接操作将占用很多的系统资源,严重的甚至会造成服务器的崩溃。对于每一次数据库连接,使用完后都得断开。否则,如果程序出现异常而未能关闭,将会导致数据库系统中的内存泄漏,最终将导致重启数据库。这种开发不能控制被创建的连接对象数,系统资源会被毫无顾及的分配出去,如连接过多,也可能导致内存泄漏,服务器崩溃。总的来说就是直接用通过jdbc访问数据库太low了,连接池就是来优化这一过程的,连接池是指这样一个“池子”,池子中的每个东西都是连接数据源的一个“连接”,这样别人想连接数据源的时候可以从这个“池子”里取,用完以后再放回来供以后其他想使用的人使用。

JDBC:

JDBC(Java Database Connectivity)是java访问数据库的基石,是一个独立于特定数据库管理系统、通用的SQL数据库存取和操作的公共接口(一组API),定义了用来访问数据库的标准Java类库,(java.sql,javax.sql)使用这个类库可以以一种标准的方法、方便地访问数据库资源。JDO, Hibernate等只是更好的封装了JDBC。

DataSource :

通常被称为数据源,数据源并不等于连接池,它包含连接池和连接池管理两个部分,习惯上也经常把 DataSource 称为连接池,它是SUN制定的用于获取数据库连接的规范接口。它存在于 javax.sql包中,用来代替 DriverManager 的方式,来获取连接。它不是必须要求实现连接池的,即连接池是数据源的一种。

DataSource用来取代DriverManager来获取Connection,获取速度快,同时可以大幅度提高数据库访问速度。

DataSource 与 DriverManager 获取连接的不同:
a).DriverManager是由SUN实现的,它只供了最基本的获取连接的方式。而DataSource是一个接口,不光SUN可以实现,很多第三方的中间件也可以实现,而且实现得很好。
   
DataSource一般有如下三种实现方式:
  标准实现 -- 提供最基本的连接,也就是DriverManager的方式
  连接池的实现 -- 提供了连接池,是一种可以缓存及管理多个数据库连接的“容器”。
  分布事务的实现 -- 提供了连接池,而且这个池中的连接是支持分布式事务的(Distribute Transaction)

Java中常用的数据库连接池有:DBCP 、C3P0、BoneCP、Proxool、DDConnectionBroker、DBPool、XAPool、Primrose、SmartPool、MiniConnectionPoolManager及Druid等。
JDBC连接数据库7个步骤:

package com.yangshengjie.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
 
public class JDBCTest {
    /**
     * 使用JDBC连接并操作mysql数据库
     * JDBC所需的四个参数(user,password,url,driverClass)
     */
    public static void main(String[] args) {
        // 数据库驱动类名的字符串,连接数据库所需的驱动
        String driverClass = "com.mysql.jdbc.Driver";
        // 数据库连接串
        String url = "jdbc:mysql://127.0.0.1:3306/jdbctest";
        // 用户名
        String user = "root";
        // 密码
        String password = "mysqladmin";
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;
        try {
            // 1、加载数据库驱动( 加载想要连接的数据库的驱动到JVM(Java虚拟机),成功加载后,会将Driver类的实例注册到DriverManager类中)
            Class.forName(driverClass );
            // 2、获取数据库连接对象Connection,该对象就代表一个数据库的连接。
            conn = DriverManager.getConnection(url, user, password);
            // 3、获取数据库操作对象
            stmt = conn.createStatement();
            // 4、定义操作的SQL语句
            String sql = "select * from user where id = 100";
            // 5、执行数据库操作
            rs = stmt.executeQuery(sql);
            // 6、获取并操作结果集
            while (rs.next()) {
                System.out.println(rs.getInt("id"));
                System.out.println(rs.getString("name"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 7、关闭对象,回收数据库资源(关闭结果集-->关闭数据库操作对象-->关闭连接)
            if (rs != null) { //关闭结果集对象
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (stmt != null) { // 关闭数据库操作对象
                try {
                    stmt.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (conn != null) { // 关闭数据库连接对象
                try {
                    if (!conn.isClosed()) {
                        conn.close();
                    }
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

JDBC参数URL:
URL定义了连接数据库时的协议、子协议、数据源标识,它们之间用冒号隔开。  书写形式:  协议:子协议:数据源标识    
协议:在JDBC中总是以jdbc开始    
子协议:是桥连接的驱动程序或是数据库管理系统名称。    
数据源标识:标记找到数据库来源的地址与连接端口。    
例如:(MySql的连接URL)    
jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=gbk ;    
useUnicode=true:表示使用Unicode字符集。如果characterEncoding设置为    
gb2312或GBK,本参数必须设置为true 。characterEncoding=gbk:字符编码方式。

JDBC获得java.sql.Statement实例,Statement实例分为以下3 种类型:
interface Statement
interface PreparedStatement extends Statement
interface CallableStatement extends PreparedStatement
1、执行静态SQL语句。通常通过Statement实例实现。    
2、执行动态SQL语句。通常通过PreparedStatement实例实现。    
3、执行数据库存储过程。通常通过CallableStatement实例实现。    
•具体的实现方式:    
Statement stmt = con.createStatement() ;    
PreparedStatement pstmt = con.prepareStatement(sql) ;    
CallableStatement cstmt = con.prepareCall("{CALL demoSp(? , ?)}") ;  

JDBC执行SQL语句
Statement接口提供了三种执行SQL语句的方法:executeQuery 、executeUpdate和execute    
1、ResultSet executeQuery(String sqlString):执行查询数据库的SQL语句,返回一个结果集(ResultSet)对象。    
2、int executeUpdate(String sqlString):用于执行INSERT、UPDATE或 DELETE语句以及SQL DDL语句,如:CREATE TABLE和DROP TABLE等    
3、execute(sqlString):用于执行返回多个结果集、多个更新计数或二者组合的语句。    
•具体实现的代码:    
  ResultSet rs = stmt.executeQuery("SELECT * FROM ...") ;    
  int rows = stmt.executeUpdate("INSERT INTO ...") ;    
  boolean flag = stmt.execute(String sql) ; 

  参考:https://blog.csdn.net/SecondDream_1017/article/details/81117176
  参考 https://blog.csdn.net/dragon901/article/details/79901595
  参考:https://blog.csdn.net/mxcsdn/article/details/80301936

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值