9.23JavaWeb之JDBC进行CRUD操作

9.23JavaWeb之JDBC进行CRUD操作

使用PreparedStatement实现

数据库连接的本质:

  • 一个Socket连接,用于对数据库发出指令接收响应的

java.sql包当中定义了3种对数据库的调用方式:

  • Statement:执行静态SQL语句,返回生成结果的对象

  • PrepatedStatement:SQL语句被预编译并存储在此对象中,可以使用此对象多次高效地执行该语句(Connection是接口,PrepatedStatement是子接口)--->实际开发过程当中用的都是这个

  • CallableStatement:执行SQL存储

具体地实现如图:

 

整体地CRUD过程

  • 获取连接--->Connection

  • 创建Statement对象

  • 让Statement对象去执行SQL语句

模拟登录判断是否存在用户的操作

登录类:

    @Test
   public void testLogin(){
       //获取控制台内容
//       Scanner scanner = new Scanner(System.in);
//       System.out.println("username:");
       //获取用户名
//       String user = scanner.next();
       String user = "Jun";

//       System.out.println("password:");
//       String password = scanner.next();
       String password = "JunkingBoy";

       //把用户名和密码写到sql语句里面--->调用get方法
       /*
       1、String的sql语句
       2、验证登录成功或者失败,返回一个对象进行比较
        */

       //提供一个sql语句
       String sql = "select `name`, `password` from users where Name = '" + user + "' and Password = '" + password +"'";
       /*
       上诉的写法称为拼串,需要拼写sql语句。--->不是一个完整的sql语句,存在sql注入的风险
        */

       User returnUser = get(sql, User.class);

       if (returnUser!=null){
           System.out.println("Successfully!");
      }else {
           System.out.println("UserName or PassWord Error!!!");
      }
  }

创建驱动类:

    //这个get是Statement当中的方法
   public <T> T get(String sql, Class<T> clazz) {
       T t = null;

       //创建连接
       Connection conn = null;
       Statement st = null;
       ResultSet rs = null;
       //进行数据库连接事务
       try {
           //加载配置文件--->使用类加载机制获取到配置文件
           InputStream is = Statement.class.getClassLoader().getResourceAsStream("Localhost.properties");
           //创建Properties对象引用
           Properties prop = new Properties();
           //加载流文件
           prop.load(is);

           //读取配置文件
           String driverClass = prop.getProperty("DRIVER");
           String url = prop.getProperty("URL");
           String userName = prop.getProperty("USERNAME");
           String password = prop.getProperty("PASSWORD");

           //加载数据库驱动
           Class.forName(driverClass);

           //获取连接
           /*mysql驱动连接*/
           conn = DriverManager.getConnection(url, userName, password);

           /*创建statement对象*/
           st = conn.createStatement();

           /*创建结果集对象*/
           rs = st.executeQuery(sql);

           //获取结果元数据
           ResultSetMetaData rsmd = rs.getMetaData();

           //获取结果集列数
           int columnCount = rsmd.getColumnCount();

           //判断--->如果有下一列,再次创建事务去读取
           if (rs.next()){
               t = clazz.newInstance();
               //循环获取列名
               for (int i = 0; i < columnCount; i++){
                   //获取列名
                   String columnName = rsmd.getColumnLabel(i+1);

                   //根据列名获取对应的数据
                   Object columnValue = rs.getObject(columnName);

                   //将数据表中得到的数据封装进入对象当中
                   Field field = clazz.getDeclaredField(columnName);
                   field.setAccessible(true);
                   field.set(t, columnValue);
              }
               return t;
          }
      }catch (Exception e){
           e.printStackTrace();
      }finally {
           //关闭资源
           if (rs!=null){
               try {
                   rs.close();
              }catch (SQLException e){
                   e.printStackTrace();
              }
          }
           if (st!=null){
               try {
                   st.close();
              }catch (SQLException e){
                   e.printStackTrace();
              }
          }
           if (conn!=null){
               try {
                   conn.close();
              }catch (SQLException e){
                   e.printStackTrace();
              }
          }
      }
       return null;
  }

 

It's a lonely road!!!
原文地址:https://www.cnblogs.com/JunkingBoy/p/15325587.html