JDBC 和数据库连接池

JDBC 和数据库连接池

1. JDBC 概述

1.1 基本介绍

  1. JDBC为访问不同的数据库提供了统一的接口,为使用者屏蔽了细节问题
  2. Java程序员使用JDBC,可以连接任何提供了JDBC驱动程序的数据库系统,从而完成对数据库的各种操作。
  3. JDBC的基本原理图[重要!]

1.2 模拟JDBC

  • 先创建一个我们规定的 jdbc 接口(方法)
package com.song.jdbc.myjdbc;

/**
 * 我们规定的 jdbc 接口(方法)
 */
public interface JdbcInterface {
   
    //连接
    public Object getConnection();

    //crud
    public void crud();

    //关闭连接
    public void close();

}
  • 然后mysql数据库实现jdbc接口(这里我们简单的模拟一下)
package com.song.jdbc.myjdbc;
/**
 * mysql数据库实现了jdbc接口
 * 仅仅是模拟,实际的没那么简单
 * 实际是mysql厂商开发
 */
public class MysqlJdbcImpl implements JdbcInterface{
   
    @Override
    public Object getConnection() {
   
        System.out.println("得到 mysql 的连接");
        return null;
    }

    @Override
    public void crud() {
   
        System.out.println("完成 mysql 的增删改查");
    }

    @Override
    public void close() {
   
        System.out.println("关闭 mysql 的连接");
    }
}
  • 完成对mysql的操作
package com.song.jdbc.myjdbc;

public class TestJDBC {
   
    public static void main(String[] args) {
   
        //完成对mysql的操作
        JdbcInterface jdbcInterface = new MysqlJdbcImpl();
        //通过接口来调用实现类[动态绑定]
        jdbcInterface.getConnection();
        jdbcInterface.crud();
        jdbcInterface.close();

    }
}
  • 同样换成Oracle实现jdbc接口(这里我们简单的模拟一下)
package com.song.jdbc.myjdbc;

/**
 * 模拟 oracle 数据库实现 jdbc
 */
public class OracleJdbcImpl implements JdbcInterface{
   
    @Override
    public Object getConnection() {
   
        System.out.println("得到对 Oracle 的连接");
        return null;
    }

    @Override
    public void crud() {
   
        System.out.println("完成 Oracle 的增删改查");
    }

    @Override
    public void close() {
   
        System.out.println("关闭 Oracle 的连接");
    }
}
  • 这里完成对Oracle的操作跟mysql的一样,只是修改了一下对象
package com.song.jdbc.myjdbc;

public class TestJDBC {
   
    public static void main(String[] args) {
   
        //完成对mysql的操作
        JdbcInterface jdbcInterface = new MysqlJdbcImpl();
        //通过接口来调用实现类[动态绑定]
        jdbcInterface.getConnection();
        jdbcInterface.crud();
        jdbcInterface.close();

        System.out.println("=====================");
        //完成对Oracle的操作
        //只需要改一下 对象即可,比较方便
        jdbcInterface = new OracleJdbcImpl();
        //通过接口来调用实现类[动态绑定]
        jdbcInterface.getConnection();
        jdbcInterface.crud();
        jdbcInterface.close();
    }
}

1.3 JDBC 带来的好处

  1. 如果Java直接访问数据库(示意图)

  1. JDBC带来的好处(示意图)

  1. 说明:JDBC是Java提供一套用于数据库操作的接口API,Java程序员只需要面向这套接口编程即可。不同的数据库厂商,需要针对这套接口,提供不同实现。

1.4 JDBC API

JDBC API是一系列的接口,它统一和规范了应用程序与数据库的连接、执行SQI语句,并到得到返回结果等各类操作, 相关类和接口在 java.sql与javax.sql包中

2.JDBC 快速入门

2.1 JDBC 程序编写步骤

  1. 注册驱动 - 加载Driver 类
  2. 获取连接 - 得到Connection
  3. 执行增删改查 - 发送SQL 给mysql执行
  4. 释放资源 - 关闭相关连接

