传知_3_jdbc

来源:互联网 发布:unity3d 3dsmax 编辑:程序博客网 时间:2024/06/04 19:22

JDBC编程的核心API

 

DriverManager 获取数据库连接

Connection 代表与数据库之间的连接,作用是创建StatementPreparedStatement

Statement/PreparedStatement 执行SQL

 

管理结果集 

===可更新的结果集===DEMO

前面我们查询出来的结果集,仅仅只是对数据进行了读,

但实际上我们还可以对结果集进行更新。

 

如果是读取ResultSet的内容,getXxx(列名 | 列索引)

如果是更新ResultSet的内容,updateXxx(列名 | 列索引 , newVal)

 

绝大部分情况下,我们还是应该考虑使用update语句来更新数据,

但在某些情况下,可以采用这种可更新的结果集,对查询出来的数据进行更新。

rs.updateRow();

 

 

 

 

JDBC编程步骤:

1 加载驱动。

2 。建立和指定数据库之间的连接。

    DriverManager.getConnection(url , user , pass);

3 。创建Statement准备执行SQL语句。

4 。使用Statement执行SQL语句。

      ResultSet  executeQuery  只能执行select。它返回查询的结果集,ResultSet

      Int executeUpdate  只执行DMLDDL。如果执行DDL,总是返回0;如果指定DML,返回受影响的记录条数

      boolean  execute  可以执行所有的SQL语句。   DEMO

5 。得到执行结果。

6 。关闭物理资源。

 

 

以后我们用JDBC时,一般不用Statement,总是用PreparedStatement.

 

不管是Statement,还是PreparedStatement,它们执行SQL语句总有3个方法:

ResultSet executeQuery(select语句)

int executeUpdate(DDL/DML)

boolean execute(任意SQL语句):该方法的返回值代表sql语句执行完成后,是否有结果集。

 

 

 

setString

updateString

 

 

 

 

方法executeQuery
      
用于产生单个结果集的语句,例如 SELECT 语句。 被使用最多的执行 SQL 语句的方法是 executeQuery。这个方法被用来执行 SELECT 语句,它几乎是使用最多的 SQL 语句。

      
方法executeUpdate
      
用于执行 INSERTUPDATE DELETE 语句以及 SQL DDL(数据定义语言)语句,例如 CREATE TABLE DROP TABLEINSERTUPDATE DELETE 语句的效果是修改表中零行或多行中的一列或多列。executeUpdate 的返回值是一个整数,指示受影响的行数(即更新计数)。对于 CREATE TABLE DROP TABLE 等不操作行的语句,executeUpdate 的返回值总为零。

      
使用executeUpdate方法是因为在 createTableCoffees 中的 SQL 语句是 DDL (数据定义语言)语句。创建表,改变表,删除表都是 DDL 语句的例子,要用 executeUpdate 方法来执行。你也可以从它的名字里看出,方法 executeUpdate 也被用于执行更新表 SQL 语句。实际上,相对于创建表来说,executeUpdate 用于更新表的时间更多,因为表只需要创建一次,但经常被更新。

 

方法execute
      
用于执行返回多个结果集、多个更新计数或二者组合的语句。因为多数程序员不会需要该高级功能

       execute
方法应该仅在语句能返回多个ResultSet对象、多个更新计数或ResultSet对象与更新计数的组合时使用。当执行某个已存储过程或动态执行未知 SQL 字符串(即应用程序程序员在编译时未知)时,有可能出现多个结果的情况,尽管这种情况很少见。
      
因为方法 execute 处理非常规情况,所以获取其结果需要一些特殊处理并不足为怪。例如,假定已知某个过程返回两个结果集,则在使用方法 execute 执行该过程后,必须调用方法 getResultSet 获得第一个结果集,然后调用适当的 getXXX 方法获取其中的值。要获得第二个结果集,需要先调用 getMoreResults 方法,然后再调用 getResultSet 方法。如果已知某个过程返回两个更新计数,则首先调用方法 getUpdateCount,然后调用 getMoreResults,并再次调用 getUpdateCount
      
对于不知道返回内容,则情况更为复杂。如果结果是 ResultSet 对象,则方法 execute 返回 true;如果结果是 Java int,则返回 false。如果返回 int,则意味着结果是更新计数或执行的语句是 DDL 命令。在调用方法 execute 之后要做的第一件事情是调用 getResultSet getUpdateCount。调用方法 getResultSet 可以获得两个或多个 ResultSet 对象中第一个对象;或调用方法 getUpdateCount 可以获得两个或多个更新计数中第一个更新计数的内容。
      
SQL 语句的结果不是结果集时,则方法 getResultSet 将返回 null。这可能意味着结果是一个更新计数或没有其它结果。在这种情况下,判断 null 真正含义的唯一方法是调用方法 getUpdateCount,它将返回一个整数。这个整数为调用语句所影响的行数;如果为 -1 则表示结果是结果集或没有结果。如果方法 getResultSet 已返回 null(表示结果不是 ResultSet 对象),则返回值 -1 表示没有其它结果。也就是说,当下列条件为真时表示没有结果(或没有其它结果):
((stmt.getResultSet() == null) && (stmt.getUpdateCount() == -1))

      
如果已经调用方法 getResultSet 并处理了它返回的 ResultSet 对象,则有必要调用方法 getMoreResults 以确定是否有其它结果集或更新计数。如果 getMoreResults 返回 true,则需要再次调用 getResultSet 来检索下一个结果集。如上所述,如果 getResultSet 返回 null,则需要调用 getUpdateCount 来检查 null 是表示结果为更新计数还是表示没有其它结果。

      
getMoreResults 返回 false 时,它表示该 SQL 语句返回一个更新计数或没有其它结果。因此需要调用方法 getUpdateCount 来检查它是哪一种情况。在这种情况下,当下列条件为真时表示没有其它结果:

