• 10.06JavaWeb之PreparedStatement进行数据表CRUD练习


    10.06JavaWeb之PreparedStatement进行数据表CRUD练习

    注意的是如何判断操作是否进行成功

    使用executeUpdate()方法

    package JDBCStatementPractice;

    import JDBCStatementCRUD.JDBCUtils;
    import org.testng.annotations.Test;

    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.util.Scanner;

    /**
    * 练习数据库插入操作
    * @since JDK 1.8
    * @date 2021/09/30
    * @author Lucifer
    */
    public class PracticeTestNo1 {

       public static void main(String[] args) {
           PracticeTestNo1 pt = new PracticeTestNo1();
           pt.testInsert();
      }

       @Test
       public void testInsert() {
           Scanner scan = new Scanner(System.in);
           System.out.println("UserName: ");
           String user = scan.next();
           System.out.println("Email: ");
           String email = scan.next();
           System.out.println("Birthday: "); //如果字符串填写的格式是xxxx-xx-xx默认为date格式
           String bt = scan.next();

           //书写sql
           String sql = "insert into customers (name, email, birthday) " +
                   "values (?,?,?);";

           //调用update方法--->接收操作行数进行判断,输出是成功还是失败
            int insertCount = update(sql, user, email, bt);
            if (insertCount > 0) {
                System.out.println("Add Successfully!");
            }else {
                System.out.println("Add Error!");
            }

           //因为update是另外一个方法并且异常已经try...catch了。所以直接打印成功那么无论update方法是否执行成功都会打印该语句,所以不可以这样操作
           //在方法当中通过返回布尔类型的值进行判断
    //       System.out.println();
      }


       /*插入数据库信息*/
       /**
        * 插入数据到数据库中
        * @param sql
        * @param args
        */
       public Integer update(String sql, Object ...args) {
           Connection conn = null;
           PreparedStatement ps = null;
           try {
               //获取数据库连接
               conn = JDBCUtils.getConnection();
               //预编译sql语句
               ps = conn.prepareStatement(sql);
               //填充占位符
               for (int i=0; i< args.length; i++) {
                   ps.setObject(i+1, args[i]);
              }
               //执行语句
               /*
               1、如果是非查询操作返回值不是一个结果集,必然返回false
               2、如果执行的是查询操作,有返回结果。返回的是true
               3、调用executeUpdate方法--->返回的是操作行数是否变化的数量。根据返回数据进行布尔量判断
                */
    //           ps.execute();
               return ps.executeUpdate();
          }catch (Exception e) {
               e.printStackTrace();
          }finally {
               JDBCUtils.closeResource(conn, ps);
          }
           return 0; //方法未执行成功
      }
    }

    简单的添加功能,没有使用数据库连接池等

    package JDBCStatementPractice;

    import JDBCStatementCRUD.JDBCUtils;
    import org.testng.annotations.Test;

    import java.awt.*;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.util.Scanner;

    /**
    * 向表中添加一条记录
    * @since JDK 1.8
    * @date 2021/10/06
    * @author Lucifer
    */
    public class PracticeTestNo2 {

       /*
       需要传的字段
       1、Type
       2、IDCard
       3、ExamCard
       4、StudentName
       5、Location
       6、Grade
        */
       @Test
       public void testInsert() {
           Scanner scan = new Scanner(System.in);
           //进行提示
           System.out.println("CET4/CET6: ");
           int type = scan.nextInt();
           System.out.println("身份证号: ");
           String idCard = scan.next();
           System.out.println("准考证号: ");
           String examCard = scan.next();
           System.out.println("学生姓名: ");
           String studentName = scan.next();
           System.out.println("城市: ");
           String location = scan.next();
           System.out.println("分数: ");
           int grade = scan.nextInt();

           //书写sql
           String sql = "Insert into examstudent(type, IDCard, ExamCard, StudentName, Location, Grade) values (?, ?, ?, ?, ?, ?)";

           //调用通用方法
           int insertCount = update(sql, type, idCard, examCard, studentName, location, grade);
           //判断是否添加成功
           if (insertCount > 0) {
               System.out.println("Add Successfully!");
          }else {
               System.out.println("Add Error!");
          }
      }

       //通用的增删改操作
       /**
        * 插入数据到数据库中
        * @param sql
        * @param args
        */
       public Integer update(String sql, Object ...args) {
           Connection conn = null;
           PreparedStatement ps = null;
           try {
               //获取数据库连接
               conn = JDBCUtils.getConnection();
               //预编译sql语句
               ps = conn.prepareStatement(sql);
               //填充占位符
               for (int i=0; i< args.length; i++) {
                   ps.setObject(i+1, args[i]);
              }
               //执行语句
               /*
               1、如果是非查询操作返回值不是一个结果集,必然返回false
               2、如果执行的是查询操作,有返回结果。返回的是true
               3、调用executeUpdate方法--->返回的是操作行数是否变化的数量。根据返回数据进行布尔量判断
                */
    //           ps.execute();
               return ps.executeUpdate();
          }catch (Exception e) {
               e.printStackTrace();
          }finally {
               JDBCUtils.closeResource(conn, ps);
          }
           return 0; //方法未执行成功
      }
    }

    查询功能

        @Test
       public void queryWithIDCardOrExamCard() {
           System.out.println("请选择类型: ");
           System.out.println("a.准考证号");
           System.out.println("b.身份证号");
           //通过Scan接收输入
           Scanner scan = new Scanner(System.in);
           String selection = scan.next();
           //反过来写,避免空字符串异常
           if ("a".equalsIgnoreCase(selection)) {
               System.out.println("请输入准考证号:");
               String examCard = scan.next();

               //写sql
               String sql = "select flowID as flowIDD, Type as type, IDCard, ExamCard as examCard, StudentName as name, Location as location, grade from examstudent where examCard = ?";

               //调用getInstance方法,指明JavaBean对象
               Student student = getInstance(Student.class, sql, examCard);
               if (student != null) {
                   System.out.println(student); //--->将结果转成json,一种特殊格式的字符串,天然可序列化。再浏览器端再解析json。
              }else {
                   System.out.println("输入有误!");
              }
          }else if ("b".equalsIgnoreCase(selection)) {
               System.out.println("请输入身份证号:");
               String IDCard = scan.next();

               //写sql
               String sql = "select flowID as flowIDD, Type as type, IDCard, ExamCard as examCard, StudentName as name, Location as location, grade from examstudent where IDCard = ?";

               //调用getInstance方法,指明JavaBean对象
               Student student = getInstance(Student.class, sql, IDCard);
               if (student != null) {
                   System.out.println(student); //--->将结果转成json,一种特殊格式的字符串,天然可序列化。再浏览器端再解析json。
              }else {
                   System.out.println("输入有误!");
              }
          }else {
               System.out.println("输入有误,重新进入程序!");
          }
      }

    删除操作

        //删除信息功能,删除指定的学生信息。根据考号进行删除
       @Test
       public void testDeleteByExamCard() {
           System.out.println("请输入考号:");
           Scanner scan = new Scanner(System.in);
           String examCard = scan.next();
           //先查询是否有这个人
           String sql = "select flowID as flowIDD, Type as type, IDCard, ExamCard as examCard, StudentName as name, Location as location, grade from examstudent where examCard = ?";

           Student student = getInstance(Student.class, sql, examCard);

           if (student == null) {
               System.out.println("查无此人,请重新输入!");
          }else {
               //找到了人,调用通用的改的方法
               String sql1 = "delete from examstudent where examCard = ?";
               //可以直接调用这个方法不需要先查询判断
               int delCount = update(sql1, examCard);
               if (delCount > 0) {
                   System.out.println("删除成功!");
              }else {
                   System.out.println("删除失败!");
              }
          }
      }
       
       @Test
       public void testDeleteByExamCard1() {
           System.out.println("请输入考号:");
           Scanner scan = new Scanner(System.in);
           String examCard = scan.next();
           
           //直接调用删除方法
           String sql = "delete from examstudent where examCard = ?";
           int delCount = update(sql, examCard);
           if (delCount > 0) {
               System.out.println("删除成功!");
          }else {
               System.out.println("查无此人,请重新输入!");
          }
      }

    CRUD中的DDL操作

    概念:

    创建和管理表的操作称为DDL操作,DDL是一种语法,专门用于数据库管理的语言。

    为什么PreparedStatement可以防止SQL注入?

    • PreparedStatement有预编译的过程,该过程通过占位符操作

    • 占位符是流的形式去操作占位符。所以安全

    It's a lonely road!!!
  • 相关阅读:
    Linux c 获取cpu使用率(2)
    Linux c codeblock的使用(四):创建自己的静态函数库
    Linux c codeblock的使用(三):使用函数库
    Linux c codeblock的使用(二):在工程中编译多个文件
    Linux c codeblock的使用(一):新建一个工程
    关于warning: suggest parentheses around assignment used as truth value [-Wparentheses]|的解决方法
    Linux c使用gumbo库解析页面表单信息(三)
    Linux c获取任意路径的硬盘使用情况
    Linux c使用gumbo库解析页面表单信息(二)
    Linux c使用gumbo库解析页面表单信息(一)
  • 原文地址:https://www.cnblogs.com/JunkingBoy/p/15399212.html
Copyright © 2020-2023  润新知