JDBC学习笔记-02
若使用
Statement st = conn.createStatement();
#则会有sql注入的问题
由图可见,即使输入的密码不对,程序仍然识别为正确
此时就是 恶意地对sql语句注入使其跳过验证,直接登录
为了避免出现这种情况,我们使用
String sql ="insert into users values (?,?,?)";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1,u.getId());
ps.setString(2,u.getUsername());
ps.setString(3,u.getPassword());
使用? 作为占位符,而后调用PreparedStatement 的方法手动添加参数
数字是第几个问号,后边是传入的参数,使用此方法可避免sql注入问题
所以,jdbc的流程改为
1.加载驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
2.获得链接
Connection conn = DriverManager.getConnection(
"jdbc:oracle:thin:@localhost:1521:orcl","ltw","ltw");
3.编写sql
String sql ="insert into users values (?,?,?)";
4.创建预处理语句的对象
PreparedStatement ps = conn.prepareStatement(sql);
5.给sql语句的占位符填入参数
ps.setString(1,u.getId());
ps.setString(2,u.getUsername());
ps.setString(3,u.getPassword());
6.执行语句
int a = ps.executeQuery();
# 执行后会返回结果,1或0
7.关闭资源
# 此处使用封装好的工具类
# 若为查询操作,则会返回一个结果集,需要用ResultSet接收
# 此处为插入,所以传入null即可
JDBCUtil.closeAll(null, ps, conn);
关于项目的一些规范
src目录下有多个固定名称的package,用于规范文件
model包
根据数据库表创建对应的实体类
类名对应表名
属性对应表的字段名
属性数据类型对应字段的数据类型
将这些类统一放到此包下,认为是数据模型
dao包
DAO
Database Access Object 数据库访问对象
对于每张表都有相应的增删改查操作
这些操作方法统一地放到一个类中,该类一般命名为***Dao, 如StudentDao\UserDao
这些封装好的操作类,一般都放在此包下,包的命名为dao