javaweb ---JDBC

一、JDBC核心类(接口)介绍
JDBC中的核心类有:DriverManager、Connection、Statement,和ResultSet!
DriverManger(驱动管理器)的作用有两个:

  • 注册驱动:这可以让JDBC知道要使用的是哪个驱动;

  • 获取Connection:如果可以获取到Connection,那么说明已经与数据库连接上了。

Connection对象表示连接,与数据库的通讯都是通过这个对象展开的:

  • Connection最为重要的一个方法就是用来获取Statement对象;

Statement是用来向数据库发送SQL语句的,这样数据库就会执行发送过来的SQL语句:

  • void executeUpdate(String sql):执行更新操作(insert、update、delete等);

  • ResultSet executeQuery(String sql):执行查询操作,数据库在执行查询后会把查询结果,查询结果就是ResultSet;

ResultSet对象表示查询结果集,只有在执行查询操作后才会有结果集的产生。结果集是一个二维的表格,有行有列。操作结果集要学习移动ResultSet内部的“行光标”,以及获取当前行上的每一列上的数据:

  • boolean next():使“行光标”移动到下一行,并返回移动后的行是否存在;
  • XXX getXXX(int col):获取当前行指定列上的值,参数就是列数,列数从1开始,而不是0。
    DriverManager
    其实我们今后只需要会用DriverManager的getConnection()方法即可:
1.  Class.forName(“com.mysql.jdbc.Driver”);//注册驱动
2.  String url = “jdbc:mysql://localhost:3306/mydb1”;
3.  String username = “root”;
4.  String password = “123;
5.  Connection con = DriverManager.getConnection(url, username, password);

注意,上面代码可能出现的两种异常:
- ClassNotFoundException:这个异常是在第1句上出现的,出现这个异常有两个可能:

  • 你没有给出mysql的jar包;

  • 你把类名称打错了,查看类名是不是com.mysql.jdbc.Driver。

SQLException:这个异常出现在第5句,出现这个异常就是三个参数的问题,往往username和password一般不是出错,所以需要认真查看url是否打错。

二、发送SQL增、删、改语句

String sql = “insert into user value(’zhangSan’, ’123’)”;
int m = stmt.executeUpdate(sql);

其中int类型的返回值表示执行这条SQL语句所影响的行数,我们知道,对insert来说,最后只能影响一行,而update和delete可能会影响0~n行。
如果SQL语句执行失败,那么executeUpdate()会抛出一个SQLException。
三、发送SQL查询语句

String sql = “select * from user”;
ResultSet rs = stmt.executeQuery(sql);

请注册,执行查询使用的不是executeUpdate()方法,而是executeQuery()方法。executeQuery()方法返回的是ResultSet,ResultSet封装了查询结果,我们称之为结果集。

四、获取结果集元数据!

  • 得到元数据:rs.getMetaData(),返回值为ResultSetMetaData;

  • 获取结果集列数:int getColumnCount()

  • 获取指定列的列名:String getColumnName(int colIndex)

结果集特性:当使用Connection的createStatement时,已经确定了Statement生成的结果集是什么特性。

  • 是否可滚动
  • 是否敏感
  • 是否可更新

con.createSttement():生成的结果集:不滚动、不敏感、不可更新!
也有带参的,但是我们平常用的为无参的

五、PreparedStatement
它是Statement接口的子接口;
强大之处:

  • 防SQL攻击;
  • 提高代码的可读性、可维护性;
  • 提高效率!

如何得到PreparedStatement对象:

  • 给出SQL模板!
  • 调用Connection的PreparedStatement prepareStatement(String sql模板);
  • 调用pstmt的setXxx()系列方法sql模板中的?赋值!
  • 调用pstmt的executeUpdate()或executeQuery(),但它的方法都没有参数。
        String sql = "SELECT * FROM USERS WHERE USERNAME=? AND PASSWORD=?";
        PreparedStatement pst= con.prepareStatement(sql);
        pst.setString(1,username);
        pst.setString(2, password);
        ResultSet rs = pst.executeQuery();

在使用Connection创建PreparedStatement对象时需要给出一个SQL模板,所谓SQL模板就是有“?”的SQL语句,其中“?”就是参数。
在得到PreparedStatement对象后,调用它的setXXX()方法为“?”赋值,这样就可以得到把模板变成一条完整的SQL语句,然后再调用PreparedStatement对象的executeQuery()方法获取ResultSet对象。
注意PreparedStatement对象独有的executeQuery()方法是没有参数的,而Statement的executeQuery()是需要参数(SQL语句)的。因为在创建PreparedStatement对象时已经让它与一条SQL模板绑定在一起了,所以在调用它的executeQuery()和executeUpdate()方法时就不再需要参数了。
PreparedStatement最大的好处就是在于重复使用同一模板,给予其不同的参数来重复的使用它。这才是真正提高效率的原因。

所以,建议大家在今后的开发中,无论什么情况,都去需要PreparedStatement,而不是使用Statement。

你可能感兴趣的:(java)