一 JDBC简介

Java DataBase Connectivity Java语言连贯数据库

官网(Sun公司)定义的一套操作所有关系型数据库的规定(接口) 各个数据库厂商去实现这套接口 提供数据库驱动JAR包 能够应用这套接口(JDBC)编程 真正执行的代码是驱动JAR包中的实现类

二 JDBC初体验

1. 新建一个Maven我的项目

pom.xml<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0"         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">    <modelVersion>4.0.0</modelVersion>    <groupId>com.hy.jdbc</groupId>    <artifactId>jdbc-demo</artifactId>    <version>1.0-SNAPSHOT</version>    <!-- 定义依赖版本号 -->    <properties>        <junit.version>4.12</junit.version>        <mysql-connector-java.version>8.0.11</mysql-connector-java.version>        <druid.version>1.1.10</druid.version>    </properties>    <!-- 治理jar版本号 -->    <dependencyManagement>        <dependencies>            <!-- junit -->            <dependency>                <groupId>junit</groupId>                <artifactId>junit</artifactId>                <version>${junit.version}</version>            </dependency>            <!-- mysql -->            <dependency>                <groupId>mysql</groupId>                <artifactId>mysql-connector-java</artifactId>                <version>${mysql-connector-java.version}</version>            </dependency>            <dependency>                <groupId>com.alibaba</groupId>                <artifactId>druid</artifactId>                <version>${druid.version}</version>            </dependency>        </dependencies>    </dependencyManagement>    <dependencies>        <!-- junit -->        <dependency>            <groupId>junit</groupId>            <artifactId>junit</artifactId>        </dependency>        <!-- mysql -->        <dependency>            <groupId>mysql</groupId>            <artifactId>mysql-connector-java</artifactId>        </dependency>        <dependency>            <groupId>com.alibaba</groupId>            <artifactId>druid</artifactId>        </dependency>    </dependencies></project>

sql

CREATE TABLE account (    aid INT PRIMARY KEY,    aname VARCHAR(100),    amoney DOUBLE);

2. 插入