2.2 JDBC 第一个程序

通过jidbc 对 表 actor 进行 添加,删除和修改操作

先在SQLyog中创建一个演员表

use sys_db02;
create table actor( -- 演员表
               id int primary key auto_increment,-- 主键自增长
               name varchar(32) not null default'',
               sex char(1) not null default '女',
               borndate datetime,-- 生日
               phone varchar(12));

2.3 JDBC 第一个程序代码演示

  1. 打开idea,先进行前置工作
//前置工作: 1.在项目下创建一个文件夹(Directory)比如 libs
// 2.将 mysql.jar 拷贝到该目录下,
// 3.右击mysql.jar文件,点击 add to project ..加入到项目中

  1. 注册驱动,创建一个driver对象
//1.注册驱动
Driver driver = new Driver();//创建一个Driver对象
  1. 连接mysql
//2.得到连接
//解读
//1.jdbc:mysql:// 这段是规定好的,通过jdbc的连接方式是mysql
//2.localhost的位置可以是ip地址,我这边正好在主机上操作
//3.3306表示我们mysql监听的端口
//4.sys_db02 表示连接到mysql的哪个数据库
//mysql的连接本质就是前面学过的socket连接
String url = "jdbc:mysql://localhost:3306/sys_db02";

//将用户名和密码放入到 Properties 对象
Properties properties = new Properties();
//说明
//这里的 user 和 password 是规定好的,
//后面的值根据实际情况填写,比如 root 和 sys
properties.setProperty("user","root");//用户
properties.setProperty("password","sys");//密码
//尝试给数据库连接到指定的 url
Connection connect = driver.connect(url, properties);
  1. 执行sql
//3.执行 sql
//String sql = "insert into actor values(null,'周杰伦','男','1979-01-18','110')";
//String sql = "insert into actor values(null,'林俊杰','男','1981-03-27','120')";
String sql = "update actor set phone = '119' where name = '林俊杰'";
//statement 用于执行静态SQL语句并返回其生成的结果的对象
Statement statement = connect.createStatement();
int rows = statement.executeUpdate(sql);//如果是 dml语句,返回的就是影响行数
//提示
System.out.println(rows>0?"成功":"失败");
  1. 关闭连接
//4.关闭连接
statement.close();
connect.close();
  1. 运行idea,然后打开SQLyog,发现数据已经插入表格中

3. 获取数据库连接 5 种方式

3.1 方式一

  1. 基本语法
// 获取Driver实现类对象
Driver driver = new com.mysql.jdbc.Driver();

String url = "jdbc:mysql://localhost:3306/jdbc_db";

Properties info = new Properties();
info.setProperty("user","root");
info.setProperty("password","sys");
Connection conn = driver.connect(url, info);
System.out.println(conn);
  1. 案例演示:
package com.song.jdbc;

import com.mysql.jdbc.Driver;
import org.junit.jupiter.api.Test;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

/**
 * 分析java连接mysql的5种方式
 */
public class JdbcConn {
   
    //方式一
    @Test
    public void connect01() throws SQLException {
   
        Driver driver = new Driver();
        String url = "jdbc:mysql://localhost:3306/sys_db02";

        Properties properties = new Properties();
        properties.setProperty("user", "root");
        properties.setProperty("password", "sys");

        Connection connect = driver.connect(url, properties);
        System.out.println(connect);
    }
}

3.2 方式二

  1. 基本语法
//方式1 会直接使用 com.mysql.jdbc.Driver(),属于静态加载,灵活性差,依赖强
//---于是我们推出---> 方式2
Class clazz = Class.forName("com.mysql.jdbc.Driver");
Driver driver = (Driver) clazz.newInstance();

String url = "jdbc:mysql://localhost:3306/jdbc_db";

Properties info = new Properties();
info.setProperty("user","root");
info.setProperty("password", "abc123");

Connection conn = driver.connect(url, info);
System.out.println(conn);
  1. 案例演示:
package com.song.jdbc;

import com.mysql.jdbc.Driver;
import org.junit.jupiter.api.Test;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

