JDBC(Java DataBase Connectivity)java数据库连接技术
把oracle与java
友好界面的可以操作数据库的系统
一、JDBC的发展阶段
1、java—》odbc—>DB 优势不能突出 (桥连)
2、java–》本地Client–》DB SQLPlus客户端的API操作 实现跨平台
3、java–》JDBC–》DB (直连) 每个厂家的.class不一样
oracle连接到数据库:lianjie()
DB2连接DB:donn()
项目可移植性差。
4、java—》srever—->DB (连接池
二、JDBC内容
1、JDBC的的内容包含2部分:
1)接口 sun公司提供:在JDK中的java.sql.* 和 javax.sql.*中
2)实现类 :数据库厂商提供。可以到官网下载。
ojdbc5.jar-适用于JDK5或6
ojdbc6.jar-适用于JDK7及以上
2、jar包的使用:
1)使用记事本开发:修改环境变量 CLASSPATH值为. .;ojdbc5.jar的路径以及文件名
2)使用IDE开发,在Java Project中导入ojdbc6.jar
右键项目名称–》new Folder –lib
将 ojdbc6.jar复制到lib下,展开lib并右击Build Path–Add to Build Path–>ok
引用的类库 Referenced Libraries
最重要的oracle.jabc OracleDriver.class(核心)
三、JDBC的6个步骤(重点)
一个准备六个步骤
1个准备:在java project中导入ojdbc5.jar
6个步骤
//1、注册驱动类
Class.forName(“oracle.jdbc.OracleDriver”)
//2.创建连接
//协议 IP port 数据库的标识SID 用户名 密码
String url=”jdbc:oracle:thin:@localhost:1521:oraclejdbc”;
Connemctin conn = DriverManager.getConnection(url,”用户名”);
//3.创建Statement
//4.执行SQL语句
//5.处理查询结果
//6.释放资源(先创建的 后关闭)
常见问题:
1、java.lang.ClassNotFoundException:oracle.jdbc.OracleDriver
解决方案:1)核心驱动类 全限定名称 有错:
2)是否导入ojdbc6.jar
2、java.sql.SQLRecoverableException: IO 错误: The Network Adapter could not establish the connection
解决方案:检查URL中的ip地址或端口号
3、java.sql.SQLRecoverableException: IO 错误: Invalid number format for port number
解决方案:检查URL中的端口号
4、java.sql.SQLException: Listener refused the connection with the following error:
ORA-12505, TNS:listener does not currently know of SID given in connect descriptor
解决方案:检查URL中的SID(数据库的唯一标识)
5、java.sql.SQLException: No suitable driver found for jdbc:eoracle:thin:@localhost:1521:oraclejdbc
解决方案:检查URL中的协议部分
6、java.sql.SQLException: ORA-01017: 用户名/口令无效; 登录被拒绝
解决方案:检查用户名和密码
7、java.sql.SQLSyntaxErrorException: ORA-00904: “AUUOUNTTNO”: 标识符无效 表或视图不存在 缺少符号 值太多…
并且使用异常堆栈信息,定位到错误代码行为 executeUpdate executeQuery时,解决方案:检查SQL语句。
解决方案:检查
四、执行带参数的SQL语句【重点】
1、使用Statement拼接SQL语句的方式
缺点 : 1)拼接SQL容易出错,如果是字符串类型有”,数据类型没有”;
2)存在SQL注入的安全隐患。
2、使用PreparedStatement执行带参SQL【重点】
PreparedStatement 是 statement的子接口
//3.创建PreparedStatement
String sql=”insert into accounts values(seq_accounts.nextval,?,?,?)”; //问号是占位
PreparedStatement pstm= conn.prepareStatement(sql);
//4 给问号占位符设置,然后执行SQL语句
pstm.setXxx(index,n); //给index处的
pstm.setXxx(2,p);
pstm.setXxx(3,b);
int row = pstm.executeUpdate();
小结:
PreparedStatement 和 Statement 的区别
Statement PreparedStatement
语法 stm=conn.createStatement(); sql="insert ...?,?,?"
pstm=conn.prepareStatement(sql);
sql="" pstm.setXxx(1,xx);
stm.executeUpdate(sql); pstm.executeUpdate();
安全 存在SQL注入安全隐患 安全
性能 相对较低 相对较高(多个同构SQL)
SQL结构 已构SQL 同构 SQL
oracle中SQL语句的执行顺序:
1)权限检查 2)语法检查 3)把SQL语句转成内部指令 4)执行
其中前3步,统称为编译。
5、日期的处理【重点】
java.text 包
//String日期 (strDate 2008-9-8)–》java.util.Date类型(utilDate)
java.text.SimpleDateFormat sdf= new SimpleDateFormat(“yyyy-MM-dd”);
java.util.Date utilDate = sdf.parse(strDate); //把strDate 转成 java.util.Date
//java.util.Date类型(utilDate)->java.sql.Date类型(sqlDate)
java.sql.Date sqlDate= new java.sql.Date(utilDate.getTime());
//
六、JdbcUtil类的提取【重点】
1、创建数据库的配置文件(.properties文件)
1)后缀 .properties
2)文件的内容要求:
a.一项内容 占 一行;
b.每项内容 由2部分构成 key 和 value 并且使用=连接(key=value);
c.并且 key 是自定义,但是value必须和jdbc代码中的完全相同;
d.key和value中的内容,不允许出现类似 空格 单引 双引 等特殊符号;
2、读取配置文件 bin 下
//在static 静态代码块中读,在类加载时 只执行一次
static{
//文件路径从bin开始往后写,但是不用写bin,必须以/开头 ,/ -代表bin根目录
InputStream is = JdbcUtil.class.getResourceAsStream(“/day1/db.properies”); //拿取类对象
//从rs输入流中读取文件内容,并且自动以key-value的形式存入prop对象
prop.load(is);
}
使用类加载器读文件的好处就是,只要程序运行,我能找到类加载的目录就能找到文件。
java.util Properties
3、使用配置文件中的内容
String driver = prop.getPrpperty()
常见问题:所有的问题都是路径问题
java.lang.NullPointerException