您的位置:首页 > 编程语言

JDBC原理,JDBC基础编程

2016-12-13 13:54 501 查看

JDBC

WHAT IS JDBC

Java Database Connectivity:Java访问数据库的解决方案。

JDBC是Java应用程序访问数据库的里程碑式解决方案。Java研发者希望用相同的方式访问不同的数据库,以实现与具体数据库无关的Java操作界面。

JDBC定义了一套标准接口,即访问数据库的通用API,不同的数据库厂商根据各自数据库的特点去实现这些接口。

JDBC接口及数据库厂商实现

JDBC中定义了一些接口:

1、驱动管理:

DriverManager

2、连接接口

Connection

DatabasemetaData

3、语句对象接口

Statement

PreparedStatement

CallableStatement

4、结果集接口

ResultSet

ResultSetMetaData

JDBC工作原理

JDBC只定义接口,具体实现由各个数据库厂商负责。

程序员使用时只需要调用接口,实际调用的是底层数据库厂商的实现部分。



JDBC访问数据库的工作过程:

加载驱动,建立连接

创建语句对象

执行SQL语句

处理结果集

关闭连接

Driver接口及驱动类加载

要使用JDBC接口,需要先将对应数据库的实现部分(驱动)加载进来。

驱动类加载方式(Oracle):

Class.forName("oracle.jdbc.driver.OracleDriver");


这条语句的含义是:装载驱动类,驱动类通过static块实现在DriverManager中的“自动注册”。

Connection接口

Connection接口负责应用程序对数据库的连接,在加载驱动之后,使用url、username、password三个参数,创建到具体数据库的连接。

Class.forName("oracle.jdbc.OracleDriver")
//根据url连接参数,找到与之匹配的Driver对象,调用其方法获取连接
Connection conn = DriverManager.getConnection(
"jdbc:oracle:thin:@192.168.0.26:1521:tarena",
"openlab","open123");


需要注意的是:Connection只是接口,真正的实现是由数据库厂商提供的驱动包完成的。

Statement接口

Statement接口用来处理发送到数据库的SQL语句对象,通过Connection对象创建。主要有三个常用方法:

Statement stmt=conn.createStatement();
//1.execute方法,如果执行的sql是查询语句且有结果集则返回true,如果是非查询语句或者没有结果集,返回false
boolean flag = stmt.execute(sql);
//2.执行查询语句,返回结果集
ResultSetrs = stmt.executeQuery(sql);
//3.执行DML语句,返回影响的记录数
int flag = stmt.executeUpdate(sql);


ResultSet接口

执行查询SQL语句后返回的结果集,由ResultSet接口接收。

常用处理方式:遍历 / 判断是否有结果(登录)。

String sql = "select * from emp";
ResultSetrs = stmt.executeQuery(sql);
while (rs.next()) {
System.out.println(rs.getInt("empno")+",“
+rs.getString("ename") );
}


查询的结果存放在ResultSet对象的一系列行中,指针的最初位置在行首,使用next()方法用来在行间移动,getXXX()方法用来取得字段的内容。

处理结果集ResultSet

ResultSet代表DQL查询结果,是2维结果. 其内部维护了一个读取数据的游标,默认情况在,游标在第一行数据之前, 当调用next() 方法时候, 游标会向下移动,并将返回结果集中是否包含数据, 如果包含数据就返回true. 结果集还提供了很好getXXX方法用于获取结果集游标指向当前行数据.

原理:



案例:

/**
* 执行DQL 语句
*/
public class Demo03 {
public static void main(String[] args)
throws Exception{
//注册驱动
String driver="oracle.jdbc.OracleDriver";;
Class.forName(driver);
//连接数据库
String url="jdbc:oracle:thin:@192.168.201.227:1521:orcl";
String user="openlab";
String pwd="open123";
Connection conn=DriverManager.getConnection(
url, user, pwd);
//创建Statement
Statement st=conn.createStatement();
//执行SQL(dql)
String sql="select id, name "
+ "from robin_demo ";
ResultSet rs=st.executeQuery(sql);
//处理结果 ...
//rs结果集中包含一个游标,游标默认在结果集
//的第一行之前
//rs.next():移动结果集游标到下一行
//检查是否有数据, 如果有返回true, 否则false
while(rs.next()){
//getXXX(列名): 返回结果集当前行中
// 指定列名的数据.
int id = rs.getInt("id");
String name=rs.getString("name");
//输出查询结果
System.out.println(id+","+name);
}
//关闭连接
conn.close();
}
}


使用Properties 读取配置文件

Properties 是Java中专门用于读取配置文件的API.

其底层就是文本文件IO

Properties 本身 实现 Map接口, 内部是散列表

