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:\n");
       String user = scan.next();
       System.out.println("Email:\n");
       String email = scan.next();
       System.out.println("Birthday:\n"); //如果字符串填写的格式是xxxx-xx-xx默认为date格式
       String bt = scan.next();

       //书写sql
       String sql = "insert into customers (name, email, birthday)\n" +
               "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:\n");
       int type = scan.nextInt();
       System.out.println("身份证号:\n");
       String idCard = scan.next();
       System.out.println("准考证号:\n");
       String examCard = scan.next();
       System.out.println("学生姓名:\n");
       String studentName = scan.next();
       System.out.println("城市:\n");
       String location = scan.next();
       System.out.println("分数:\n");
       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("请选择类型:\n");
       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有预编译的过程,该过程通过占位符操作

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

posted @ 2021-10-12 19:11  俊king  阅读(77)  评论(0编辑  收藏  举报