((stmt.getMoreResults() == false) && (stmt.getUpdateCount() == -1))

 

 

 

 

JDBC核心API

 

DriverManager.getConnection

Connection  代表和数据库之间的连接。

Statement 用于执行SQL语句。       DEMO 

      

PreparedStatement  它可以代替Statement

      

CallableStatement  它是用于执行存储过程的。

 

PreparedStatementStatement只有好处,基本上没什么坏处:

1. 无需拼接SQL语句,编程更简单。

2. 它可以预编译SQL语句,性能更好。

3. 它可以防止SQL注入,安全性更好。

 

编程上的区别

a. 创建PreparedStatement时传入带占位符的SQL语句。

b. 需要调用PreparedStatementsetXxx()方法为SQL语句中占位符设置参数值。

c. 执行executeQuery()executeUpdate()时无需参数。

 

 

 

 

ResultSetMetaData      demo

 

 

JDBC事务    DEMO

conn.setAutoCommit(false);

conn.commit();

conn.rollback();

 

 

事务特点:

原子性:事务是不可再分的

一致性:

隔离性:当事务处天中间时,其他事务无法查看事务的中间状态

持久性:事务结束后,对数据库操作将会持久地保存在物理存储器上

 

提交 commit

自动提交       当执行DDL/DCL,或程序正常退出

手动提交       commit

回滚 rollback

自动       系统出现错误,异常退出

手动       rollback  

 

 

Mysql默认是关闭事务的    set autocommit = 0 ;

Jdbc默认也是关闭事务的   Connection对象.setAutoCommit(false);

 

 

设置中间点   

savepoint

Rollback to     

 

 

 

DatabaseMetabase      

RusultsetMetaData     

 

DatabaseMetabase dbmd = conn.getMetadata();

Dbmd.get......

Dbmd.getRables(null,”javaee”,”%”,null[X1] ) 

getColumne    分析指定数据表所包含的列

 

 

配置数据源:

数据源又是建立在连接池的基础上的

使用连接池:

       几乎所有的商业服务器都自带有连接池实现

       除此之外,还有两个开源的

              C3p0jar

              jar

      

JDBC的数据库连接池使用javax.sql.DataSource来表示

DataSource是一个接口此接口通常由商用服务器(如WebLogic,WebSphere)等提供实现,也有一些开源组织提供实现(如DBCP,C3P0等)

      

使用DBCP来获得数据库连接的方式:  DEMO   tomcat默认使用这种

(

Commons-dacp.jar  连接池的实现

Commons-pool.jar  连接池实现的依赖库

)

 

相比之下,C3P0数据源性能更胜一筹,Hibernate就推荐使用此连接池。C3p0连接池不仅可以自动清理不再使用的Connection还可以自动清理StatementResultSetC3P0连接池需要版本为1.3以上的JRE,推荐使用1.4以上的JRE

通过C3P0连接池获得数据库连接:  DEMO

 

还有一种就是在web容器里配置数据源  xml DEMO   jsp DEMO

sql 驱动拷贝到tomcat lib目录下

在容器中配置数据源:-JDBC DataSourcesJDBC DataSourcesJDBC DataSources MySql DBCP example -----Context configuration文档

conf---calana--- catDs.xml

再次访问tomcat,此web应用就可以通过此JNDI名字来访问此数据源 DEMO

 

这里配置使用全局数据源需要修改tomcat原有的server.xml文件,所以可能导致 破坏tomcat系统,因尽量避免使用全局数据源

 

 

    根据用户等级:控制菜单的显示。<s:if test="#session.user.level> 1 && #session.user.level!=2"><a href="aa">记件工资管理</a></s:if>

         需要放入session中跟踪的用户状态。

 

     UserInfo implements  java.io.Serializable    //要序列化

     (

         int id

        String empName

        int level

     )

 

         Session的状态到底保存在哪里?

                   1. 肯定在服务端。

                   2. 服务器端为了记录各客户的状态,服务器端要为每个客户分配一个唯一标识。

                   3. Session状态保存在服务器的哪里?内存?还是磁盘?

                开始在内存。当信息大时,Session状态会存入磁盘。

    2. 用容器管理的数据源

         以前教的做法(Struts 1也这么干):应用启动时创建DataSource对象,并放入application中。

         访问数据源时,必须先获取ServletContext对象。

 

     

         Tomcat下部署Web应用最常用的方式:

            a. Web应用复制到Tomcatwebapps

            b. conf/Catalina/localhost添加一个配置文件。

            c. 修改conf/server.xml

             

 

 

 

DBUtil类,工具类

       Commons-dbutils  把包加入classpath里,如果用ide工具的,就build path进去

       QueryRunner

       ResultSetHandler<T>  作用是把结果集转换成指定的对象

       提供了大量的实现类,其中电常用的是BeanListHandler

           作用是将查询得到的结果集的第行封闭成了个javaBean

       RowProcessor 作用是把resultset一行封闭成javaBean

 

在严格的java应用里,持久层APIapplication program interface)不应该扩散到业务逻辑层

JDBC API

Hibernate API

JPA  API

这种API不应该传到业务逻辑层

 


%sql里的通配符

原创粉丝点击