JDBC详解

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用版 2核4GB 50GB
简介: JDBC详解

一、jdbc入门案例

  • 创建工程,导入驱动jar包

    • mysql-connector-java-5.1.48.jar
  • 1.注册驱动

    • Class.forName("com.mysql.jdbc.Driver");
  • 2.获取连接

    • Connection conn = DriverManager.getConnection(url, username, password);
  • 3.定义SQL语句

    • String sql = “update...”" ;
  • 4.获取执行SQL对象

    • Statement stmt = conn.createStatement();
  • 5.执行SQL

    • stmt.executeUpdate(sql);
  • 6.处理返回结果
  • 7.释放资源

案例:

package com.study;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
public class TestOne {
    public static void main(String[] args) throws Exception {
        //注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //获取连接
        String url="jdbc:mysql://localhost/jdbcone";
        String userName="root";
        String passWord="root";
        Connection conn = DriverManager.getConnection(url, userName, passWord);
        //定义sql
        String sql="update users set password=666 where id=1";
        //获取执行sql的statement对象
        Statement stmt = conn.createStatement();
        //执行sql
        int count = stmt.executeUpdate(sql); //受影响的行数
        //处理结果
        System.out.println("受影响的行数:"+count);  //受影响的行数:1
        //释放资源
        stmt.close();
        conn.close();
    }
}

二、JDBC-API详解

1.DriverManager

  • 1.注册驱动

    • Class.forName("com.mysql.jdbc.Driver");
  • 提示:

    • MySQL 5之后的驱动包,可以省略注册驱动的步骤
    • 自动加载jar包中META-INF/services/java.sql.Driver文件中的驱动类
  • 2.获取连接

    • static connection getconnection (String url,String user,String password)
  • 参数

    • 1.url:连接路径
    • 语法: jdbc:mysql-/ip地址(域名):端口号:/数据库名称?参数键值对1&参数键值对
    • 示例: jdbc:mysql:127,0.0.1:3306/db1
    • 细节:
    • 如果连接的是本机mysq服务器,并目mysql服务默认端口是3306,则luri可以简写为: jdbc:mysqt!:l数据库名称?参数键值对·配置useSSL=false参数,禁用安全连接方式。解决警告提示
      1. user:用户名
      1. password:密码

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(boolean autoCommit): true为自提交事务;false为手动提交事务,即为开启事务
    • 提交事务: commit()
    • 回滚事务: rollback()

案例:

package com.study;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class TestOne {
    public static void main(String[] args) throws Exception {
        //注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //获取连接
        String url="jdbc:mysql://localhost/jdbcone";
        String userName="root";
        String passWord="root";
        Connection conn = DriverManager.getConnection(url, userName, passWord);
        Statement stmt =null;
        try {
            //开启事务
            conn.setAutoCommit(false);
            //定义sql
            String sql1="update users set password=888 where id=1";
            String sql2="update users set password=666 where id=2";
            //获取执行sql的statement对象
            stmt = conn.createStatement();
            //执行sql
            int count1 = stmt.executeUpdate(sql1); //受影响的行数
            //处理结果
            System.out.println("受影响的行数:"+count1);  //受影响的行数:1
            int count2 = stmt.executeUpdate(sql2); //受影响的行数
            //处理结果
            System.out.println("受影响的行数:"+count2);  //受影响的行数:1
            //提交事务
            conn.commit();
        } catch (Exception e) {
            //回滚事务
            conn.rollback();
            e.printStackTrace();
        }
        //释放资源
        stmt.close();
        conn.close();
    }
}
/*
受影响的行数:1
受影响的行数:1
 */

3.Statement

  • . Statement作用:

    • 1.执行SQL语句
  • 执行SQL语句

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

4.ResultSet

  • ResultSet(结果集对象)作用:

    • 1.封装了DQL查询语句的结果
    • ResultSet stmt.executeQuery(sql):执行DQL语句,返回ResultSet对象
  • 获取查询结果

    • boolean next(): (1)将光标从当前位置向前移动一行(2)判断当前行是否为有效行

      • 返回值:

        • true:有效行,当前行有数据.
        • false:无效行,当前行没有数据
    • xXxgetXxx(参数):获取数据
    • xXx:数据类型;如: int getInt(参数) ; String getString(参数)
    • 参数:

      • int:列的编号,从1开始
      • String:列的名称

案例1:

package com.study;

import java.sql.*;

