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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 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
相关文章
|
5天前
|
SQL 安全 数据库
惊!Python Web安全黑洞大曝光:SQL注入、XSS、CSRF,你中招了吗?
在数字化时代,Web应用的安全性至关重要。许多Python开发者在追求功能时,常忽视SQL注入、XSS和CSRF等安全威胁。本文将深入剖析这些风险并提供最佳实践:使用参数化查询预防SQL注入;通过HTML转义阻止XSS攻击;在表单中加入CSRF令牌增强安全性。遵循这些方法,可有效提升Web应用的安全防护水平,保护用户数据与隐私。安全需持续关注与改进,每个细节都至关重要。
32 5
|
9天前
|
Java API
Java时间戳教程
本文详细介绍Java中时间戳的处理方法,包括获取当前时间戳、使用`java.time`包、时间戳与日期的相互转换及格式化等。示例代码展示了如何利用`System.currentTimeMillis()`和`java.time.Instant`获取时间戳,以及如何通过`Date`和`ZonedDateTime`进行日期转换和时区处理。随着Java 8引入的`java.time`包,日期时间操作变得更加强大和便捷,推荐在新项目中优先采用。
|
5天前
|
SQL 安全 Go
SQL注入不可怕,XSS也不难防!Python Web安全进阶教程,让你安心做开发!
在Web开发中,安全至关重要,尤其要警惕SQL注入和XSS攻击。SQL注入通过在数据库查询中插入恶意代码来窃取或篡改数据,而XSS攻击则通过注入恶意脚本来窃取用户敏感信息。本文将带你深入了解这两种威胁,并提供Python实战技巧,包括使用参数化查询和ORM框架防御SQL注入,以及利用模板引擎自动转义和内容安全策略(CSP)防范XSS攻击。通过掌握这些方法,你将能够更加自信地应对Web安全挑战,确保应用程序的安全性。
25 3
|
7天前
|
SQL 安全 数据库
深度揭秘:Python Web安全攻防战,SQL注入、XSS、CSRF一网打尽!
在Web开发领域,Python虽强大灵活,却也面临着SQL注入、XSS与CSRF等安全威胁。本文将剖析这些常见攻击手段,并提供示例代码,展示如何利用参数化查询、HTML转义及CSRF令牌等技术构建坚固防线,确保Python Web应用的安全性。安全之路永无止境,唯有不断改进方能应对挑战。
28 5
|
6天前
|
SQL 安全 数据安全/隐私保护
Python Web安全大挑战:面对SQL注入、XSS、CSRF,你准备好了吗?
在构建Python Web应用时,安全性至关重要。本文通过三个真实案例,探讨了如何防范SQL注入、XSS和CSRF攻击。首先,通过参数化查询替代字符串拼接,防止SQL注入;其次,利用HTML转义机制,避免XSS攻击;最后,采用CSRF令牌验证,保护用户免受CSRF攻击。这些策略能显著增强应用的安全性,帮助开发者应对复杂的网络威胁。安全是一个持续的过程,需不断学习新知识以抵御不断变化的威胁。
39 1
|
6天前
|
SQL 安全 数据库
Python Web开发者必看!SQL注入、XSS、CSRF全面解析,守护你的网站安全!
在Python Web开发中,构建安全应用至关重要。本文通过问答形式,详细解析了三种常见Web安全威胁——SQL注入、XSS和CSRF,并提供了实用的防御策略及示例代码。针对SQL注入,建议使用参数化查询;对于XSS,需对输出进行HTML编码;而防范CSRF,则应利用CSRF令牌。通过这些措施,帮助开发者有效提升应用安全性,确保网站稳定运行。
20 1
|
8天前
|
SQL 安全 数据库
深度揭秘:Python Web安全攻防战,SQL注入、XSS、CSRF一网打尽!
在Web开发领域,Python虽强大灵活,但安全挑战不容小觑。本文剖析Python Web应用中的三大安全威胁:SQL注入、XSS及CSRF,并提供防御策略。通过示例代码展示如何利用参数化查询、HTML转义与CSRF令牌构建安全防线,助您打造更安全的应用。安全是一场持久战,需不断改进优化。
21 3
|
15天前
|
SQL 安全 数据库
从入门到精通:Python Web安全守护指南,SQL注入、XSS、CSRF全防御!
【9月更文挑战第13天】在开发Python Web应用时,安全性至关重要。本文通过问答形式,详细介绍如何防范SQL注入、XSS及CSRF等常见威胁。通过使用参数化查询、HTML转义和CSRF令牌等技术,确保应用安全。附带示例代码,帮助读者从入门到精通Python Web安全。
39 6
|
16天前
|
SQL 安全 JavaScript
告别Web安全小白!Python实战指南:抵御SQL注入、XSS、CSRF的秘密武器!
【9月更文挑战第12天】在Web开发中,安全漏洞如同暗礁,尤其对初学者而言,SQL注入、跨站脚本(XSS)和跨站请求伪造(CSRF)是常见挑战。本文通过实战案例,展示如何利用Python应对这些威胁。首先,通过参数化查询防止SQL注入;其次,借助Jinja2模板引擎自动转义机制抵御XSS攻击;最后,使用Flask-WTF库生成和验证CSRF令牌,确保转账功能安全。掌握这些技巧,助你构建更安全的Web应用。
16 5
|
24天前
|
数据采集 Java 数据挖掘
Java IO异常处理:在Web爬虫开发中的实践
Java IO异常处理:在Web爬虫开发中的实践