Properties限定了key和Value都是String 类型.

Properties 常用API方法:

load(流) 读取一个配置文件

String getProperty(key) 读取一个属性值

使用步骤:

创建Properties对象

利用load方法读取配置文件

利用getProperty查询属性文件的内容

案例, 读取配置文件:

在resource 文件夹中添加配置文件 db.properties:

# db.properties
jdbc.driver=oracle.jdbc.OracleDriver
jdbc.url=jdbc:oracle:thin:@192.168.201.227:1521:orcl
jdbc.username=openlab
jdbc.password=open123


使用Properties读取配置文件内容:

public class Demo05 {
public static void main(String[] args)
throws IOException{
// Properties 就是为了读取
// *.properties 文件而设计的API
// 其底层就是文本文件IO
// Properties 本身 实现 Map接口
// 内部是散列表, 限定了key和Value都是
// String 类型.

//方法: load(流) 将文件就读取为散列表
//String getProperty(key) 查询value

//使用步骤
//1 创建 Properties 对象
Properties cfg = new Properties();
System.out.println(cfg);
System.out.println(cfg.size());
System.out.println(cfg.isEmpty());
//2. 利用load方法读取文件
InputStream in=
Demo05.class.getClassLoader()
.getResourceAsStream("db.properties");
//执行以后,将文件内容读取到散列表中了
cfg.load(in);
System.out.println(cfg);
System.out.println(cfg.size());

//3. 查找文件内容, 就是读取文件内容
String s=
cfg.getProperty("jdbc.driver");
System.out.println(s);
}
}


利用配置文件可以将程序中的参数保存到配置文件中, 修改程序参数只需要修改配置文件即可.

管理数据库连接

在软件中数据库连接使用非常频繁, 如果每次都创建连接, 就会造成代码的大量冗余, 常规的做法是建立数据库连接工具类, 封装数据库连接过程, 统一数据库连接过程, 使用时候就可以简化代码.

实现步骤:

创建数据库连接参数文件 db.properties

创建DbUtils.java 封装数据库连接方法

利用Properties读取配置文件夹中的数据库连接参数

创建方法 getConnection 封装数据库连接过程

使用 getConnection 方法

创建配置文件 db.properties

# db.properties
jdbc.driver=oracle.jdbc.OracleDriver
jdbc.url=jdbc:oracle:thin:@192.168.201.227:1521:orcl
jdbc.username=openlab
jdbc.password=open123


创建DbUtils.java

public class DbUtils {
static String driver;
static String url;
static String username;
static String password;

//读取文件中的数据库连接参数
static{
//初始化静态属性
//1. 利用Properties 读取配置文件
//2. 从配置文件中查找 相应参数值
try{
Properties cfg=new Properties();
InputStream in=
DbUtils.class.getClassLoader()
.getResourceAsStream("db.properties");
cfg.load(in);
System.out.println(cfg);
//初始化 连接参数
driver=cfg.getProperty("jdbc.driver");
url=cfg.getProperty("jdbc.url");
username=cfg.getProperty("jdbc.username");
password=cfg.getProperty("jdbc.password");
in.close();
}catch(Exception e){
e.printStackTrace();
throw new RuntimeException(e);
}
}

/**
* 封装创建数据库连接的过程
* 简化数据库连接
*/
public static Connection getConnection(){
try{
Class.forName(driver);
Connection conn=
DriverManager.getConnection(
url, username, password);
return conn;
}catch(Exception e){
e.printStackTrace();
throw new RuntimeException(e);
}
}

//DbUtils.java
/*
* 关闭数据库的连接方法, 封装复杂的关闭过程
*/
public static void close(Connection conn){
if(conn!=null){
try {
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}


说明:

driver url username password 是4个数据库连接参数, 因为只需要一份,则定义为静态变量.

静态代码块的目的是从配置文件中读取4个数据库连接参数的值.

getConnection方法封装了数据库连接过程

close方法封装了数据库连接关闭的过程

DbUtils 的使用:

public class Demo06 {
public static void main(String[] args) {
Connection conn=null;
try{
conn=DbUtils.getConnection();
Statement st=conn.createStatement();
String sql="select * from robin_demo";
ResultSet rs=st.executeQuery(sql);
while(rs.next()){
int id=rs.getInt("id");
String name=rs.getString("name");
System.out.println(id+","+name);
}
rs.close();//释放查询结果
st.close();//释放语句对象
}catch(Exception e){
e.printStackTrace();
}finally {
DbUtils.close(conn);
}
}
}


显然: 使用DbUtils可以简化JDBC代码的书写.

这个代码中在finally中关闭数据库连接, 其好处是可靠关闭连接.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  sql