public class ResultSetTest {
    public static void main(String[] args) throws Exception {
        //注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //获取连接
        String url="jdbc:mysql://localhost/jdbcone";
        String userName="root";
        String passWord="root";
        Connection conn = DriverManager.getConnection(url, userName, passWord);
        Statement stmt = null;
        ResultSet rs = null;
        try {
            //定义sql
            String sql="select * from users";
            //创建statement对象
            stmt = conn.createStatement();
            //执行sql语句
            rs = stmt.executeQuery(sql);
            //遍历rs中的数据
            while (rs.next()){
                int id = rs.getInt("id");
                String name = rs.getString("username");
                String password = rs.getString("password");
                String email= rs.getString("email");
                System.out.println(id);
                System.out.println(name);
                System.out.println(password);
                System.out.println(email);
                System.out.println("----------------------------------------");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        //释放资源
        rs.close();
        stmt.close();
        conn.close();
    }
}

案例2:

package com.study;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class ResultSetTestPlus {
    public static void main(String[] args) throws Exception{
        //注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //获取连接
        String url="jdbc:mysql://localhost/jdbcone";
        String userName="root";
        String passWord="root";
        Connection conn = DriverManager.getConnection(url, userName, passWord);
        Statement stmt = null;
        ResultSet rs = null;
        //创建集合对象
       List<Account> list=new ArrayList<>();
        try {
            //定义sql
            String sql="select * from users";
            //创建statement对象
            stmt = conn.createStatement();
            //执行sql语句
            rs = stmt.executeQuery(sql);
            //遍历rs中的数据
            while (rs.next()){
                Account account=new Account();
                int id = rs.getInt("id");
                String name = rs.getString("username");
                String password = rs.getString("password");
                String email= rs.getString("email");
                //赋值
                account.setId(id);
                account.setUsername(name);
                account.setPassword(password);
                account.setEmail(email);
                //存入集合
                list.add(account);
//                [Account{id=1, username='小马哥', password='888', email='111@qq.com'}, Account{id=2, username='小飞侠',
//                password='666', email='222@qq.com'}, Account{id=3, username='马奎斯', password='333', email='333@qq.com'}]

            }
            //打印集合
            System.out.println(list);
        } catch (Exception e) {
            e.printStackTrace();
        }
        //释放资源
        rs.close();
        stmt.close();
        conn.close();
    }
    }

5.PreparedStatement

  • PreparedStatement作用:
  • 1.预编译SQL语句并执行:预防SQL注入问题
  • SQL注入
  • SQL注入是通过操作输入来修改事先定义好的SQL语句,用以达到执行代码对服务器进行攻击的方法。
  • PreparedStatement作用:

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

    • PreparedStatement对象: setXxx(参数1,参数2):给﹖赋值
    • Xxx:数据类型;如setlnt (参数1,参数2)
  • 参数:

    • 参数1:?的位置编号,从1开始
    • 参数2:?的值
  • 执行SQL
executeUpdate(); / executeQuery()::不需要再传递sql

案例:

package com.study;

import java.sql.*;

public class PreparedStatementLogin {
    public static void main(String[] args) throws Exception {
        //注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //获取连接
        String url="jdbc:mysql://localhost/jdbcone";
        String userName="root";
        String passWord="root";
        Connection conn = DriverManager.getConnection(url, userName, passWord);
        //接收用户输入的用户名和密码
        String name="king";
        String psw="888";
        String sql="select * from users where username=? and password=?";
        //创建pstmt对象
        PreparedStatement pstmt = conn.prepareStatement(sql);
        //设置值
        pstmt.setString(1,name);
        pstmt.setString(2,psw);

        //执行sql语句
        ResultSet rs = pstmt.executeQuery();
        //判断是否登录成功
        if (rs.next()){
            System.out.println("登录成功!");
        }
        else {
            System.out.println("登录失败!");
        }
        rs.close();
        pstmt.close();
        conn.close();
    }
    }
//登录成功!

三、数据库连接池

1.简介

  • 数据库连接池是个容器,负责分配、管理数据库连接(Connection)
  • 它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;
  • 释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏
  • 好处:

    • 资源重用
    • 提升系统响应速度
    • 避免数据库连接遗漏
  • 标准接口:DataSource

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

    • DBCP
    • C3PO
    • Druid
  • Druid(德鲁伊)

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

2.使用

  • Driud使用步骤

    • 1.导入jar包,druid-1.1.1
    • 2.jar2.定义配置文件
    • 3.加载配置文件
    • 4.获取数据库连接池对象
    • 5.获取连接

案例:

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///users
username=root
password=root
# 初始化连接数
initialSize=5
# 最大连接数
maxActive=10
# 最大等地时间
maxWait=3000


package com.druidTest;

import com.alibaba.druid.pool.DruidDataSourceFactory;
import javafx.scene.layout.Priority;

import javax.sql.DataSource;
import java.io.FileInputStream;
import java.sql.Connection;
import java.util.Properties;

public class DruidTest {
    public static void main(String[] args) throws Exception {
        //导入jar包
        //定义配置文件
        //加载配置文件
        Properties prop = new Properties();
        prop.load(new FileInputStream("JDBCTest/src/druid.properties"));
        //获取连接池对象
        DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
        //获取数据库连接Connection
        Connection conn = dataSource.getConnection();
        System.out.println(conn);

    }
}
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
3月前
|
Java 关系型数据库 MySQL
JDBC是真的啰里啰嗦啊-但是很重要!(上)
JDBC是真的啰里啰嗦啊-但是很重要!
21 1
|
3月前
|
SQL Java 数据库连接
JDBC是真的啰里啰嗦啊-但是很重要!(下)
JDBC是真的啰里啰嗦啊-但是很重要!
18 1
|
SQL Oracle 数据可视化
|
12月前
|
SQL Java 关系型数据库
JDBC详解
JDBC详解
|
SQL 人工智能 数据可视化
JDBC的“那些事“之应当注意的问题(上)
JDBC的“那些事“之应当注意的问题(上)
|
Java 关系型数据库 MySQL
JDBC1.0
JDBC是JAVA十三大规范之一,由JAVA定义顶级接口API,各个数据库厂商去实现。常用的四大接口——Driver,DriverManager,Connection,Statement。 这里先给出结论: 所谓的JAVA制定标准,就是指JAVA给出接口,厂家各自去实现。 比如Driver,Connection,Statement等都是有接口,有实现。 通过向DriverManager注册不同Driver来确定Connection,Statement的类型
56 0
|
SQL Java 关系型数据库
JDBC介绍
JDBC介绍
98 0
|
SQL 安全 Java
33 JDBC实用详解
info 💡 概念:JDBC是java提供的一套用于操作数据库的接口API:java程序员只需要面向这套接口编程即可;
83 0
|
SQL 安全 Java
|
Java 数据库连接
JDBC练习
JDBC练习
76 0
JDBC练习