JDBC总结


JDBC快速入门 (JDBC.pdf)

1、编写代码步骤

1、创建工程,导入驱动jar包

jar包

2、注册驱动

Class.forName("com.mysql.jdbc.Driver");

3、获取连接

Connection conn = DriverMannager.getConnection(url,username,password);

4、定义SQL语句

String sql = "";

5、获取执行SQL的对象

Statement stmt = conn.createStatement();

6、执行SQL语句

stmt.executeUpdate(sql);  
//此方法会执行sql语句并返回受影响的行数。可以用
int count = stmt.executeUpdate(sql)接受返回值;

7、处理返回结果

8、释放资源

stmt.close();
conn.cloes();

API详解

1、DriverManager

1、注册驱动

*** MYSQL 5之后的驱动包,可以省略注册驱动的步骤***

这个方法可以完成驱动的注册,但是实际开发中一般不会使用这个方法完成驱动的注册

原因:

如果需要注册驱动,就会使用,DriverManager.registerDriver(new Driver()); ,但是查看源代码发现,在代码中一段静态代码块,静态代码块已经调用了注册驱动的方法。

如果再手动调用该方法注册驱动,就会导致驱动被注册两次。实际开发中一般户次爱用;

Class.forName("com.mysql.jdbc.Driver");

2、获得与数据库的连接

这个方法就是用来获得与数据库连接的方法,这个方法中的三个参数为 与数据库连接的路径(url),与数据库连接的用户名(user),与数据库连接的密码(password)。

主要是url的写法:

jdbc:mysql://127.0.0.1:3306/db1
jdbc:mysql://ip地址:端口号/数据库名称?参数键值对1&参数键值对2...

localhost :连接的MySQL数据库服务器的主机ip地址。(连接是本机就可以写成localhost),如果连接不是本机的,就需要写上连接主机的IP地址。

url如果连接的是本机的路径,可以简化为如下格式:

jdbc:mysql:///db1

配置useSSL = false 参数,禁用安全连接方式,解决警告提示

2、Connection

1、获取执行SQL对象

普通执行SQL对象

Statement createStatement();

预编译SQL的执行SQL对象;防止SQL注入

PreparedStatement prepareStatement(sql);

执行存储过程的对象

CallableStatement prepareCall(sql)

2、事务管理

MYSQL事务管理

开启事务:  begin;/start transaction;
提交事务:  commit;
回滚事务:  rollback;

MYSQL默认自动提交事务

JDBC事务管理

Connection接口中定义了3个对应的方法

开启事务:setAutoCommit(bollean autoCommit): true为自动提交事务;false为手动提交事务,即为开启事务
提交事务:commit()
回滚事务:rollback()

例:

package com.itheima.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * JDBC API 详解:Connection
 */
public class JDBCDemo3_Connection {

    public static void main(String[] args) throws Exception {
        //1. 注册驱动
        //Class.forName("com.mysql.jdbc.Driver");
        //2. 获取连接:如果连接的是本机mysql并且端口是默认的 3306 可以简化书写
        String url = "jdbc:mysql:///db1?useSSL=false";
        String username = "root";
        String password = "1234";
        Connection conn = DriverManager.getConnection(url, username, password);
        //3. 定义sql
        String sql1 = "update account set money = 3000 where id = 1";
        String sql2 = "update account set money = 3000 where id = 2";
        //4. 获取执行sql的对象 Statement
        Statement stmt = conn.createStatement();

        try {
            // 开启事务
            conn.setAutoCommit(false);
            //5. 执行sql
            int count1 = stmt.executeUpdate(sql1);//受影响的行数
            //6. 处理结果
            System.out.println(count1);
            int i = 3/0;
            //5. 执行sql
            int count2 = stmt.executeUpdate(sql2);//受影响的行数
            //6. 处理结果
            System.out.println(count2);

            // 提交事务
            conn.commit();
        } catch (Exception throwables) {
            // 回滚事务
            conn.rollback();
            throwables.printStackTrace();
        }



        //7. 释放资源
        stmt.close();
        conn.close();
    }
}

3、Statement

1、执行SQL语句

