Jdbc简介
jdbc 是sun 公司定义的一套访问数据库的规范( 接口 + 类),主要是放在 java.sql 包javax.sql 包.
原理图:
做jdbc开发的几个前提
1.import java.sql.* 有时 import javax.sql.*;
2.把 jar 包导入到你的java项目
JDBC全称为:Java Database Connectivity(java数据库连接)
jdbc的步骤:
一、搭建实验环境 :
1、在oracle中创建一个库,并创建user表和插入表的数据。
2、新建一个Java工程,并导入数据驱动。
二、编写程序,在程序中加载数据库驱动
DriverManager. registerDriver(Driver driver)
Class.forName(“oracle.jdbc.driver.OracleDriver”);
三、建立连接(Connection)
Connection conn = DriverManager.getConnection(url,user,password);
四、创建用于向数据库发送SQL的Statement对象,并发送sql
Statement st = conn.createStatement();
ResultSet rs = st.excuteQuery(sql);
五、从代表结果集的ResultSet中取出数据,打印到命令行窗口
六、断开与数据库的连接,并释放相关资源
Connection接口
面试题: 什么时候,需要把 setAtuoCommit设为 false?
答: 当有多个DML同时执行,将其看做一个整体提交,则使用 事务管理 ,则需要把 setAutoCommit 设为false.
具体使用:
//1加载驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
//2得到连接
ct=DriverManager.getConnection
("jdbc:oracle:thin:@127.0.0.1:1521:orclhsp", "scott", "tiger");
//把事务设为不自动提交
ct.setAutoCommit(false);
//3.创建sql对象(Statement / PreparedStatement /CallableStatement)
statement=ct.createStatement();
//4.通过statement向数据库发出sql 指令.
//需求: 对emp表进行操作: 把SMITH 的sal -10 给 KING sal+10
statement.executeUpdate("update emp set sal=sal-10 where ename='SMITH'");
int i=9/0;
statement.executeUpdate("update emp set sal=sal+10 where ename='KING'");
//提交所有事务
ct.commit();
ResultSet 的说明
在默认情况下,我们的rs结果集,只能向前移动,这样rs 结果就不能复用 ,如果希望复用,则可以这样做:
ResultSet 的可选项有:
resultSetType - 结果集类型,它是ResultSet.TYPE_FORWARD_ONLY、ResultSet.TYPE_SCROLL_INSENSITIVE 或 ResultSet.TYPE_SCROLL_SENSITIVE 之一
resultSetConcurrency - 并发类型;它是 ResultSet.CONCUR_READ_ONLY 或 ResultSet.CONCUR_UPDATABLE 之一
//通过java 来查询所有的雇员.
//假设我们希望rs结果,可以滚动(可以向前,亦可向后)
statement=ct.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
rs=statement.executeQuery("select * from emp");
//循环取出
while(rs.next()){
System.out.println(rs.getInt("empno")+"名字"+rs.getString("ename"));
}
//如果我们希望,重新使用rs
rs.beforeFirst();
System.out.println("*********************");
while(rs.next()){
System.out.println(rs.getInt("empno")+"名字"+rs.getString("ename"));
}
orace 表的数据类型和 java 程序(jdbc) 的对应关系
细节:
(1)尽量晚创建,早释放
(2)关闭资源的代码,一定放在finally
SqlHelper类的编写
在进行jdbc 程序编写的时候,因为对数据库操作很多,所有都会把对数据库的各种操作,封装到一个类(SqlHelper/DBUtil)
如果访问数据库很频繁,则我们的Connection 、PreparedStatement,ResultSet.. 就不要搞成static.
程序详解—DriverManager
DriverManager.registerDriver(new OracleDriver())
注意:在实际开发中,并不推荐采用这个方法注册驱动。如果采用此种方式,会导致驱动程序加载两次,也就是在内存中会有两个Driver对象。
推荐方式:Class.forName(“oracle.jdbc.driver.OracleDriver”)
DriverManager.getConnection(url, user, password),根据url获取数据库的链接。
数据库URL
URL用于标识数据库的位置,程序员通过URL地址告诉JDBC程序连接哪个数据库,URL的写法为:
jdbc:oracle:[]:@localhost:1521:orcl
协议 子协议 主机:端口 数据库实例
常用数据库URL地址的写法:
Oracle— jdbc:oracle:thin:@localhost:1521:sid
SqlServer—jdbc:microsoft:sqlserver://localhost:1433; DatabaseName=sid
MySql—jdbc:mysql://localhost:3306/orcl
程序详解—Connection接口
createStatement():创建向数据库发送sql的statement对象。
prepareStatement(sql) :创建向数据库发送预编译sql的PrepareSatement对象。
prepareCall(sql):创建执行存储过程的callableStatement对象。
setAutoCommit(boolean autoCommit):设置事务是否自动提交。
commit() :在链接上提交事务。
rollback() :在此链接上回滚事务。
程序详解—ResultSet
Jdbc程序中的ResultSet用于代表Sql语句的执行结果。Resultset封装执行结果时,采用的类似于表格的方式。ResultSet 对象维护了一个指向表格数据行的游标,初始的时候,游标在第一行之前,调用ResultSet.next() 方法,可以使游标指向具体的数据行,进行调用方法获取该行的数据。
获取任意类型的数据:
getObject(int index)
getObject(string columnName)
获取指定类型的数据:
getString(int index)
getString(String columnName)
ResultSet还提供了对结果集进行滚动的方法:
next():移动到下一行
Previous():移动到前一行
absolute(int row):移动到指定行 [row从1开始计算]
beforeFirst():移动resultSet的最前面。
afterLast() :移动到resultSet的最后面。
使用JDBC对数据库进行CRUD
Jdbc中的statement对象用于向数据库发送SQL语句,想完成对数据库的增删改查,只需要通过这个对象向数据库发送增删改查语句即可。
Statement对象的executeUpdate方法,用于向数据库发送增、删、改的sql语句,executeUpdate执行完后,将会返回一个整数(即增删改语句导致了数据库几行数据发生了变化)。
Statement.executeQuery方法用于向数据库发送查询语句,executeQuery方法返回代表查询结果的ResultSet对象。
SQL 注入是用户利用某些系统没有对输入数据进行充分的检查,从而进行恶意破坏的行为。
1、statement存在sql注入攻击问题,例如登陆用户名采用' or 1=1 or name=‘
2、防范 SQL 注入,需要采用PreparedStatement取代Statement。
3、或者通过程序来控制,这个比较麻烦,推荐使用PrepareStatement来完成.