/**
 * 分析java连接mysql的5种方式
 */
public class JdbcConn {
   
    //方式二
    @Test
    public void connect02() throws ClassNotFoundException, InstantiationException, IllegalAccessException, SQLException {
   
        //使用反射加载类
        Class<?> aClass = Class.forName("com.mysql.jdbc.Driver");
        Driver driver = (Driver) aClass.newInstance();

        String url = "jdbc:mysql://localhost:3306/sys_db02";

        Properties properties = new Properties();
        properties.setProperty("user", "root");
        properties.setProperty("password", "sys");

        Connection connect = driver.connect(url, properties);
        System.out.println(connect);
    }
}

3.3 方式三

  1. 基本语法
// 使用DriverManager替换Driver
Class clazz = Class.forName("com.mysqljdbc.Driver")
Driver driver = (Driver) clazz.newlnstance();

String url = "jdbc:mysql://localhost:3306/jdbc_db";
String user = "root";
String password = "sys";

DriverManager.registerDriver(driver);

Connection conn = DriverManager.getConnection(url, user, password);
System.out.println(conn);
  1. 案例演示:
package com.song.jdbc;

import com.mysql.jdbc.Driver;
import org.junit.jupiter.api.Test;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

/**
 * 分析java连接mysql的5种方式
 */
public class JdbcConn {
   
    //方式三
    @Test
    public void connect03() throws ClassNotFoundException, InstantiationException, IllegalAccessException, SQLException {
   
        Class<?> aClass = Class.forName("com.mysql.jdbc.Driver");
        Driver driver = (Driver) aClass.newInstance();

        String url = "jdbc:mysql://localhost:3306/sys_db02";
        String user = "root";
        String password = "sys";

        DriverManager.registerDriver(driver);//注册驱动

        Connection connection = DriverManager.getConnection(url, user, password);
        System.out.println("第三种方式:" + connection);
    }
}

3.4 方式四

  1. 基本语法