@Testpublic void test01() {    Connection connection = null;    PreparedStatement statement = null;    try {        // 注册驱动 MySQL5之后的驱动JAR包能够省略该步骤        Class.forName("com.mysql.cj.jdbc.Driver");        // 获取数据库连贯对象 Connection        connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/demo_hy", "root", "root");        // 开启事务        connection.setAutoCommit(false);        // 定义SQL        String sql = "insert into account values(?, ?, ?)";        // 获取执行SQL的对象 PreparedStatement        statement = connection.prepareStatement(sql);        // 设置参数        statement.setInt(1, 1); //'?' 地位的编号 从1开始        statement.setString(2, "No1"); //'?' 地位的编号 从1开始        statement.setDouble(3, 2000); //'?' 地位的编号 从1开始        // 执行SQL 返回受影响的行数        int count = statement.executeUpdate();        // 提交事务        connection.commit();        // 处理结果        System.out.println("count = " + count);    } catch (Exception e) {        e.printStackTrace();        // 回滚事务        if (null != connection) {            try {                connection.rollback();            } catch (SQLException exception) {                exception.printStackTrace();            }        }    } finally {        // 开释资源        if (null != statement) {            try {                statement.close();            } catch (SQLException e) {                e.printStackTrace();            }        }        if (null != connection) {            try {                connection.close();            } catch (SQLException e) {                e.printStackTrace();            }        }    }}

3. 删除

@Testpublic void test02() {    Connection connection = null;    PreparedStatement statement = null;    try {        // 注册驱动 MySQL5之后的驱动JAR包能够省略该步骤        //Class.forName("com.mysql.cj.jdbc.Driver");        // 获取数据库连贯对象 Connection        connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/demo_hy", "root", "root");        // 开启事务        connection.setAutoCommit(false);        // 定义SQL        String sql = "delete from account where aid = ?";        // 获取执行SQL的对象 PreparedStatement        statement = connection.prepareStatement(sql);        // 设置参数        statement.setInt(1, 1); //'?' 地位的编号 从1开始        // 执行SQL 返回受影响的行数        int count = statement.executeUpdate();        // 提交事务        connection.commit();        // 处理结果        System.out.println("count = " + count);    } catch (Exception e) {        e.printStackTrace();        // 回滚事务        if (null != connection) {            try {                connection.rollback();            } catch (SQLException exception) {                exception.printStackTrace();            }        }    } finally {        // 开释资源        if (null != statement) {            try {                statement.close();            } catch (SQLException e) {                e.printStackTrace();            }        }        if (null != connection) {            try {                connection.close();            } catch (SQLException e) {                e.printStackTrace();            }        }    }}

4. 批改

@Testpublic void test03() {    Connection connection = null;    PreparedStatement statement1 = null;    PreparedStatement statement2 = null;    try {        // 注册驱动 MySQL5之后的驱动JAR包能够省略该步骤        Class.forName("com.mysql.cj.jdbc.Driver");        // 获取数据库连贯对象 Connection        connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/demo_hy", "root", "root");        // 开启事务        connection.setAutoCommit(false);        // 定义SQL        String sql1 = "update account set amoney = amoney + ? where aid = ?";        String sql2 = "update account set amoney = amoney - ? where aid = ?";        // 获取执行SQL的对象 PreparedStatement        statement1 = connection.prepareStatement(sql1);        statement2 = connection.prepareStatement(sql2);        // 设置参数        statement1.setDouble(1, 500); //'?' 地位的编号 从1开始        statement1.setInt(2, 1); //'?' 地位的编号 从1开始        statement2.setDouble(1, 500); //'?' 地位的编号 从1开始        statement2.setInt(2, 2); //'?' 地位的编号 从1开始        // 执行SQL 返回受影响的行数        statement1.executeUpdate();        int i = 3 / 0; //模仿异样        statement2.executeUpdate();        // 提交事务        connection.commit();    } catch (Exception e) {        e.printStackTrace();        // 回滚事务        if (null != connection) {            try {                connection.rollback();            } catch (SQLException exception) {                exception.printStackTrace();            }        }    } finally {        // 开释资源        if (null != statement2) {            try {                statement2.close();            } catch (SQLException e) {                e.printStackTrace();            }        }        if (null != statement1) {            try {                statement1.close();            } catch (SQLException e) {                e.printStackTrace();            }        }        if (null != connection) {            try {                connection.close();            } catch (SQLException e) {                e.printStackTrace();            }        }    }}

5. 查问

@Testpublic void test04() {    Connection connection = null;    PreparedStatement statement = null;    ResultSet resultSet = null;    try {        // 注册驱动 MySQL5之后的驱动JAR包能够省略该步骤        Class.forName("com.mysql.cj.jdbc.Driver");        // 获取数据库连贯对象 Connection        connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/demo_hy", "root", "root");        // 开启事务        connection.setAutoCommit(false);        // 定义SQL        String sql = "select * from account";        // 获取执行SQL的对象 PreparedStatement        statement = connection.prepareStatement(sql);        // 执行SQL 返回后果集        resultSet = statement.executeQuery();        // 提交事务        connection.commit();        // 处理结果        while (resultSet.next()) {            int id = resultSet.getInt(1); //代表列的编号 从1开始            String name = resultSet.getString("aname"); //代表列的名称            double money = resultSet.getDouble(3); //代表列的编号 从1开始            System.out.println(id + "---" + name + "---" + money);        }    } catch (Exception e) {        e.printStackTrace();        // 回滚事务        if (null != connection) {            try {                connection.rollback();            } catch (SQLException exception) {                exception.printStackTrace();            }        }    } finally {        // 开释资源        if (null != resultSet) {            try {                resultSet.close();            } catch (SQLException e) {                e.printStackTrace();            }        }        if (null != statement) {            try {                statement.close();            } catch (SQLException e) {                e.printStackTrace();            }        }        if (null != connection) {            try {                connection.close();            } catch (SQLException e) {                e.printStackTrace();            }        }    }}

三 数据库连接池

一个寄存数据库连贯的容器

当零碎初始化后 容器被创立 容器中会申请一些连贯对象 当用户拜访数据库时 从容器中获取连贯对象 用户拜访完之后 会将连贯对象归还给容器 这样能够节约资源 进步拜访效率

常见的数据库连接池有 Druid C3P0...

Druid初体验

druid.properties

url=jdbc:mysql://localhost:3306/demo_hydriverClassName=com.mysql.cj.jdbc.Driverusername=rootpassword=rootmaxActive=10minIdle=5

XTest.java

@Testpublic void test05() {    InputStream stream = null;    Connection connection = null;    PreparedStatement statement = null;    ResultSet resultSet = null;    try {        // 加载配置文件        Properties properties = new Properties();        stream = XTest.class.getClassLoader().getResourceAsStream("druid.properties");        properties.load(stream);        // 获取连接池对象        DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);        // 获取数据库连贯对象 Connection        connection = dataSource.getConnection();        // 开启事务        connection.setAutoCommit(false);        // 定义SQL        String sql = "select * from account";        // 获取执行SQL的对象 PreparedStatement        statement = connection.prepareStatement(sql);        // 执行SQL 返回后果集        resultSet = statement.executeQuery();        // 提交事务        connection.commit();        // 处理结果        while (resultSet.next()) {            int id = resultSet.getInt(1); //代表列的编号 从1开始            String name = resultSet.getString("aname"); //代表列的名称            double money = resultSet.getDouble(3); //代表列的编号 从1开始            System.out.println(id + "---" + name + "---" + money);        }    } catch (Exception e) {        e.printStackTrace();        // 回滚事务        if (null != connection) {            try {                connection.rollback();            } catch (SQLException exception) {                exception.printStackTrace();            }        }    } finally {        // 开释资源        if (null != resultSet) {            try {                resultSet.close();            } catch (SQLException e) {                e.printStackTrace();            }        }        if (null != statement) {            try {                statement.close();            } catch (SQLException e) {                e.printStackTrace();            }        }        if (null != connection) {            try {                connection.close(); //偿还连贯            } catch (SQLException e) {                e.printStackTrace();            }        }        if (null != stream) {            try {                stream.close();            } catch (IOException e) {                e.printStackTrace();            }        }    }}

最初

学习java不易,须要继续的保持,如果有想学习java的基础知识或者进阶java的能够私信“学习”获取学习联系方式