当前位置: 首页 > article >正文

通过JDBC连接MySQL实现表的插入和查看语句

1.插入语句

因为插入,删除,更新数据操作差不多,我们这里仅仅介绍插入的方法,我们将不使用dbdriver的方式操作,因为这个操作使用的是反射,我们不推荐,下面我们开始正式介绍插入的操作

1.导入库

在官网上搜索jdbc连接的jar包,下载后粘贴到项目路径下,然后选中右击加入库即可

2.创建数据源对象(描述服务源在哪)

服务源可能是本机,也可能是其他服务器

 DataSource dataSource = new MysqlDataSource();

接着设置url,用户,和密码

((MysqlDataSource)dataSource).setURL("jdbc:mysql://localhost:13306/dbtest1?useSSL=false&allowPublicKeyRetrieval=true");

 ((MysqlDataSource)dataSource).setUser("root");
 ((MysqlDataSource)dataSource).setPassword("abc123");

为什么不直接new一个MySQlDataSourse呢?

因为加入我们将数据库换成了Oracle,就不用修改太多的代码,没啥影响,实现了低耦合

3.建立抽象连接

这样通信双方都能接收到对方的信息,便于后面的通信

 Connection connection = dataSource.getConnection();

4.创建一个SQL语句

为什么使用PreparedStatement而不是Statement?

1.预编译

preparedStatement会将sql语句进行预编译,可以提高执行效率,当出现多次相同的查询语句时会更加高效,因为sql已经被编译过了,数据库会对其进行优化或缓存,效率会进一步提高

注:这里的缓存不是JIT的动态缓存,而是数据库在接受到这些预编译的指令,会生成一系列的查询计划进行缓存,后面在接收到相同的查询指令时,可以使用缓存过的查询计划

2.安全性

可以防止sql注入攻击

3.性能优化

PreparedStatement会减少客户端和服务器的网络通信,因为他可以使用参数替代的sql文本,降低了传输的开销.

        String sql = "insert into student values(?,?)";

        //预处理语句(要执行的SQL,是需要进行语法解析的)
        //JDBC也有statement类但是没有预处理功能
        //控制台也是把sql发给服务器,服务器负责解析sql并执行
        //预处理这里就是解析好了,把解析后的结果交给发给服务器去执行
        //如果请求太多了,这样的开销对于服务器来说就不可忽视了
        PreparedStatement statement = connection.prepareStatement(sql);
        statement.setString(1,name);
        statement.setInt(2,age);

4.将构造好的语句发送给服务器执行

这里的n其实是返回了几条记录收到影响,我们便于查看是否插入成功

        int n = statement.executeUpdate();
        System.out.println(n);

5.释放资源

这些连接和语句会占用一定的硬件资源,记得使用完释放,记得先释放语句再释放连接

        statement.close();
        connection.close();

举个例子,我们现在要向student表插入一条数据

"张三",30

下面我们运行这个代码

        Scanner sc = new Scanner(System.in);
        System.out.println("请输入姓名");
        String name = sc.next();
        System.out.println("请输入年龄");
        int age = sc.nextInt();
        //1.创建数据源,描述数据源在哪
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource)dataSource).setURL("jdbc:mysql://localhost:13306/dbtest1?useSSL=false&allowPublicKeyRetrieval=true");
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("abc123");


        //2.和数据库服务器建立连接(抽象的连接)
        //可以理解为通信双方各自保存对方的信息,然后就可以进行后续的通信了
        Connection connection = dataSource.getConnection();

        //3.构造一个sql
        String sql = "insert into student values(?,?)";
        PreparedStatement statement = connection.prepareStatement(sql);
        statement.setString(1,name);
        statement.setInt(2,age);

        //4.把构造好的SQL发送给服务器执行
        int n = statement.executeUpdate();
        System.out.println(n);

        //5.释放一些必要的资源
        statement.close();
        connection.close();

结果就是控制台输出一个1,意思是一行受到了影响,然后打开数据库查看表就会发现已经插入成功了.

注:这里的13306是安装时候设置的端口号,默认为3306,后面的dbtest1是使用的数据库名称

2.查询语句

前面的创建数据源,建立连接都相同,重要的是怎么读取临时表的数据

前面由于操作相同,不做过多赘述

只是我们在接受这个时候的结果集时,有所不同

  ResultSet resultSet = statement.executeQuery();
        while(resultSet.next()){
            String name = resultSet.getString("name");
            int age = resultSet.getInt("age");
            System.out.print("name: "+name+"    ");
            System.out.print("age: "+age+"    ");
            System.out.println();
        }

 我们使用一个ResultSet来接收结果集,分别get对应列的数据,最后以需要的格式打印在控制台中便于查看,我们举例查看一下刚刚的student结果集

         DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource)dataSource).setURL("jdbc:mysql://localhost:13306/dbtest1?useSSL=false&allowPublicKeyRetrieval=true");
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("abc123");

        Connection connection = dataSource.getConnection();
        String sql = "select * from student";
        PreparedStatement statement = connection.prepareStatement(sql);

        ResultSet  resultSet = statement.executeQuery();
        while(resultSet.next()){
            String name = resultSet.getString("name");
            int age = resultSet.getInt("age");
            System.out.println(name +"   " + age);
        }
        resultSet.close();
        statement.close();
        connection.close();

输出结果如下


http://www.kler.cn/a/147311.html

相关文章:

  • 机器学习-36-对ML的思考之机器学习研究的初衷及科学研究的期望
  • 小版本大不同 | Navicat 17 新增 TiDB 功能
  • lua-lru缓存算法解析
  • MuMu模拟器安卓12安装Xposed 框架
  • [Admin] Dashboard Filter for Mix Report Types
  • 0x00基础算法 -- 0x05 排序
  • IDEA断点调试
  • 双通道 12V 直流电机驱动芯片GC8548,12V,大电流,具有短地短电源保护功能,可替代LV8548/LV8549/ONSEMI
  • 浙江启用无人机巡山护林模式,火灾扑救效率高
  • uni-app 离线打包安卓Apk(小白上手)
  • Altium Designer学习笔记13
  • 初学Flink 学后总结
  • MYSQL基础知识之【添加数据,查询数据】
  • 微信小程序 服务端返回富文本,图片无法显示
  • java stream流的执行流程
  • 2019年9月26日: Go生态洞察:发布Go模块
  • java计算积分面积
  • 优化生产制造业流程,提升生产效率,选择ERP管理系统!
  • 单片机学习10——独立按键
  • 推荐6款本周 yyds 的开源项目
  • 国内外的ERP系统存在显著的差异,差在哪?
  • 【数据结构】二叉树之链式结构
  • 希尔伯特和包络变换
  • Redis使用increment方法返回null的原因以及解决方案
  • Django整合回顾
  • Redis面试内容,Redis过期策略,Redis持久化方式,缓存穿透、缓存击穿和缓存雪崩,以及解决办法