// 使用 Class.forName 自动完成注册驱动,简化代码 => 分析源码
Class.forName("com.mysal.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/jdbc_db";
String user = "root";
String password = "hsp"
Connection conn = DriverManager.getConnection(url, user, password);.
System.out.println(conn);
  1. 案例演示:
package com.song.jdbc;

import com.mysql.jdbc.Driver;
import org.junit.jupiter.api.Test;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

/**
 * 分析java连接mysql的5种方式
 */
public class JdbcConn {
   
    //方式四:使用Class.forName自动完成注册驱动,简化代码
    @Test
    public void connect04() throws ClassNotFoundException, SQLException {
   
        //使用反射加载Driver类
        //在加载Driver类时,完成注册
        /*
        源码:com.mysql.jdbc.Driver
        1.静态代码块,在类加载时,会执行一次
        2.DriverManager.registerDriver(new Driver());
        3.因此注册driver的工作已经完成
        static {
            try {
                DriverManager.registerDriver(new Driver());
            } catch (SQLException var1) {
                throw new RuntimeException("Can't register driver!");
            }
        }
         */
        //代码Class<?> aClass = Class.forName("com.mysql.jdbc.Driver");不写也可以
        //原因:
        // 1.mysqL驱动5.1.6可以无需CLass,forName(“com.mysql.jdbc.Driver”);
        // 2.从idk1.5以后使用了jdbc4,不再需要显示调用class.forName()注册驱动而是
        // 自动调用驱动jar包下META-INF\services\java.sql.Driver文本中的类名称去注册
        // 3.不过建议还是写上 CLassforName(“com.mysql.jdbc.Driver”),更加明确
        Class<?> aClass = Class.forName("com.mysql.jdbc.Driver");

        String url = "jdbc:mysql://localhost:3306/sys_db02";
        String user = "root";
        String password = "sys";

        Connection connection = DriverManager.getConnection(url, user, password);
        System.out.println("第四种方式:" + connection);
    }
}

3.5 方式五

//使用配置文件,连接数据库更灵活
1.Connection connection =
    DriverManager.getConnection("jdbc:mysql://localhost:3306/testdb","root""root”);
//中的字符串 各个值,比如端口,数据库,用户名,密码为了方便,我们可以将信息写入到.properties 文件中,方便操作
2.jdbc.properties                      
user=root
password=sys
url=jdbc:mysql://localhost:3306/girls
driver=com.mysql.jdbc.Driver
  1. 案例演示:

    • 先创建一个properties文件,把相应的数据放入
    user=root
    password=sys
    url=jdbc:mysql://localhost:3306/sys_db02
    driver=com.mysql.jdbc.Driver
    
    • 然后进行操作:
    package com.song.jdbc;
    
    import com.mysql.jdbc.Driver;
    import org.junit.jupiter.api.Test;
    
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.Properties;
    
    /**
     * 分析java连接mysql的5种方式
     */
    public class JdbcConn {
         
        //第五种方式
        @Test
        public void connect05() throws IOException, ClassNotFoundException, SQLException {
         
            //通过properties对象获取配置文件的信息
            Properties properties = new Properties();
            properties.load(new FileInputStream("src\\mysql.properties"));
            //获取相关的值
            String user = properties.getProperty("user");
            String password = properties.getProperty("password");
            String url = properties.getProperty("url");
            String driver = properties.getProperty("driver");
    
            Class<?> aClass = Class.forName("com.mysql.jdbc.Driver");
    
            Connection connection = DriverManager.getConnection(url, user, password);
            System.out.println("第五种方式:"+connection);
        }
    }
    

3.6 数据库连接小练习

使用方式5完成下面数据库的连接

  1. 创建 news 表
  2. 使用 jdbc 添加 5条数据
  3. 修改 id = 1的记录,将content 改成 一个新的消息
  4. 删除id = 3 的记录

思路分析:

  • 先在MySQL中创建一个news表
-- 1. 创建 news 表
CREATE TABLE news(
	id INT PRIMARY KEY AUTO_INCREMENT,-- 主键自增长
	content VARCHAR(64)NOT NULL DEFAULT'')

-- 查询
SELECT * FROM news;
  • 然后在src下创建一个mysql.properties 存入mysql的相关信息
user=root
password=sys
url=jdbc:mysql://localhost:3306/sys_db02
driver=com.mysql.jdbc.Driver
  • 接下来idea连接mysql并对news表格进行相应的操作
package com.song.jdbc;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

public class JdbcExercise {
   
    public static void main(String[] args) throws IOException, SQLException, ClassNotFoundException {
   
        //使用方式5完成下面数据库的连接
        //1. 创建 news 表
        //在MySQL中创建一张news表
        /**
         * CREATE TABLE news(
         * 	id INT,
         * 	content VARCHAR(64)NOT NULL DEFAULT'')
         */
        //通过properties对象获取配置文件的信息
        Properties properties = new Properties();
        properties.load(new FileInputStream("src\\mysql.properties"));
        //获取相关的值
        String user = properties.getProperty("user");
        String password = properties.getProperty("password");
        String url = properties.getProperty("url");
        String driver = properties.getProperty("driver");

        //注册驱动,建立一个网络连接,建议写上
        Class.forName(driver);

        //尝试给数据库连接到指定的 url
        Connection connection = DriverManager.getConnection(url, user, password);

        //2. 使用 jdbc 添加 5条数据
        //添加 sql 数据
        String sql1 = "insert into news values(null,'上海新闻')";
        String sql2 = "insert into news values(null,'北京新闻')";
        String sql3 = "insert into news values(null,'深圳新闻')";
        String sql4 = "insert into news values(null,'广州新闻')";
        String sql5 = "insert into news values(null,'江苏新闻')";
        //statement 用于执行静态SQL语句并返回其生成的结果的对象
        Statement statement = connection.createStatement();
        int i1 = statement.executeUpdate(sql1);
        int i2 = statement.executeUpdate(sql2);
        int i3 = statement.executeUpdate
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dominator945

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值