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); } }
原文地址:https://www.cnblogs.com/longesang/p/11478401.html
时间: 2024-11-10 05:16:12