JDBC API详解

news/2024/7/7 19:38:05

文章目录

  • 入门案例
  • DriverManager
  • Connection
  • Statement
  • ResultSet
  • PreparedStatement
  • 数据库连接池
  • 完整代码

入门案例

package jdbc;

import java.sql.*;

public class connectionTest {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //1.注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //2.获取连接
        String url="jdbc:mysql:///test2?useSSL=false";
        String username="root";
        String password="123456";
        Connection conn= DriverManager.getConnection(url,username,password);
        //3.定义sql
        String sql ="update sc set Grade=95 where Sno=15202101";
        //4.获取执行sql的对象Statement
        Statement stmt=conn.createStatement();
        //5.执行sql
        int cout=stmt.executeUpdate(sql);//受影响行数
        //6.处理结果
        System.out.println(cout);
        //7.释放资源
        stmt.close();
        conn.close();

    }
}

DriverManager

驱动管理类,作用:1. 注册驱动 2. 获取数据库连接

  1. 注册驱动:MySql 5之后的注册驱动可以不写,所以上面的代码注册驱动部分可以省略。
  2. 获取连接
Connection conn=DriverManager.getConnection(url,username,password);

url:连接路径,语法 jdbc:mysql://ip地址(域名):端口号/数据库名称?参数键值对1&参数键值对2…
示例:jdbc:mysql://127.0.0.1:3306/test2
在这里插入图片描述
user:数据库用户名 password:数据库密码

Connection

数据库连接对象,作用:
1.获取执行SQL的对象 2.管理事物
在这里插入图片描述

//获取连接conn
Connection conn=DriverManager.getConnection(url,username,password);
//用conn获取sql的执行对象stmt 
Statement stmt=conn.createStatement();

在这里插入图片描述

import java.sql.*;

public class connectionTest {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //1.获取连接
        String url="jdbc:mysql:///test2?useSSL=false";
        String username="root";
        String password="123456";
        Connection conn= DriverManager.getConnection(url,username,password);
        //2.定义sql
        String sql1 ="update sc set Grade=95 where Sno=15202101";
        String sql2 ="update sc set Grade=75 where Sno=15202102";
        //3.获取执行sql的对象Statement
        Statement stmt=conn.createStatement();

        try {
            //开启事物
            conn.setAutoCommit(false);//改为手动提交
            //4.执行sql
            int cout1=stmt.executeUpdate(sql1);
            int i=3/0;
            int cout2=stmt.executeUpdate(sql2);
            //5.处理结果
            System.out.println(cout1);
            System.out.println(cout2);
            //提交事物
            conn.commit();
        }catch (Exception throwables){
            conn.rollback();//回滚到开启事物那里
            throwables.printStackTrace();
        }
        //6.释放资源
        stmt.close();
        conn.close();
    }
}

Statement

作用:执行SQL语句。
在这里插入图片描述
DML:对数据的增删改 DDL:对表和数据库的增删改 DQL:对数据的查询

//对数据的增删改
public class connectionTest {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //1.获取连接
        String url="jdbc:mysql:///test2?useSSL=false";
        String username="root";
        String password="123456";
        Connection conn= DriverManager.getConnection(url,username,password);
        //2.定义sql
        String sql ="update sc set Grade=95 where Sno=15202101";
        //3.获取执行sql的对象Statement
        Statement stmt=conn.createStatement();
        //4.执行sql
        int cout=stmt.executeUpdate(sql);
        //5.处理结果
        if(cout>0){
            System.out.println("修改成功");
        }else{
            System.out.println("修改失败");
        }
        //6.释放资源
        stmt.close();
        conn.close();
    }
}

//对数据库和表的增删改
public class connectionTest {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //1.获取连接
        String url="jdbc:mysql:///test2?useSSL=false";
        String username="root";
        String password="123456";
        Connection conn= DriverManager.getConnection(url,username,password);
        //2.定义sql
        String sql ="create database db2";
        //3.获取执行sql的对象Statement
        Statement stmt=conn.createStatement();
        //4.执行sql
        int cout=stmt.executeUpdate(sql);
        //5.处理结果
        //执行DDL语句时,就算执行成功,cout返回可能也是0
        //所以不能按之前的方法判断执行成功与否
        //6.释放资源
        stmt.close();
        conn.close();
    }
}

ResultSet

结果集对象,作用:封装了DQL查询语句的结果
ResultSet result=stmt.executeQuery(sql);
在这里插入图片描述

使用步骤:
1.游标向下移动一行并判断该行是否有数据。
2.获取数据:getXxx(参数)
在这里插入图片描述

import java.sql.*;

