第一章:JDBC操作数据库
JDBC: Java数据库连接技术(Java DataBase Connectivity),能实现Java程序对各种数据库的访问。
JDBC是一个java提供连接数据库的API,我们可以通过JDBC连接和操作数据库数据。
1. JDBC连接数据库的步骤:
- Class.forName() : 加载驱动
- 使用DriverManager获取Connection连接
- 创建Sql语句
- 返回查询结果
- 释放资源
示例:
//Class.forName() : 加载驱动
Class.forName("com.mysql.jdbc.Driver");
//使用DriverManager获取Connection连接
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mysql","root","root");
//创建statement对象
Statement stat = conn.createStatement();
//创建Sql语句
String sql="select * from student";
//返回查询结果
ResultSet rs =stat.executeQuery(sql);
//遍历取值
while(rs.next()) {
System.out.println(rs.getInt("StudentNo")+"\t"+rs.getString("StudentName"));
}
//释放资源
stat.close();
conn.close
2. JDBC防止SQL注入问题
- SQL注入: Sql 注入攻击是通过将恶意的 Sql 查询或添加语句插入到应用的输入参数中,再在后台 Sql 服务器上解析执行进行的攻击,它目前黑客对数据库进行攻击的最常用手段之一。
SQL注入发生的原因:我们在第三步写SQL语句的时候,我们使用的参数都是拼接的,并且他会做为SQL代码去执行,也就是用户输入的信息,我们是直接拼接到代码块上的,这样就可以通过这个漏洞来成功验证。
例如:
我们需要用户输入学号和名字来验证:
- String sql=“select * from student where StudentNo =”+2+" and StudentName=‘“+“测试触发器”+”’";
SQL注入问题就是用户输入的信息,我们直接当成源代码执行了,也就是说当用户输入null||1=1,这种恒等式的时候,我们的筛选条件将会失效。
- String sql=“select * from student where StudentNo =”+“null||1=1”+" and StudentName=‘“+“测试触发器”+”’";
因为我们是直接拼接字符串,所以很多敲过代码的有可能通过这个去直接登录进去,这导致我们的账号的不安全的,同时系统也存在这种的SQL注入问题,那么我们就要使用占位符的方式去解决,而不是拼接字符串。
3. preparedStatement解决SQL注入问题
Statement与PreparedStatement区别:
Statement由方法createStatement()创建,该对象用于发送简单的SQL语句
PreparedStatement由方法prepareStatement()创建,该对象用于发送带有一个或者多个输入参数的SQL语句
- SQL语句使用“?”作为数据占位符
- 使用setXxx()方法设置数据
PreparedStatement-----预编译
效率、性能、开销
安全性
代码可读性
preparedStatement和Statement的使用几乎一致,请看下面示例:
//PreparedStatement可替换变量(在SQL语句中可以包含?)
String sql = "select * from user where id=?";
PreparedStatement ps = conn.prepareStatement(sql);
int id = 1001;
ps.setInt(1,id);
ResultSet rs = ps.executeQuery();
/**==================华丽丽滴分割线====================*/
//Statement用法
int id = 1001;
String sql = "select * from user where id="+id;
Statement stmt = conn.CreateStatement();
ResultSet rs = stmt.executeQuery(sql);
- 我们在需要使用参数的地方用
?
号占位,然后使用setXxx()方法通过下标去设置参数,下标从1开始。- setXxx()方法set后面的是要设置参数的类型,首字母大写。
- 获取的时候我们用conn连接对象的
prepareStatement
方法获取,注意这里的prepare不加d
然后返回一个preparedStatement
对象(这里是prepared,加d
)。- 调用查询方法时,我们一般使用
executeQuery()
,增删改的时候我们用executeUpdate()。
我们使用prepareStatement就可以解决SQL注入问题了。
4. 总结
JDBC优点:
- 不必为不同的数据库专门编写不同的程序,而只需要加载不同的数据库驱动即可
JDBC的编程步骤:
- Class.forName()加载驱动
- DriverManager.getConnection(URL,用户名,密码)获得数据库连接
- 获得Statement/PreparedStatement对象,执行SQL语句
- 处理执行结果,释放资源