why?
1.如何在java中操作数据库
2.提供统一的操作方式去操作所有的关系数据库
what?
java DataBase Connectify(jdbc)
使用java语言实现连接数据库方式
how?
jdbc六大步骤
a.ODBC:open Datebase Connectify
1.使用统一方式去操作数据库
2.使用c语言实现
3.嵌入式方向连接数据库使用ODBC
b.jDBC:java Datebase Connectify
1.使用统一方式去操作数据库
2.使用java语言实现
3.JAVAEE,JAVASE连接数据库,使用JDBC
4.sun公司提出
**
jdbc API是什么?
**
所在包:
java.sql.;—javase
javax.sql.;—javaee
提供的就是java方面的连接数据库的标准
操作数据库
1.连接数据库
2.发送sql语句操作数据库
3.获取处理结果
使用时候应该导包:
ojdbc14.jar
**
JDBC驱动的四种类型
**:
a)JDBC-ODBC桥驱动:
把c语言转化成java语言效率很低
b)部分java实现的本地驱动:
把c语言转化成java语言效率很低
必须安装客户端
c)纯java实现的网络驱动
使用数据库特殊的协议
d)纯java实现的本地驱动
采用TCP/IP协议进行通信
Oracle只支持第二,四类驱动
现在Oracle采用第四类驱动:thin
URL:如何去标识一个唯一的数据库。
可以安装一个数据库,可以配置多个数据库系统。
URL由数据库厂商提供的。
针对Oracle的URL:
jdbc:oracle:thin:@localhost:1521:XE
JDBC的编程步骤:
1)注册驱动:告诉应用程序连接什么数据库
驱动程序:ojdbc14.jar或者ojdbc5.jar
三种方式:
a)使用类加载(常用)
Class.forName(driverName);
b)创建driver对象
Driver driver=new driverName();
DriverManager.registerDriver(driver);
c)使用jdbc.drivers的属性
-Djdbc.drivers=oracle.jdbc.driver.OracleDriver
**2)获取与数据库的连接,**Connection
两种方式:
a)DriverManager.getConnection
(url,user,passwd);(常用)
b)Driver对象.connect(url,properties)
必须和第一步的第二种方式连用
3)创建发送sql语句的对象(Statement)
Statement
a)执行异构的sql语句,效率更高
b)创建对象和执行sql语句
createStatement();
execute***(sql);
c)动态sql语句使用字符串拼接的方式
d)不会进行预编译
PreparedStatement
a)执行同构的sql语句,效率更高
b)创建对象和执行sql语句
prepareStatement(sql);
execute***();
c)动态sql语句使用?.
执行sql之前给?赋值
d)会进行预编译,传入的内容是真正的字符串
CallableStatement:执行pl/sql的语句
4)执行sql语句
boolean execute(sql):执行任何sql语句。返回是否有结果集效率低
ResultSet executeQuery(sql):执行查询sql语句,返回结果集
int executeUpdate(sql):执行DMLsql语句,返回受影响行数
insert,update,delete
5)处理结果(针对查询语句)
ResultSet:结果集,最开始返回所有数据最前面
while(rs.next()){
//处理每一条数据getType()
}
getType(序列号|字段名字):序列号从1开始
Type是数据类型。
getInt(1),getString(2)
getInt(“id”),getString(“last_name”)
为某一个字段赋值:setType===>setInt()
6)关闭资源,close()
先开的后关,后开的先关
一旦Connection关闭,其他的资源取不到。
面向对象编程和关系数据库如何映射
关系数据库 面向对象编程
表 class
字段 实例变量
外键 has a的关系
主键的值交给序列
create table s_emp(
dept_id number references s_dept(id)
)
class Emp{
Dept dept;
}
class Dept{
Set<Emp> emps;
}
创建发送sql语句的对象(Statement)
i))Statement
a)执行异构的sql语句,效率更高
b)创建对象和执行sql语句
createStatement();
execute***(sql);
c)动态sql语句使用字符串拼接的方式
d)不会进行预编译
ii)PreparedStatement
a)执行同构的sql语句,效率更高
b)创建对象和执行sql语句
prepareStatement(sql);
execute***();
c)动态sql语句使用?.
执行sql之前给?赋值。
?不能使用在字段名和表名中。
d)会进行预编译,传入的内容是真正的字符串。
预编译的效果:想给name赋值为br’iup
只能用PreparedStatement才可以插入成功。
e)避免sql注入(sql漏洞)
事务Transaction
JDBC中事务都是自动提交
try{
开启事务conn.setAutoCommit(false);
你的账户update
我的账户update
提交事务conn.commit();
}catch(Exception e){
回滚事务conn.rollback();
}
批处理:提高效率。用于处理大量数据
将一批sql语句发送给数据库,
数据库一次性执行这一批sql语句。
addBatch(sql) 将sql语句添加到批处理中
addBatch()
executeBatch():执行这一批sql语句
做下封装
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
public class ConnectionFactory {
private static String DRIVER = "oracle.jdbc.driver.OracleDriver";
private static String URL = "jdbc:oracle:thin:@localhost:1521:XE";
private static String USER = "briup";
private static String PASSWORD = "briup";
static{
Properties p=new Properties();
try {
p.load(ConnectionFactory.class.getResourceAsStream("db.properties"));
DRIVER=p.getProperty("DRIVER");
URL=p.getProperty("URL");
USER=p.getProperty("USER");
PASSWORD=p.getProperty("PASSWORD");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static Connection getConnection(){
Connection conn=null;
try {
Class.forName(DRIVER);
conn=DriverManager.getConnection(URL, USER, PASSWORD);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn;
}
public static void close(Connection conn,Statement st,ResultSet rs)
{
try {
if(rs!=null)rs.close();
if(st!=null)st.close();
if(conn!=null)conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void close(Connection conn,Statement st)
{
close(conn,st,null);
}
}