public class connectionTest {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //1.获取连接
        String url="jdbc:mysql:///test2?useSSL=false";
        String username="root";
        String password="123456";
        Connection conn= DriverManager.getConnection(url,username,password);
        //2.定义sql
        String sql ="select * from sc";
        //3.获取执行sql的对象Statement
        Statement stmt=conn.createStatement();
        //4.执行sql
        ResultSet rs=stmt.executeQuery(sql);
        //5.处理结果(遍历rs中的所有数据)
        //5.1光标向下移动一行,并且判断当前行是否有数据
        while (rs.next()){
            //5.2获取数据
            String Sno=rs.getString(1);
            String Cno=rs.getString(2);
            int Grade=rs.getInt(3);
            System.out.println("Sno:"+Sno+"  "+"Cno:"+Cno+"  "+"Grade:"+Grade);
        }
        //6.释放资源
        rs.close();
        stmt.close();
        conn.close();
    }
}

关于上面rs获取表中数据部分,还有另外一种写法:

        //5.处理结果(遍历rs中的所有数据)
        //5.1光标向下移动一行,并且判断当前行是否有数据
        while (rs.next()){
            //5.2获取数据
            String Sno=rs.getString("Sno");
            String Cno=rs.getString("Cno");
            int Grade=rs.getInt("Grade");
            System.out.println("Sno:"+Sno+"  "+"Cno:"+Cno+"  "+"Grade:"+Grade);
        }

案例
在这里插入图片描述

import java.sql.*;
import java.util.*;

public class connectionTest {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //1.获取连接
        String url="jdbc:mysql:///test2?useSSL=false";
        String username="root";
        String password="123456";
        Connection conn= DriverManager.getConnection(url,username,password);
        //2.定义sql
        String sql ="select * from sc";
        //3.获取执行sql的对象Statement
        Statement stmt=conn.createStatement();
        //4.执行sql
        ResultSet rs=stmt.executeQuery(sql);
        //创建集合
        List<Accout> list=new ArrayList<>();
        //5.处理结果(遍历rs中的所有数据)
        while (rs.next()){
            Accout accout=new Accout();
            String Sno=rs.getString(1);
            String Cno=rs.getString(2);
            int Grade=rs.getInt(3);

            //赋值
            accout.setSno(Sno);
            accout.setCno(Cno);
            accout.setGrade(Grade);

            list.add(accout);
        }
        //查看集合中数据
        Iterator<Accout> it=list.iterator();
        while (it.hasNext()){
            Accout s=it.next();
            System.out.println(s);
        }
        //6.释放资源
        rs.close();
        stmt.close();
        conn.close();
    }
}

PreparedStatement

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

简单的用户登录环节,连接数据库

public class connectionTest {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //获取连接
        String url="jdbc:mysql:///test2?useSSL=false";
        String username="root";
        String password="123456";
        Connection conn= DriverManager.getConnection(url,username,password);
        //获取执行sql的对象Statement
        Statement stmt=conn.createStatement();
        //接收用户输入的用户名和密码
        String name="";
        String pwd="";

        String sql ="select * from tb_user where username='"+name+"' and password='"+pwd+"'";
        ResultSet rs=stmt.executeQuery(sql);

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

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

而SQL注入说的是,例如当密码输入的是’or ‘1’='1时,会将那条SQL语句改成了恒为1,则一直登录成功。
在这里插入图片描述
在这里插入图片描述
如何解决SQL注入?
出现SQL注入的根本原因是拼字符串环节存在bug。
所以实际生产中要避免拼接字符串,用?来代替。
在这里插入图片描述
通过setXxx()的方法来给?设置数值。
所以将Statement类改用PreparedStatement类。

public class connectionTest {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //获取连接
        String url="jdbc:mysql:///test2?useSSL=false";
        String username="root";
        String password="123456";
        Connection conn= DriverManager.getConnection(url,username,password);
        //接收用户输入的用户名和密码
        String name="";
        String pwd="";

        String sql ="select * from tb_user where username=? and password=?";
        PreparedStatement pstmt=conn.prepareStatement(sql);
        pstmt.setString(1,name);
        pstmt.setString(2,pwd);
        ResultSet rs=pstmt.executeQuery();

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

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

数据库连接池

简介:是一个容器,负责分配、管理数据库连接。它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个。释放空闲数据超过最大空间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。
好处:1. 资源重复利用。 2. 提示系统响应速度。 3. 避免数据库连接遗漏。
在这里插入图片描述

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.FileInputStream;
import java.sql.*;
import java.util.*;

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

完整代码

druid.properties文件信息:

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///test2?useSSL=false&useServerPrepStmts=true
username=root
password=123456
# 初始化连接数量
initialSize=5
# 最大连接数
maxActive=10
# 最大等待时间
maxWait=3000

查询

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.FileInputStream;
import java.sql.*;
import java.util.*;

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

