>>JDBC : java Database Connectivity:java访问数据库的解决方案
>>JDBC接口及数据库厂商实现
<1>驱动管理:DriverManager
<2>连接接口:Connection、DatabaseMetaData
<3>语句对象接口:Satement、PreparedStatement、CallableStatement
<4>结果集接口:ResultSet、ResultSetMetaData
>>>>>>>>>>>>>>>>>>>>>1.JDBC工作过程<<<<<<<<<<<<<<<<<
>>加载驱动,建立连接、创建语句对象、执行SQL语句、处理结果集、关闭连接
1.驱动类加载:
<1>oracle: Class.forName("oracle.jdbc.driver.OracleDriver");
<2>mysql : Class.forName("com.mysql.jdbc.Driver");
2.连接数据库:Connection接口
--Connection conn = DriverManager.getConnection(
"jdbc:oracle:thin:@地址:接口:数据库名","username","password");
◆注1:Connection只是接口!真正实现是由厂商提供的驱动包完成的。
◆注2:事务的控制,使用接口Connection。
3.Statement接口及其子接口PreparedStatement
--Satement smt = conn.createStatement();
--PreparedStatement smt = conn.prepareStatement(sql);
--方法:
--smt.execute();
--smt.executeQuery();
--smt.executeUpdate();
4.结果集:ResultSet() (迭代器)
--ResultSet rs = smt.executeQuery();
--ResultSet对象的最初位置在行首(未指向数据)
--方法:
--rs.next() 移动到下一行,没有数据返回NULL
--rs.get类型(列索引)
--rs.get类型(列名)
◆例:rs.getString("id")
>>>>>>>>>>>>>>>>>>>>>2.连接池:(Apache DBCP连接池)<<<<<<<<<<<<<<<<<
1.直接使用DriverManager的问题
--他是无节制的创建连接,当并发数过大时,会导致数据库崩溃
2.使用连接池的好处
--连接池对连接数进行了限制,超过限制就要求用户等待
◆例:
--private static BasicDataSource ds = new BasicDataSource();
--ds.setDriverClassName(driver);//加载驱动类
--ds.setUrl(url);//数据库连接
--ds.setUsername(user);
--ds.setPassword(pwd);
--ds.setInitialSize(initSize);//最小连接数
--ds.setMaxActive(maxSize);//最大连接数
--Connection conn = ds.getConnection();//创建连接
>>>>>>>>>>>>>>>>>>>>>3.Statement 及 PreparedStatement<<<<<<<<<<<<<<<<<
1.Statement 接口
--主要用于执行静态SQL语句(内容固定不变)
--创建方式:connection.createStatement();
--执行insert/update/delete 使用:
statement.executeUpdate(sql)
--返回影响行数
--执行select使用
statement.executeQuery(sql)
--返回结果集
--其他语句用:
statement.execute(sql)
2.PreparedStatement 接口
--主要用于执行动态SQL语句,可以防止SQL注入攻击,批处理,效率高
--提前编译好SQL语句,参数使用?作为占位符,创建preparedStatement对象时
就对SQL进行了预编译
--执行SQL语句之前,通过setInt()/setString()等方法对?提供值
--SQL语句执行的三个命令也不需要参数了
>>>>>>>>>>>>>>>>>>>>>4.结果集:可滚动结果集<<<<<<<<<<<<<<<<<
--ResultSet 只能使用next()方法将指针先后移动,不能反向移动
--可滚动结果集:指针可以在结果集中任意移动
1.可滚动结果集:ResultSetMetaData
--创建:ResultSetMetaData rsm = rs.getMetaData();
--可滚动结果集操作指针的常用方法:
--first();
--last()
--beforeFirst()
--afterLast()
--relative()
--next()
--previous()
--absolute()
--isLast()
--isBeforeFirst()
--isAfterLast()
2.如果要得到可滚动的结果集ResultSet,可按照下面操作:
--Statement smt = conn.createStatement(type,concurrency);
--PreparedStatement(sql,type,concurrency);
--type 取值:
--ResultSet.TYPE_FORWARD_ONLY :只能先前移动,默认参数
--ResultSet.TYPE_SCROLL_INSENSITIVE:
可滚动,不感知数据变化
--ResultSet.TYPE_SCROLL_SENSITIVE
可滚动,感知数据变化
--concurrency取值:
--ResultSet.CONCUR_READ_ONLY 只读
--ResultSet.CONCUR_UPDATABLE 可更新
>>>>>>>>>>>>>>>>>>>>>5.其他<<<<<<<<<<<<<<<<<
1.DAO
--DAO(Data Access Object) 数据访问对象
--建立在数据库和业务层之间,封装所有对数据库的操作
--目的:数据访问逻辑和业务逻辑分开
2.JDBC 支持如下日期:
--java.sql.Date 年月日
--java.sql.Time 时分秒
--java.sql.Timestamp 年月日时分秒
>>>都继承于:java.Util .Date