int executeUpdate(sql):执行DML、DDL语句
返回值(1)DML语句影响的行数(2)DDL语句执行后,执行成功也可能返回0
ResultSet executeQuery(sql):执行DQL语句
返回值:Result结果集对象

4、ResultSet

封装了DQL查询语句的结果

ResultSet stmt.executeQuery(sql); 执行DQL语句,返回ResultSet对象

获取查询结果

boolean next(): (1)将光标从当前位置向前移动一行 (2)判断当前行是否为有效行
返回值 true:有效行,当前行有数据   false:无效行,当前行没有数据
xxx getXxx(参数):获取数据
xxx:数据类型,如 : int getInt(参数) String getString(参数)
参数:int: 列的编号,从1开始
	 string:列的名称

使用步骤

1、游标向下移动一行,并判断该行是否有数据:next()

2 、获取数据:getXxx(参数)

//循环判断游标是否是最后一行末尾
while(rs.next())
{
	//获取数据
	rs.getXxx(参数);
}

5、PreparedStatement

作用:预编译SQL语句并执行,防止SQL注入问题

如:用户名随便写,密码写成’ or ‘ 1 ‘ = ‘1

用法:

1、获取PreparedStatement对象

//SQL语句中的参数值,使用?占位符替代
String sql = "select * from user where username = ? and password = ?";
//通过Connection对象获取,并传入对应的SQL语句
PreparedStatement pstmt = conn.prepareStatement(sql);

2、设置参数值

PreparedStatement对象:setXxx(参数1,参数2):给?赋值
Xxx:数据类型,如setInt(参数1,参数2)
参数:
参数1:?的位置编号,从1开始
参数2:?的值

3、执行SQL

executeUpdate();/executeQuery(); :不需要再传递sql

public class JDBCDemo7_PreparedStatement {

    @Test
    public void testPreparedStatement() throws  Exception {
       //2. 获取连接:如果连接的是本机mysql并且端口是默认的 3306 可以简化书写
       String url = "jdbc:mysql:///db1?useSSL=false";
       String username = "root";
       String password = "1234";
       Connection conn = DriverManager.getConnection(url, username, password);

       // 接收用户输入 用户名和密码
        String name = "zhangsan";
        String pwd = "' or '1' = '1";

        // 定义sql
        String sql = "select * from tb_user where username = ? and password = ?";

        // 获取pstmt对象
        PreparedStatement pstmt = conn.prepareStatement(sql);

        // 设置?的值
        pstmt.setString(1,name);
        pstmt.setString(2,pwd);

        // 执行sql
        ResultSet rs = pstmt.executeQuery();

        // 判断登录是否成功
        if(rs.next()){
            System.out.println("登录成功~");
        }else{
            System.out.println("登录失败~");
        }

        //7. 释放资源
        rs.close();
        pstmt.close();
        conn.close();
    }

好处:

1、预编译SQL,性能更高

2、防止SQL注入,将敏感字符进行转义

PreparedStatement预编译功能开启:useServerPrepStmts=true

(参数键值对)应加在URL最后

配置MySQL执行日志(重启mysql服务后生效)

log-output=FILE
general-log=1
general_log_file="D:\mysql.log"
slow-query-log=1
slow_query_log_file="D:\mysql_slow.log"
long_query_time=2

原理:

1、在获取PreparedStatement对象时,将sql语句发送给mysql服务器进行检查,编译(这些步骤很耗时)

2、执行时就不用再进行这些步骤了,速度更快

3、如果sql模板一样,则只需要进行一次检查编译

数据库连接池

简介

  • 数据库连接池是个容器,负责分配,,管理数据库连接

  • 它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个

  • 释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏

  • 好处:

    • 资源重用

    • 提升系统响应速度

    • 避免数据库连接遗漏

数据库连接池实现

标准接口

  • 官方(SUN)提供的数据库连接池标准接口,由第三方组织实现此接口。
  • 功能:获取连接
Connection getConnection()

常见的数据库连接池:

  • DBCP
  • C3P0
  • Druid

Druid(德鲁伊)

  • Druid连接池是阿里巴巴开源的数据库连接池项目
  • 功能强大,性能优秀,是Java语言最好的数据库连接池之一