Java Web简明教程–Java篇[9]–使用SQL语句实现增删改查

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: Java Web简明教程–Java篇[9]–使用SQL语句实现增删改查

前一篇已经演示了如何连接数据库,因为连接数据库这个活,经常要干,所以不如直接成立一个类,专门处理数据库方面的事情,比较省心,话不多说,上例子,话都在注释里。

import java.sql.*;//导入数据库相关类库
/**
 * MysqlHandler MySQL数据库管理类
 * @author 猫哥
 * @date 2016.12.31
 */
public class MysqlHandler{
  //三个必备属性
    private Connection conn = null;//Connection表示跟数据库的连接,这个很好理解。你每一次打电话都要通了之后才行,你每一次连接数据库都要连接了才行
    private Statement stmt = null;//Java连接了数据库之后,要对数据库进行什么操作?需要告诉数据库哪些参数?这些信息都依赖于Statement
    private ResultSet rs = null;//如果是从数据库查询数据,可以把返回的数据放在ResultSet里面
    //首先第一步,需要跟数据库建立连接
    public Connection buildConnection() {        
      String driver = "com.mysql.jdbc.Driver";//MySQL数据库的驱动程序名
         String url = "jdbc:mysql://localhost:3306/java?useUnicode=true&characterEncoding=utf-8";//数据库连接字符串
         String user = "root";//用户名
         String password = "Pass1234";//密码
         try{   
          Class.forName(driver);//加载驱动程序
          conn=DriverManager.getConnection(url,user,password);//输入必备参数,获取连接   
         }
         catch(Exception ex){
          ex.printStackTrace();//可以输出比较详细的异常信息 
         }
        return conn;
    }
    //第二步,“增删改查”中,增、删、改都是执行sql语句,无需返回ResultSet结果集,所以设置为一个方法
    public int execute(String sql){
        try {
          if(stmt==null)//创建Statement
          stmt=conn.createStatement();
            int affectedCount = stmt.executeUpdate(sql);//此处真正执行stmt定义的操作
            return affectedCount;//这个是收到影响的行数
        } catch (Exception ex) {
            ex.printStackTrace();
            return -1;//返回-1,表示执行失败了,有异常
        }
    }
    //第二步,如果是查询,需返回结果集
    public ResultSet query(String sql){
        try {
          if(stmt==null)//创建Statement
          stmt=conn.createStatement();
            rs = stmt.executeQuery(sql);//执行pstmt中定义的查询
            return rs;//将结果集返回
        } catch (Exception ex) {
            ex.printStackTrace();
            return null;//如果有错误,返回null
        }
    }
    //第四步,之前建立了和数据库的连接,要知道数据库的连接是有限的,用完了必须释放,不然咱一个程序占人家20个连接,太浪费了
    public void sayGoodbye(){
      //此处注意,不要用一个try{}把三个.close()都包含起来,如果第一个就异常了,后面即使不异常也关闭不了,对吧
        if(rs!=null){//关闭结果集,这个不关闭也浪费
            try {
                rs.close();
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
        if(stmt!=null){//关闭Statement,不要浪费
            try {
              stmt.close();
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
        if(conn!=null){//关闭连接
            try {
                conn.close();
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
    }
}


好了,现在来演示下如何使用这个类实现student_info表的增删改查

import java.sql.*;
public class TestMysql {//测试MysqlHandler类
  public static void main(String[] args)  {
  try {//捕获异常
    testOneTime();
  } catch (SQLException e) {
    e.printStackTrace();
  }
  }
  //测试一次完整的增删改查操作
  private static void testOneTime()throws SQLException{//可能会有异常,我们在更广阔的天地捕获之
  MysqlHandler hand=new MysqlHandler();
  Connection con=hand.buildConnection();//建立连接
  ResultSet rs;//可以使用多次
  //查
  rs=hand.query("select * from student_info");
  //展示结果
  System.out.println("\n查询结果如下:");
  while(rs.next()){
    System.out.print(rs.getInt(1) + "|");
             System.out.print(rs.getString(2) + "\t");
  }
  //增加2个
  int addCount=hand.execute("insert into student_info (student_name) values('火星人'),('水星人')");
  System.out.println("\n增加了"+addCount+"个");
  //删除一个
  int delCount=hand.execute("delete from student_info where student_name='张三'");
  System.out.println("\n删除了"+delCount+"个");
  //修改一个,把李四改造成火星人
  int changeCount=hand.execute("update student_info set student_name='火星人李四' where student_name='李四'");
  System.out.println("\n修改了"+changeCount+"个");
  //查
  rs=hand.query("select * from student_info");
  System.out.println("\n查询结果如下:");
  while(rs.next()){
    System.out.print(rs.getInt(1) + "|");
    System.out.print(rs.getString(2) + "\t");
  }
  hand.sayGoodbye();//千万别忘了关闭
  }
}

测试结果:



查询结果如下:

1|张三 2|李四 3|王五

增加了2个


删除了1个


修改了1个


查询结果如下:

2|火星人李四 3|王五 4|火星人 5|水星人


再运行一次,结果:



查询结果如下:

2|火星人李四 3|王五 4|火星人 5|水星人

增加了2个


删除了0个


修改了0个


查询结果如下:

2|火星人李四 3|王五 4|火星人 5|水星人 6|火星人 7|水星人


结果是不错的,这样我们依赖原生态的SQL语言,实现了对student_info表的操作。而且正题语言是比较干净整洁的。但是很没有意思,接下来我们来做个测试。

首先我们测试执行100次查询操作需要多少时间,将测试类修改如下:

import java.sql.*;
public class TestMysql {//测试MysqlHandler类
  public static void main(String[] args)  {
  try {//捕获异常
    long start=System.currentTimeMillis();//产生一个当前的毫秒(自1970年1月1日0时起的毫秒数)
    for(int i=0;i<100;i++){//***此处控制测试次数***
    testOneTime();
    }
    long end=System.currentTimeMillis();
    System.out.println("\n消耗时间:"+(end-start)+"毫秒");
  } catch (SQLException e) {
    e.printStackTrace();
  }
  }
  //测试一次完整查询
  private static void testOneTime()throws SQLException{//可能会有异常,我们在更广阔的天地捕获之
  MysqlHandler hand=new MysqlHandler();
  Connection con=hand.buildConnection();//建立连接
  ResultSet rs;//可以使用多次
  //查
  rs=hand.query("select * from student_info");
  hand.sayGoodbye();//千万别忘了关闭
  }
}

好的,我们运行几次,发现消耗的时间是不固定的,但是大致有个波动范围,这个跟计算机、数据库状态相关,可以理解。


猫哥分别测了几组数据如下:执行一百次:889、856。


如果修改如下,同样执行100次,耗费时间48、48、46。


import java.sql.*;
public class TestMysql {//测试MysqlHandler类
  public static MysqlHandler hand=new MysqlHandler();
  public static Connection con=hand.buildConnection();//建立连接
  public static ResultSet rs;//可以使用多次
  public static void main(String[] args)  {
  try {//捕获异常
    long start=System.currentTimeMillis();//产生一个当前的毫秒(自1970年1月1日0时起的毫秒数)
    for(int i=0;i<1;i++){
    testOneTime();
    }
    hand.sayGoodbye();//千万别忘了关闭
    long end=System.currentTimeMillis();
    System.out.println("\n消耗时间:"+(end-start)+"毫秒");
  } catch (SQLException e) {
    e.printStackTrace();
  }
  }
  //测试一次完整查询
  private static void testOneTime()throws SQLException{//可能会有异常,我们在更广阔的天地捕获之
  //查
  rs=hand.query("select * from student_info");

 OK,快是快了,但是,可以这么用吗,static变量的真正含义是什么,且听下回分解。


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
网络安全 开发工具 数据安全/隐私保护
|
15天前
|
XML 安全 PHP
PHP与SOAP Web服务开发:基础与进阶教程
本文介绍了PHP与SOAP Web服务的基础和进阶知识,涵盖SOAP的基本概念、PHP中的SoapServer和SoapClient类的使用方法,以及服务端和客户端的开发示例。此外,还探讨了安全性、性能优化等高级主题,帮助开发者掌握更高效的Web服务开发技巧。
|
1月前
|
分布式计算 Java 大数据
大数据-147 Apache Kudu 常用 Java API 增删改查
大数据-147 Apache Kudu 常用 Java API 增删改查
28 1
|
2月前
|
存储 JSON API
实战派教程!Python Web开发中RESTful API的设计哲学与实现技巧,一网打尽!
在数字化时代,Web API成为连接前后端及构建复杂应用的关键。RESTful API因简洁直观而广受欢迎。本文通过实战案例,介绍Python Web开发中的RESTful API设计哲学与技巧,包括使用Flask框架构建一个图书管理系统的API,涵盖资源定义、请求响应设计及实现示例。通过准确使用HTTP状态码、版本控制、错误处理及文档化等技巧,帮助你深入理解RESTful API的设计与实现。希望本文能助力你的API设计之旅。
65 3
|
2月前
|
SQL 安全 Go
SQL注入不可怕,XSS也不难防!Python Web安全进阶教程,让你安心做开发!
在Web开发中,安全至关重要,尤其要警惕SQL注入和XSS攻击。SQL注入通过在数据库查询中插入恶意代码来窃取或篡改数据,而XSS攻击则通过注入恶意脚本来窃取用户敏感信息。本文将带你深入了解这两种威胁,并提供Python实战技巧,包括使用参数化查询和ORM框架防御SQL注入,以及利用模板引擎自动转义和内容安全策略(CSP)防范XSS攻击。通过掌握这些方法,你将能够更加自信地应对Web安全挑战,确保应用程序的安全性。
85 3
|
2月前
|
Java API Apache
从零到英雄的蜕变:如何用Apache Wicket打造你的第一个Web应用——不仅是教程,更是编程之旅的启航
【9月更文挑战第4天】学习Apache Wicket这一开源Java Web应用框架是一段激动人心的旅程。本文将指导你通过Maven搭建环境,并创建首个“Hello, World!”应用。从配置`pom.xml`到实现`HelloWorldApplication`类,再到`web.xml`的设置,一步步教你构建与部署简单网页。适合初学者快速上手,体验其简洁API与强大组件化设计的魅力。
62 1
|
3月前
|
Java 容器
07 Java数组与数组操作(定义+遍历+排序+增删改查)(上)
07 Java数组与数组操作(定义+遍历+排序+增删改查)
50 8
|
3月前
|
开发框架 .NET API
在IIS上部署ASP.NET Core Web API和Blazor Wasm详细教程
在IIS上部署ASP.NET Core Web API和Blazor Wasm详细教程
186 3
|
3月前
|
SQL 运维 安全
GitHub爆赞的Web安全防护指南,网络安全零基础入门必备教程!
web安全现在占据了企业信息安全的很大一部分比重,每个企业都有对外发布的很多业务系统,如何保障web业务安全也是一项信息安全的重要内容。 然而Web 安全是一个实践性很强的领域,需要通过大量的练习来建立对漏洞的直观认识,并积累解决问题的经验。 Web安全与防护技术是当前安全界关注的热点,今天给小伙伴们分享的这份手册尝试针对各类漏洞的攻防技术进行体系化整理,从漏洞的原理到整体攻防技术演进过程进行详细讲解,从而形成对漏洞和web安全的体系化的认识。
|
3月前
|
Java
Java数组的2个小案例(杨辉三角分析和商品管理增删改查)
Java数组的2个小案例(杨辉三角分析和商品管理增删改查)
48 4

热门文章

最新文章