zoukankan      html  css  js  c++  java
  • 中阶 d03.5 (正篇)完整的Dao 操作数据库

    1.目录结构:

      util---JDBCUtil.java(工具包,整合建立链接和释放资源的方法)

      dao---UserDao.java(接口,定义方法)

        impl---UserDaoImpl.java(实现方法)

      test---TestUserDaoImpl.java(单元测试,测试 执行具体增删改查的方法)

    2. 代码说明:

    util包和之前一样没变化

    Dao模式其实就是使用接口和实现来操作数据库

    test 里面也不用写具体的方法,直接调用方法

    3. ##Statement安全问题

    1). Statement执行 ,其实是拼接sql语句的。  先拼接sql语句,然后在一起执行。     
       

         String sql = "select * from t_user where username='"+ username +"' and password='"+ password +"'"; UserDao dao = new UserDaoImpl(); dao.login("admin", "100234khsdf88' or '1=1"); SELECT * FROM t_user WHERE username='admin' AND PASSWORD='100234khsdf88' or '1=1' 前面先拼接sql语句, 如果变量里面带有了 数据库的关键字,那么一并认为是关键字。 不认为是普通的字符串。 rs = st.executeQuery(sql);
    2)## PrepareStatement

    > 该对象就是替换前面的statement对象。
    1. 相比较以前的statement, 预先处理给定的sql语句,对其执行语法检查。 在sql语句里面使用 ? 占位符来替代后续要传递进来的变量。 后面进来的变量值,将会被看成是字符串,不会产生任何的关键字。
            

            String sql = "insert into t_user values(null , ? , ?)"; ps = conn.prepareStatement(sql); //给占位符赋值 从左到右数过来,1 代表第一个问号, 永远你是1开始。 ps.setString(1, userName); ps.setString(2, password);

      

    4.最终代码实现

    1. interface中:
     
    void findAll();
    void login(String username , String password);
    void insert(String userName , String password);
    
    
    2.实现方法中:
    /*
    faindAll没变
    login 使用PreparedStatement预先对sql进行处理,解决安全问题(login也属于查询语句)
    查询语句:ResultSet rs = ps.executeQuery();
    增删改:int result = ps.executeUpdate();
    
    最终 所有语句都使用使用PreparedStatement预先对sql进行处理,解决安全问题
    */
         @Override public void findAll() { Connection conn = null; Statement st = null; ResultSet rs = null; try { //1. 获取连接对象 conn = JDBCUtil.getConn(); //2. 创建statement对象 st = conn.createStatement(); String sql = "select * from t_user"; rs = st.executeQuery(sql); while(rs.next()){ String userName = rs.getString("username"); String password = rs.getString("password"); System.out.println(userName+"="+password); } } catch (Exception e) { e.printStackTrace(); }finally { JDBCUtil.release(conn, st, rs); } }
         @Override public void login(String username, String password) { Connection conn = null; Statement st = null; ResultSet rs = null; try { //1. 获取连接对象 conn = JDBCUtil.getConn(); //2. 创建statement对象 String sql = "select * from t_user where username=? and password=?"; //预先对sql语句执行语法的校验, ? 对应的内容,后面不管传递什么进来,都把它看成是字符串。 or select PreparedStatement ps = conn.prepareStatement(sql); //? 对应的索引从 1 开始。 ps.setString(1, username); ps.setString(2, password); rs = ps.executeQuery(); if(rs.next()){ System.out.println("登录成功"); }else{ System.out.println("登录失败"); } } catch (Exception e) { e.printStackTrace(); }finally { JDBCUtil.release(conn, st, rs); } }
         @Override public void insert(String userName, String password) { Connection conn = null; PreparedStatement ps = null; try { conn = JDBCUtil.getConn(); String sql = "insert into t_user values(null , ? , ?)"; ps = conn.prepareStatement(sql); //给占位符赋值 从左到右数过来,1 代表第一个问号, 永远你是1开始。 ps.setString(1, userName); ps.setString(2, password); int result = ps.executeUpdate(); if(result>0){ System.out.println("添加成功"); }else{ System.out.println("添加失败"); } } catch (SQLException e) { e.printStackTrace(); }finally{ JDBCUtil.release(conn, ps); } }

      

  • 相关阅读:
    问题14:如何拆分含有多种分隔符的字符串
    问题15:如何判断字符串a是否以字符串b开头或结尾
    问题16:如何调整字符串中文本的格式
    第三方支付公司之快钱
    js实现回调功能实例
    oracle查看未提交事务
    Tomcat错误之java.lang.OutOfMemoryError:PermGen space解决方案
    oracle错误之未知的命令开头imp忽略了剩余行解决方案
    修改easyui日期控件只显示年月,并且只能选择年月
    数据库三范式大总结
  • 原文地址:https://www.cnblogs.com/longesang/p/11478401.html
Copyright © 2011-2022 走看看