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语句