JDBC

1.环境准备

MySQL数据库

数据库驱动:mysql-connector-java-5.1.27.jar,

      maven依赖

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>6.0.5</version>
</dependency>

2. 常用接口

2.1 Driver接口:注册JDBC驱动

 // MySQL 8.0 以下版本 - JDBC 驱动名及数据库 URL
    static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";  
    static final String DB_URL = "jdbc:mysql://localhost:3306/DBName";
 
// MySQL 8.0 以上版本 - JDBC 驱动名及数据库 URL
   //static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver";  
   //static final String DB_URL = "jdbc:mysql://localhost:3306/DBName?useSSL=false&serverTimezone=UTC";

2.2 Connection接口:和接数据库建立连接

Connection conn = DriverManager.getConnection(DB_URL, "user", "password")

常用方法如下:

  1. createStatement():创建向数据库发送sql的statement对象。

  2. prepareStatement(sql) :创建向数据库发送预编译sql的PrepareSatement对象。

(1) 与 Statement一样,PreparedStatement也是用来执行sql语句的与创建Statement不同的是,需要根据sql语句创建PreparedStatement。除此之外,还能够通过设置参数,指定相应的值,而不是Statement那样使用字符串拼接

(2) 使用PreparedStatement时,他的SQL语句不再采用字符串拼接的方式,而是采用占位符的方式。“?”在这里就起到占位符的作用。这种方式除了避免了statement拼接字符串的繁琐之外,还能够提高性能。每次SQL语句都是一样的,java类就不会再次编译,这样能够显著提高性能。注意一点,这里的参数索引是从1开始的

(3)PreparedStatement对象可以防止sql注入,而Statement不能防止sql注入

  3.prepareCall(sql):创建执行存储过程的callableStatement对象。

  4. setAutoCommit(boolean autoCommit):设置事务是否自动提交。

  5.commit() :在链接上提交事务。

  6. rollback() :在此链接上回滚事务。

2.3  Statement接口:执行静态SQL语句并返回它所生成结果的对象

三种Statement类:

  1. Statement:由createStatement创建,用于发送简单的SQL语句(不带参数)。

  2. PreparedStatement :继承自Statement接口,由preparedStatement创建,用于发送含有一个或多个参数的SQL语句。PreparedStatement对象比Statement对象的效率更高,并且可以防止SQL注入,所以我们一般都使用PreparedStatement。

  3. CallableStatement:继承自PreparedStatement接口,由方法prepareCall创建,用于调用存储过程

常用Statement方法:

  1. execute(String sql):运行语句,返回是否有结果集

  2. executeQuery(String sql):运行select语句,返回ResultSet结果集

  3. executeUpdate(String sql):运行insert/update/delete操作,返回更新的行数

  4. addBatch(String sql) :把多条sql语句放到一个批处理中

  5. executeBatch():向数据库发送一批sql语句执行

2.4 ResultSet接口: statement.executeQuery(String sql):运行select语句返回的对象

ResultSet提供检索不同类型字段的方法,常用的有:

  1. getString(int index)、getString(String columnName):获得在数据库里是varchar、char等类型的数据对象。

  2. getFloat(int index)、getFloat(String columnName):获得在数据库里是Float类型的数据对象。

  3. getDate(int index)、getDate(String columnName):获得在数据库里是Date类型的数据。

  4. getBoolean(int index)、getBoolean(String columnName):获得在数据库里是Boolean类型的数据。

  5. getObject(int index)、getObject(String columnName):获取在数据库里任意类型的数据

  6. ResultSet还提供了对结果集进行滚动的方法

  7. next():移动到下一行

  8. Previous():移动到前一行

  9. absolute(int row):移动到指定行

  10. beforeFirst():移动resultSet的最前面。

  11. afterLast() :移动到resultSet的最后面。

  12. getMetaData()

2.5 获取每一列的列名

        ResultSetMetaData metaData= resultSet.getMetaData();
        int count=metaData.getColumnCount();
        //index从1开始
        for(int i=1;i<=count;i++){
            //获取每一列的列名
            System.out.println(metaData.getColumnName(i));
        }

3(重要). 使用后依次关闭对象及连接:ResultSet → Statement → Connection

//数据库连接(Connection)非常耗资源,尽量晚创建,尽量早的释放
//都要加try catch 以防前面关闭出错,后面的就不执行了
        try {
            if (resultSet != null) {
                resultSet.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                if (statement != null) {
                    statement.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                try {
                    if (connection != null) {
                        connection.close();
                    }
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }

4. 使用代码

import java.sql.*;

public class JDBCTest {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //设置db_driver, db_url, username , password
        String JDBC_DRIVER="com.mysql.jdbc.Driver";
        String DB_URL="jdbc:mysql://localhost:3306/JDBCTestDB";
        String user="admin";
        String passwd="123456";
        //注册JDBC驱动
        Class.forName(JDBC_DRIVER);
        //建立连接
        Connection connection=DriverManager.getConnection(DB_URL,user,passwd);
        //创建执行SQL语句的 statement
        Statement statement=connection.createStatement();
        //使用statement执行update
        int resultInt= statement.executeUpdate("update student set name='tom' WHERE id ='111'");
        System.out.println(resultInt);
        //使用statement执行select
        ResultSet resultSet=statement.executeQuery("SELECT * from student WHERE id ='111'");
        while (resultSet.next()){
            System.out.println(resultSet.getString("name"));
        }

        //数据库连接(Connection)非常耗资源,尽量晚创建,尽量早的释放
        //都要加try catch 以防前面关闭出错,后面的就不执行了
        try {
            if (resultSet != null) {
                resultSet.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                if (statement != null) {
                    statement.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                try {
                    if (connection != null) {
                        connection.close();
                    }
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

 

posted @ 2019-09-20 15:22  huiyii  阅读(129)  评论(0编辑  收藏  举报