sql语句的进化--原始篇
1.JDBC
1)JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问。
2)它由一组用Java语言编写的类和接口组成,是一个独立于特定数据库管理系统、通用的sql数据库存储和操作的公共接口。
3)JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。
2.JDBC常用(重要)类/接口
1)java.sql.Driver接口:
该接口是所有JDBC驱动程序需要实现的接口,这个接口是提供给数据库厂商使用的,不同的数据库厂商提供不同的实现。
注:在程序中不需要直接去访问实现了Driver接口的类,而是驱动程序管理器类去调用这些Driver实现.
2)DriverManager类:
用来创建连接,它本身就是一个创建Connection的工厂,设计的时候使用的就是Factory模式,这个接口也是提供给数据库厂商使用的,各数据库厂商需要实现它。
3)Connection接口
根据提供的不同驱动产生不同的连接。
4)Statement接口
用来发送SQL语句
5)Resultset接口
用来接收查询语句返回的查询结果
3.JDBC应用步骤
1)注册加载一个驱动
2)创建数据库连接(Connection)
3)创建statement,发送sql语句
4)执行sql语句
5)处理sql结果
6)关闭statement和connection
4.访问数据库
在java.sql包中有3个接口分别定义了对数据库的调用的不同方式:
1)statement
1 创建Statement对象 2 Statement sm=conn.createStatement(); 3 4 执行数据查询语句(select) 5 sm.executeQuery(sql); 6 7 执行数据更新语句(delete、update、insert、drop等) 8 sm.executeUpdate(sql);
2)prepatedStatement
1 创建PreparedStatement对象 2 String sql="INSERT INTO user (id,name) VALUES (?,?)"; 3 PreparedStatement ps=conn.prepareStatement(sql); 4 ps.setInt(1,1); 5 ps.setString(2,"admin"); 6 7 执行数据查询语句 8 ResultSet rs=ps.executeQuery(); 9 10 执行数据更新语句 11 int c=ps.executeUpdate();
PreparedStatement与Statement比较
- 使用PreparedStatement,代码的可读性和可维护性比Statement高
- Statement不安全,PreparedStatement比较安全,能有效解决Sql注入的问题。
- PreparedStatement能最大可能提高性能。
DBServer会对预编译语句提供性能优化。因为预编译语句有可能被重复调用,所以语句在被DBServer的编译器编译后的执行代码被缓存下来,那么下次调用时只要是相同的预编译语句就不需要编译,只要将参数直接传入编译过的语句执行代码中就会得到执行。 在statement语句中,即使是相同操作但因为数据内容不一样,所以整个语句本身不能匹配,没有缓存语句的意义。事实是没有数据库会对普通语句编译后的执行代码缓存。这样每执行一次都要对传入的语句编译一次。
3)CallableStatement
当不直接使用SQL语句,而是调用数据库中的存储过程时,要用到Callable Statement.
CallableStatement从PreparedStatement继承。
创建CallableStatement对象 String sql="{call insert_users(?,?)}";
调用存储过程 CallableStatement st=conn.prepareCall(sql); st.setInt(1,1); st.setString(2,"admin"); 执行 st.execute();
5.处理执行结果
查询语句,返回记录集ResultSet
更新语句,返回数字,表示该更新影响的记录数。
ResultSet对象以逻辑表格的形式封装了执行数据库操作的结果集,ResultSet接口由数据库厂商实现。
ResultSet对象维护了一个指向当前数据行的游标,初始的时候,游标在第一行之前,可以通过ResultSet对象的next()方法移动到下一行。
ResultSet接口常用的方法:
next():将游标往后移动一行,如果成功返回true;否则返回false。
getXXX(String name):返回当前游标下某个字段的值。
6.JDBC事务处理
在JDBC中,事务默认是自动提交的,每次执行一个SQL语句时,如果执行成功,就会向数据库自己提交,而不能回滚。
1 #取消自动提交事务: 2 conn.setAutoCommit(false); 3 #在所有的SQL语句都成功执行之后,调用commit()方法提交事务 4 conn.commit(); 5 #在出现异常时,调用rollback()方法回滚事务,一般再在catch模块中执行回滚操作 6 conn.rollback();
注:可以通过Connection的getAutoCommit()方法来获得当前事务的提交方式。