JDBC详解

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
云数据库 RDS PostgreSQL,高可用系列 2核4GB
简介: 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);

    }
}
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
存储 应用服务中间件 数据安全/隐私保护
2022红帽RHCSA考题解析
2022红帽RHCSA考题解析
4736 0
2022红帽RHCSA考题解析
|
11月前
|
存储 Prometheus 监控
监控堆外内存使用情况
监控堆外内存使用情况
509 4
|
11月前
|
JavaScript 开发者 Docker
深入理解Docker容器化技术,打造高效开发环境
深入理解Docker容器化技术,打造高效开发环境
|
存储 传感器 监控
制造业全链数字化业务转型实践| 阿里云Lindorm与Intel、OSIsoft共建IT & OT超融合工业数据云
近日,阿里云Lindorm与Intel、OSIsoft推出了面向工业物联网信息经济(Infonomics)的IT & OT超融合工业数据云解决方案。方案通过云端打通阿里云、Intel的IT技术积累和OSIsoft的OT经验能力,实现对传统技术供需关系的超越,打造数据链和价值链混搭方式连接企业和供应商的开放、安全、共享的制造业数据云社区生态。
10712 0
制造业全链数字化业务转型实践| 阿里云Lindorm与Intel、OSIsoft共建IT & OT超融合工业数据云
|
存储 SQL 缓存
大数据基本概念与应用场景
大数据基本概念与应用场景
|
存储 监控 安全
MyBase
MyBase是一款个人信息管理软件,可以帮助用户管理和组织个人信息,包括笔记、文档、图片、音频、视频等多种类型的数据。
679 0
|
机器学习/深度学习 人工智能 供应链
战略地图|破局智能制造的九个场景
向数字化的智能制造要生产力,是很多国家共同的战略选择。基于深耕制造行业七年的数字化实践,阿里云对于制造业向智能制造升级提炼了九大场景,以及对应九大场景的可行解决方案。从微观到宏观,这九大场景已经基本覆盖了智能制造的所有关键环节,完全可以作为回答智能制造现阶段问题的着力点。
642 0
战略地图|破局智能制造的九个场景
|
数据可视化 算法 数据挖掘
网络结构数据分析:揭示复杂系统背后的规律
随着网络技术的不断发展,人们在互联网上留下了海量的数据,这些数据反映了人类社会、经济、生态等各个领域的复杂系统。而这些复杂系统背后的规律往往难以被直接观察到,需要借助网络结构数据分析的方法来揭示。本文将介绍网络结构数据分析的概念、方法和应用,以及未来发展方向
446 0
|
存储 运维 监控
日志服务助力江娱互动实现游戏运维能力跃迁
阿里云日志服务SLS帮助江娱互动做了日志价值的最大化利用,包括业务监控、系统维稳、数据分析等。
806 0
日志服务助力江娱互动实现游戏运维能力跃迁
|
Java 编译器 程序员
Java面向对象程序设计综合练习2(单选题)
Java面向对象程序设计综合练习2(单选题)
1557 0