JDBC第二天

来源:互联网 发布:什么是网络出版 编辑:程序博客网 时间:2024/06/05 20:48

JDBC:使用java语言访问数据库的通用规范

使用JDBC访问数据库的步骤:
 1 注册驱动
  驱动:数据库厂商根据JDBC规范做的特有实现(java文件),将编译之后的所有.class文件打成jar包,开放给使用者
  oralce的核心驱动类:oracle.jdbc.driver.OracleDriver
 2 获取连接
  DriverManager驱动管理器,在系统内部搜索,
  找到即使用
  如果所有的驱动都不匹配,报异常no suitable driver

  oracle数据库连接的url:
   协议信息       数据库所有主机地址   数据库服务对应的端口号 数据库实例名
   jdbc:oracle:thin   :@localhost         :1521               :orcl
  登录数据库的用户名
  登录数据库的密码
 3 创建语句执行体
  Statement stm = conn.createStatement();
 4 发送sql语句
  stm.executeQuery(String sql):ResultSet rs;
   执行select语句
  stm.executeUpdate(String sql) : int rowCount;
   执行insert,update,delete语句
 5 处理结果集
  ResultSet
  rs.next() 将结果集的游标向下移一位,判断当前是否执行有效数据
  rs.get类型(列的位置,从1开始)
   根据列位置以及该列对应的类型,获取当前行中某一列的值
 6 回收资源
  但凡是跨越JVM边界的资源,必须是谁申请的谁释放。


Annotation 注解
 @Override声明当前方法是要覆盖父类中的方法


代码缺陷:
 1 Class.forName("oracle.jdbc.driver.OracleDriver");
 *数据库的相关信息硬编码在程序中
 *代码冗余,效率低
 *应该整个系统执行一次,系统启动则执行

 2 Connection conn = DriverManager.getConnection(
 "jdbc:oracle:thin:@localhost:1521:orcl", "system", "sinojava");
 *数据库的相关信息硬编码在程序中
 *数据库的相关信息不安全
 *代码冗余,
 尽量减少跨越JVM的IO操作(Connection多个方法公用)

 *3 Statement stm = conn.createStatement();
 int i = stm.executeUpdate(sql);
 ==============================================
 要求必须是一条sql语句对应一个语句执行体对象
 ==============================================
 sql语句要求程序员拼接,应该将sql语句的拼接、数据库和java中类型转换等跟程序员解耦合
 
 4 stmt.close();   conn.close();
 *代码冗余
 *资源不能保证正常释放

 5 主键的值必须由系统自动生成

 6 JDBC中默认是一条sql语句提交一次
 无法保证事务的完整性

 

throws  声明当前方法可能会抛出异常
throw  真实的抛出一个异常
try/catch 捕获处理


try/catch
try/finally
try/catch/finally

 

资源文件db.properties
 driver = oracle.jdbc.driver.OracleDriver
 url = jdbc:oracle:thin:@localhost:1521:orcl
 username = system
 password = sinojava


I/O:参照点为JVM
 JVM--->文件 Output...
 JVM<---文件 Input...
 
文件系统中:
 绝对路径,是以盘符开始。不推荐使用,对操作系统有依赖
 相对路径,是默认以当前的项目的根目录为起点
 
String的常用方法
 indexOf(char c) : int n获取某个字符所在的下标
 substring(int start[,int end])截取子串
 split(String reg):String[]  按照分隔符,分割字符串

类名.class.getResourceAsStream(String filePath)
 从当前类所在的位置,开始查找filePath对应的文件

Properties.load(InputStream in)
 将输入流中的数据,加载到当前的Properties对象中(map中)
Properties.getProperty(String key) :String value
 根据key的值,查找其对应的value


I/O流:
 按照流的方向分:
  输入:
   InputStream Reader
  输出:
   OutputStream Writer
 按照传输的数据分:
  字节流
   Stream
  字符流 
   Reader/Writer
 按照流的功能分:
  节点流:
   可以单独创建对象的流
  过滤流:
   必须依赖于其他流,才能创建当前流对象
   
new BufferedReader(new InputStreamReader(new FileInputStream("")));

设计模式:
 装饰模式:
  每个类具有自己的独特功能,多个类之间可以互相封装,
  封装之后可以提供原有的类以新的功能。


PreparedStatement:
 预编译的语句执行体
  1 insert into student values(?,?,?);
  将上述包含占位符的sql语句,预先发送给数据库,但不执行
  
  2 使用有效数据替换占位符
  PreparedStatement.set类型(问号的位置,问号替换的值)  

  3 将拼接好的sql语句执行
  PreparedStatement.executeQuery() :ResultSet
  PreparedStatement.executeUpdate() :int

**PreparedStatement**:
 PreparedStatement pstm = conn.prepareStatement(String sql);
 pstm.set***(n,**);
 ...
 pstm.executeQuery();

Statement:
 Statement stm = Connection.createStatement();
 stm.executeQuery(String sql)
 适用于没有参数的sql语句

 

原创粉丝点击