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

简介: 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变量的真正含义是什么,且听下回分解。


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
SQL Java 数据库连接
Java中实现SQL分页的方法
无论何种情况,选择适合自己的,理解了背后的工作原理,并能根据实际需求灵活变通的方式才是最重要的。
409 9
|
SQL NoSQL Java
Java使用sql查询mongodb
通过MongoDB Atlas Data Lake或Apache Drill,可以在Java中使用SQL语法查询MongoDB数据。这两种方法都需要适当的配置和依赖库的支持。希望本文提供的示例和说明能够帮助开发者实现这一目标。
793 17
|
SQL Java 数据库连接
如何在 Java 代码中使用 JSqlParser 解析复杂的 SQL 语句?
大家好,我是 V 哥。JSqlParser 是一个用于解析 SQL 语句的 Java 库,可将 SQL 解析为 Java 对象树,支持多种 SQL 类型(如 `SELECT`、`INSERT` 等)。它适用于 SQL 分析、修改、生成和验证等场景。通过 Maven 或 Gradle 安装后,可以方便地在 Java 代码中使用。
5343 11
|
SQL Java 数据库连接
【潜意识Java】MyBatis中的动态SQL灵活、高效的数据库查询以及深度总结
本文详细介绍了MyBatis中的动态SQL功能,涵盖其背景、应用场景及实现方式。
2215 6
|
SQL Java 数据库连接
如何用 Java 校验 SQL 语句的合法性?
本文介绍了五种校验 SQL 语句合法性的方案:1) 使用 JDBC API 的 `execute()` 方法,通过捕获异常判断合法性;2) 使用 JSqlParser 库解析 SQL 语句为 Java 对象;3) 使用正则表达式检查 SQL 语句格式;4) 使用 ANTLR 生成 SQL 解析器;5) 使用 Apache Calcite 解析 SQL。每种方法各有优劣,具体选择取决于需求和个人偏好。需要注意的是,这些方法仅能校验语法合法性,无法保证语义正确性,仍需防范 SQL 注入攻击。
992 6
|
SQL NoSQL Java
Java使用sql查询mongodb
通过使用 MongoDB Connector for BI 和 JDBC,开发者可以在 Java 中使用 SQL 语法查询 MongoDB 数据库。这种方法对于熟悉 SQL 的团队非常有帮助,能够快速实现对 MongoDB 数据的操作。同时,也需要注意到这种方法的性能和功能限制,根据具体应用场景进行选择和优化。
788 9
|
SQL Java
使用java在未知表字段情况下通过sql查询信息
使用java在未知表字段情况下通过sql查询信息
418 8
|
SQL 安全 前端开发
Web学习_SQL注入_联合查询注入
联合查询注入是一种强大的SQL注入攻击方式,攻击者可以通过 `UNION`语句合并多个查询的结果,从而获取敏感信息。防御SQL注入需要多层次的措施,包括使用预处理语句和参数化查询、输入验证和过滤、最小权限原则、隐藏错误信息以及使用Web应用防火墙。通过这些措施,可以有效地提高Web应用程序的安全性,防止SQL注入攻击。
1118 2
|
SQL 分布式计算 Java
Hadoop-11-MapReduce JOIN 操作的Java实现 Driver Mapper Reducer具体实现逻辑 模拟SQL进行联表操作
Hadoop-11-MapReduce JOIN 操作的Java实现 Driver Mapper Reducer具体实现逻辑 模拟SQL进行联表操作
474 3
Web for Pentester SQL sql注入靶场
Web for Pentester SQL sql注入靶场