DriverManager
现在JDBC的驱动都是靠DriverMannager来加载进去的,利用的是跟反射有关的东西,这里不必了解。本来我们是需要用forNname进行反射加载,然后直接会运行mysql驱动类内部的一个静态代码块,这个代码块会调用注册驱动,也就是下面这个方法↓,不过最新版本的JDBC可以自动加载。
1 | // 静态同步方法:注册数据库驱动 |
数据库连接对象Connection
Connection其实就像是数据库本身一样,然后我们可以根据它来调用很多方法,首先我们来看如何连接数据库:
1 | //1. 通过DriverManager来获得数据库连接 |
数据库执行命令Statement
我们其实是在借用Statement这个载体来调用mysql语句的。而我们来看下如何执行语句。
- executeQuery():执行select语句,存放在ResultSet中,用set.next来进行查数据
- executeUpdate():执行更新删除语句,会返回一个int,表示受影响行数
- excute():执行任何SQL语句,返回一个boolean来表示执行结果是ResultSet还是一个int。我可以使用getResultSet()或者getUpdateCount()来执行。
批量执行处理操作Batch
1 | public static void main(String[] args) throws ClassNotFoundException { |
将查询结果映射为对象
1 | public class Student { |
来进行转换:
1 | while (set.next()){ |
列的下标是从1开始的
SQL注入攻击
我们现在来写一个登录代码:
1 | select * from user where username='Test' and pwd='1111' or 1=1; -- ' |
因为1=1一定是true,所以会出现这样的问题。name有没有什么办法可以让后面从Test开始都被单引号括住呢?有的有的,就是下面这个↓
使用PreparedStatement防范SQL注入攻击
1 | public static void main(String[] args) throws ClassNotFoundException { |
提前给到PrepareStatement一个SQL语句,并且使用?作为占位符,然后来填充进去,哪怕有'也会被当做符号而不是关键字。
管理事务
1 | con.setAutoCommit(); //关闭自动提交后相当于开启事务。 |
一旦关闭自动提交,那么现在执行的所有操作必须在最后进行commit()来提交事务,提交后操作才会保存。
1 | public static void main(String[] args) throws ClassNotFoundException { |
也可以使用rollback()来手动回滚之前的全部操作:
1 | public static void main(String[] args) throws ClassNotFoundException { |
我们还可以创建一个回滚点来实现定点回滚:
1 | public static void main(String[] args) throws ClassNotFoundException { |
还有一点我们需要知道,如果我们没有自动提交,但是已经写了几个执行语句,此刻再开启自动提交会提交里面的执行语句:
1 | public static void main(String[] args) throws ClassNotFoundException { |
说些什么吧!