• JDBC的基础操作


    JDBC编程


    在实际工作中,很多时候还是使用代码来操作SQL语句的

    API : Application Programming Interface 引应用程序编程接口

    提供了一组类/方法,让程序员调用

    但是,做数据库的厂商很多,Oracle MySQL SQLite SQL Server, 不同种类的数据库,提供的API不一样,这样就增加了学习的成本以及替换数据库的成本

    Java为了解决上述的问题,就提供了一套统一风格的数据库操作 API(JDBC), 让数据库厂商来适配这套Java的API,这样子程序员只要掌握这一套Java 的API就能操作各种数据库,这一套API就是JDBC(java database connection)

    image-20220807223039508

    JDBC环境搭建

    下载驱动包

    当然要先下载驱动包才能使用

    建议去中央仓库

    直接搜索 mysql

    image-20220807223159304

    驱动包有很多的版本,要保证和数据库的大版本对得上

    我这里使用的是MySQL 5.7版本 ,所以只要选择5系列就行了

    这个驱动包本质上就是一个压缩包,是以.jar为后缀的文件 ,成为jar包

    jar包 点进去就是一堆.class文件,(java编译生成的二进制文件)

    jar包是java发布程序的一种 常见手段(因为有很多的.class文件,随意打成一个jar包就会很方便)

    将驱动包导入到项目中

    创建一个lib(库)(必须要与 src同一级)

    将驱动包粘贴到lib里面,右键lib,点击add as library就导入成功

    开始进行JDBC

    import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
    import javax.sql.DataSource;
    
    public class JDBC {
        public static void main(String[] args) {
            //创造数据源对象,数据源对象描述了要访问的数据库是哪一个,在哪
            DataSource dataSource = new MysqlDataSource();//向上转型
            ((MysqlDataSource) dataSource).setURL();//向下转型(需要强制转型) 
            //这里的set操作不是DataSource的,而是MysqlDataSource,所以要向下转型,转成MysqlDataSource才能调用set方法(父类-->子类:向下转型)
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    对于 DataSource dataSource = new MysqlDataSource();

    DataSource 是标准库JDBC的一个接口,MysqlDataSource来自于自己导入的jar包
    每种数据库有都会提供对应的类来实现DataSource接口–也就是new 后面的对象
    此处用到了向上转型–子类对象转为(指向)父类对象 实例:Animal b=new Bird(); Bird继承于Animal DataSource是父类,MysqlDataSource是具体的子类

    这里也是用到了多态的概念

    封装: 将实现的细节隐藏起来,让调用者不必考虑细节,直接调用即可

    多态:将实现类的类型也隐藏起来了,调用者不仅不要考虑细节,类型也不要管了

    MysqlDataSource dataSource1 = new MysqlDataSource();
    dataSource1.setURL();
    //要是直接这样写,MysqlDataSource就会出现,导致MySQL与项目的耦合性就会提高
    //要是以后迁移数据库有就会有很多的修改,维护成本高,所以还是上面的向上转型写法更好
    
    • 1
    • 2
    • 3
    • 4

    写代码追求的是"高内聚,低耦合"

    耦合性

    一个大的程序,里面有很多的部分,要是这些部分之间的关联性比较强,那就是耦合性高

    反之,耦合性低,我们追求的就是部分与部分之间要减少关联–低耦合

    内聚性

    简单来说,内聚就是将相关的代码写到一起

    举一个实际的例子:将所有的衣服全都放到衣柜里面,不至于同一件,西一件,这就是高内聚

    URL

    URL 统一资源定位符 俗称网址

    image-20220809215110306

    ip地址描述了网络上主机的位置

    127.0.0.1 是一个特殊的ip地址,表示本机,无论本机是什么,都可以用127.0.0.1 来表示本机 , 这个ip地址也叫做环回ip/环回地址

    端口号是用来区分主机上不同的应用程序的

    ip地址确定主机位置,但是一台主机上面有很多的程序,就由端口号来区分不同的程序

    3306是mysql的默认端口号

    由上面可以看出,DataSource描述了在哪里能找到数据库的位置

    URL能体现出数据库服务器的位置,以及 数据库的名称

    在连接数据库的时候,Connection connection= dataSource.getConnection();

    这里的Connection用的是标准库里面的

    image-20220809221942342

    image-20220809222210450

    String sql = "insert into student values(1,'张三')";//注意:这里varchar插入格式是单引号
    PreparedStatement statement = connection.prepareStatement(sql);
    //PrepareStatement是预处理,SQL将语句发给服务器,服务器就得进行语句解析
    //但是解析过程还是很消耗资源的,服务器要处理很多的客户端请求,很忙,所以就将一部分解析的工作交给客户端
    //自己进行解析,数据库就省去了解析的过程,就节省了资源消耗,提高了处理效率
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
    import javax.sql.DataSource;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    //通过JDBC操作数据库,往数据库中插入一条数据
    
    public class JDBC {
        public static void main(String[] args) throws SQLException {  //数据库中常见的异常
            //1.创造数据源对象,数据源对象描述了要访问的数据库是哪一个,在哪
            DataSource dataSource = new MysqlDataSource();
            //DataSource 是标准库JDBC的一个接口,MysqlDataSource来自于自己导入的jar包
            //每种数据库有都会提供对应的类来实现DataSource接口--也就是new 后面的对象
            //此处用到了向上转型--子类对象转为(指向)父类对象  实例:Animal b=new Bird(); Bird继承于Animal
            //DataSource
            ((MysqlDataSource) dataSource).setURL("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false");
            //向下转型(需要强制转型) 这里的set操作不是DataSource的,而是MysqlDataSource
            //所以要向下转型,转成MysqlDataSource才能调用set方法
            ((MysqlDataSource) dataSource).setUser("root");//用户名
            ((MysqlDataSource) dataSource).setPassword("1111");//密码
            //2. 让代码和数据库服务器进行连接
            Connection connection= dataSource.getConnection();//连接数据库  getConnection()会出现受查异常(编译时异常) 要进行显示处理 throws或者try catch
            //3.构造要执行的SQL语句
            //先通过字符串描述出要执行的sql语句,再通过PrepareStatement对象来接收sql语句
            String sql = "insert into student values(1,'张三')";//注意:这里是单引号
            PreparedStatement statement = connection.prepareStatement(sql);//PrepareStatement是预处理,SQL将语句发给服务器,服务器就得进行语句解析
            //4.执行SQLp[发送请求 & 读取响应]
            //executeUpdate   对应插入修改删除操作,返回值表示这次SQL操作影响的行数
            //executeQuery    对应查询操作,返回值是返回的临时的临时表数据
            int n = statement.executeUpdate();
            System.out.println("n = "+ n);
            //5,完成之后,就需要关闭释放相关资源
            //关系资源要按照“先创建的后关闭,后创建的先关闭”
            statement.close();
            connection.close();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    小总结(简洁版)

    import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
    import javax.sql.DataSource;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    //通过JDBC操作数据库,往数据库中插入一条数据
    
    public class JDBC {
        public static void main(String[] args) throws SQLException { 
            //1.创造数据源对象,数据源对象描述了要访问的数据库是哪一个,在哪
            DataSource dataSource = new MysqlDataSource();
            ((MysqlDataSource) dataSource).setURL("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false");
            ((MysqlDataSource) dataSource).setUser("root");//用户名
            ((MysqlDataSource) dataSource).setPassword("1111");//密码
            //2. 让代码和数据库服务器进行连接
            Connection connection = dataSource.getConnection();//连接数据库  getConnection()会出现受查异常(编译时异常) 要进行显示处理 throws或者try catch
            //3.构造要执行的SQL语句
            String sql = "insert into student values(1,'张三')";//注意:这里varchar的格式是单引号
            PreparedStatement statement = connection.prepareStatement(sql);//PrepareStatement是预处理,SQL将语句发给服务器,服务器就得进行语句解析
            //4.执行SQLp[发送请求 & 读取响应]
            int n = statement.executeUpdate();
            System.out.println("n = "+ n);
            //5,完成之后,就需要关闭释放相关资源
            statement.close();
            connection.close();
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    JDBCInsert

     public static void main(String[] args) throws SQLException {
            //1.创造数据源对象
            DataSource dataSource = new MysqlDataSource();
            ((MysqlDataSource) dataSource).setURL("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false");
            ((MysqlDataSource) dataSource).setUser("root");//用户名
            ((MysqlDataSource) dataSource).setPassword("1111");//密码
            //2. 让代码和数据库服务器进行连接
            Connection connection = dataSource.getConnection();//连接数据库  getConnection()会出现受查异常(编译时异常) 要进行显示处理 throws或者try catch
            //3.构造要执行的SQL语句
            //[用户自己输入数据]
            Scanner scanner = new Scanner(System.in);
            System.out.println("请输入要插入的学号");
            int id = scanner.nextInt();
            System.out.println("请输入要插入的姓名");
            String name = scanner.next();
            String sql = "insert into student values(?,?)";// ? 是 占位符,只是占个位置,之后会被替换掉
            PreparedStatement statement = connection.prepareStatement(sql);//PrepareStatement是预处理,SQL将语句发给服务器,服务器就得进行语句解析
            statement.setInt(1,id);//  1 表示 替换第一个?
            statement.setString(2,name);//  2  表示替换第二个?
            //4.执行SQL[发送请求 & 读取响应]
            int n = statement.executeUpdate();
            //System.out.println("statement" + statement);
            //System.out.println("n = "+ n);
            //5,完成之后,就需要关闭释放相关资源
            statement.close();
            connection.close();
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    其实,插入修改删除都是一样的操作,这三者的执行用的都是executeUpdate,只是sql的语句不一样而已

    JDBCUpdate

    import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
    
    import javax.sql.DataSource;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    import java.util.Scanner;
    
    public class JDBCUpdate {
        public static void main(String[] args) throws SQLException {
            //1.创建一个数据源
            DataSource dataSource = new MysqlDataSource();
            ((MysqlDataSource) dataSource).setURL("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false");
            ((MysqlDataSource) dataSource).setUser("root");
            ((MysqlDataSource) dataSource).setPassword("1111");
            //2.和数据库进行连接
            Connection connection = dataSource.getConnection();
            //3.构造SQL语句
            Scanner scanner = new Scanner(System.in);
            System.out.println("请输入你要修改的同学的学号:");
            int id = scanner.nextInt();
            System.out.println("请输入修改后的姓名:");
            String name = scanner.next();
            
            String sql = "update student set name = ? where id = ?";
            PreparedStatement statement = connection.prepareStatement(sql);
            statement.setString(1,name);//代表第一个?,是String类型的
            statement.setInt(2,id);
            //4.执行SQL语句
            int n = statement.executeUpdate();
            System.out.println("n= " + n);
            //5.关闭释放资源
            statement.close();
            connection.close();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    JDBCDelete

    import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
    
    import javax.sql.DataSource;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    import java.util.Scanner;
    
    public class JDBCDelete {
        public static void main(String[] args) throws SQLException {
            //1,创建数据源
            DataSource dataSource = new MysqlDataSource();
            ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false");
            ((MysqlDataSource)dataSource).setUser("root");
            ((MysqlDataSource) dataSource).setPassword("1111");
            //2.连接数据库
            Connection connection = dataSource.getConnection();//Connection是Java.sql的
            //写SQL语句 解析
            Scanner scanner = new Scanner(System.in);
            System.out.println("请输入你要删除的学生id:");
            int id = scanner.nextInt();
    
            String sql = "delete from student where id = ?";
            PreparedStatement statement = connection.prepareStatement(sql);//解析
            statement.setInt(1,id);
            //4.执行sql语句
            int n = statement.executeUpdate();
            System.out.println("n= " + n);
            //5.资源的关闭释放
            statement.close();
            connection.close();
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    JDBCSelect

    import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
    
    import javax.sql.DataSource;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.Scanner;
    
    public class JDBCSelect {
        public static void main(String[] args) throws SQLException {
            //1.创建数据源
            DataSource dataSource = new MysqlDataSource();
            ((MysqlDataSource) dataSource).setURL("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false");
            ((MysqlDataSource) dataSource).setUser("root");
            ((MysqlDataSource) dataSource).setPassword("1111");
            //2.连接数据库
            Connection connection = dataSource.getConnection();
            //3.构造sql语句
            String sql = "select * from student where id = ? ";//条件查询
            PreparedStatement statement = connection.prepareStatement(sql);//解析
            statement.setInt(1,2);//前面的数字一定要从1开始,后面是表中的id,即要查询的id数字
            //4.执行SQL语句
            //查询结果要用executeQuery来完成
            //返回结果是ResultSet  结果集   类似于表的数据结构
            ResultSet resultSet = statement.executeQuery();
            //5.遍历结果集合
            while (resultSet.next()) {
                //每次循环就会将每一行id 和 name 取出
                int id = resultSet.getInt("id");//getXXX里面放到是列名
                String name = resultSet.getString("name");
                System.out.println("id = "+ id +",name= "+ name );
            }
            //5.资源的关闭与释放
            resultSet.close();//resultSet也是资源
            statement.close();
            connection.close();
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
  • 相关阅读:
    Python类的方法
    存储系统架构演变
    vue3+el-plus对eleplus对el-table表格进行拖拽(使用sortablejs进行列拖拽和行拖拽):
    OpenCV实现答题卡自动打分!
    面试最常问的问题——被虐了之后,我翻烂了equals源码,总结如下
    iOS&Safari不兼容正则表达式的断言匹配及解决办法
    文举论金:黄金原油全面走势分析策略指导。
    腾讯云助力港华能源上线“碳汭星云2.0”,推动能源行业绿色低碳转型
    树(C语言实现)
    OPT锂电池极耳缺陷检测方案
  • 原文地址:https://blog.csdn.net/m0_60354608/article/details/126796087