        String sql1="select * from sc where Sno=?";
        System.out.println("请输入要查询的学号:");
        Scanner sc=new Scanner(System.in);
        String uSno=sc.next();

        //获取PreparedStatement对象
        PreparedStatement pstmt=connection.prepareStatement(sql1);
        pstmt.setString(1,uSno);

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

        Accout accout=new Accout();
        List<Accout> list=new ArrayList<>();
        //处理结果
        while (rs.next()){
            String Sno=rs.getString(1);
            String Cno=rs.getString(2);
            int Grade=rs.getInt(3);

            accout.setSno(Sno);
            accout.setCno(Cno);
            accout.setGrade(Grade);
            list.add(accout);
        }
        Iterator<Accout> it=list.iterator();
        while (it.hasNext()){
            Accout a=it.next();
            System.out.println(a);
        }
        //释放资源
        rs.close();
        pstmt.close();
        connection.close();
    }
}

插入数据

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.FileInputStream;
import java.sql.*;
import java.util.*;

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

        String sql1="insert into sc values (?,?,?)";
        System.out.println("请输入要插入的数据:");
        Scanner sc=new Scanner(System.in);
        String uSno=sc.next();
        String uCno=sc.next();
        int uGrade=sc.nextInt();

        //获取PreparedStatement对象
        PreparedStatement pstmt=connection.prepareStatement(sql1);
        pstmt.setString(1,uSno);
        pstmt.setString(2,uCno);
        pstmt.setInt(3,uGrade);

        //执行sql
        int cout=pstmt.executeUpdate();
        //处理结果
        if(cout>0){
            System.out.println("更新成功");
        }else{
            System.out.println("更新失败");
        }
        //释放资源
        pstmt.close();
        connection.close();
    }
}


http://lihuaxi.xjx100.cn/news/517302.html

相关文章

C#中组合快捷键的实现

//方法一.在form_load的时候写上// this.KeyPreview=true; //表示窗体接受按键事件//然后在KeyDown事件中写入如下代码实现输入的是否是Ctrl+A的组合键:private void Form1_KeyDown(object sender, KeyEventArgs e){if (e.KeyCode == Keys.A && e.Modifiers == Keys.C…

C# 与WEB 服务器通信

web server与web服务器通信应先使用postman测试,确认服务器正常再写代码发送UTF-8 的json字符串using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;using System.IO; using System.Net;public enum HttpV…

Windows下MySQL安装配置和工具使用

目录 1、下载地址 1.1、建立配置文件 1.2、初始化数据库 1.3、安装服务

AAAI2023 | 针对联邦推荐场景的非定向攻击与防御

嘿&#xff0c;记得给“机器学习与推荐算法”添加星标TLDR&#xff1a;今天跟大家分享一篇通过利用聚类算法来操纵物品嵌入特征以此针对联邦推荐场景进行非定向攻击的工作&#xff0c;随后作者针对这一攻击又提出了一种基于一致性的对应防御机制&#xff0c;该论文已被AAAI2023…

CIO40— 2022 行平常心,做自由人 (3年之约已满)

今天的天空依然很蓝。认识还是在那个不戴口罩的夏天。 感谢IT行业给了我们帮助。 IT将交流植根于微信群&#xff0c;微信群既是信息的集散地&#xff0c;也是良好实践的方案池。在工作中碰到的问题&#xff0c;只要在IT微信群中求助&#xff0c;大家都是知无不言&#xff0c…

【重要】有三AI技术专栏作者邀请,5大权益助力共同成长

知识分享平台众多&#xff0c;我们有三AI公众号是其中一个&#xff0c;在过去的3年里&#xff0c;我们已经写了700多篇&#xff0c;超过200万字的技术文&#xff0c;其中一些专栏作者的贡献功不可没。我们公众号只做原创内容&#xff0c;因为我并不希望平台成为一个靠复制转载内…

python基础回顾

python基础字符串计算字符串中某个字符或者子字符串出现的次数判断字符串的数据类型字符串子串的查找字符串中子串的数量字符串拼接内置函数执行计算表达式(字符串)去重 set()函数lambda函数类Python动态实例属性判断对象是否存在指定属性给对象添加指定属性字符串 计算字符串…

希尔排序分析

目录 &#x1f345; 原理介绍 &#x1f345; 特点 &#x1f345; 代码示例 &#x1f345; 算法复杂度&#xff08;参考《数据结构》严蔚敏&#xff09; &#x1f345; 改进方案 &#x1f345; 原理介绍 [算法]六分钟彻底弄懂希尔排序&#xff0c;简单易懂_哔哩哔哩_bilib…