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

Java进阶(一)JDBC

2015-10-02 16:25 441 查看
用Java来写的应用程序,无论是 B/S 架构还是 C/S架构,要想程序很好的完成需要的功能,最主要的还是数据。这就要提到数据库。事实上,数据库可以独立的应用,但是程序要想利用数据库并进行相关的增删改查(CRUD)操作,就需要将Java程序与数据库相连接。这时,就要用到JDBC。

JDBC(Java Database Connectivity)

主要用到的是 java.sql 包中的各个类,主要有以下几个:

import java.sql.Statement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;


而JDBC的主要步骤有七步:

注册驱动
管理驱动 //第二步可以隐藏在第一步中
设置连接参数
获取数据库连接(connection)(用于从java中通过connection传输数据的经过驱动关键(DriverManager)

//可传入oracle或者masql 如果是查select 是有返回值的在返回到结果集里)
操作数据库(使用SQL语句)
处理返回结果集 //根据情况是否有或者没有
关闭资源(关闭资源是从下往上)

下面,来一点点仔细分析一下这几个步骤:

注册驱动

(最常用的方式,隐含了低昂DriverManager中进行注册)

驱动类:

oracle数据库;oracle.jdbc.driver.OracleDriver

MySQL数据库:com.jdbc.mysql.driver

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


设置连接参数

URL的适配

oracle数据库

jdbc:oracle:thin@<机器名/IP地址><:端口>:数据库名

jdbc:oracle:thin@127.0.0.1:1521:orcl

mysql数据库

jdbc:mysql://<机器名/IP地址><:端口>/数据库名

jdbc:mysql://localhost:3306/dbname

String url="jdbc:oracle:thin@127.0.0.1:1521:orcl";
String user="scott";
String passwrod="tiger";


获取数据库连接

Connection conn = DriverManager.getConnection(url, user, password);


操作数据库

(执行相应的sql语句)

//要执行的语句
String sql = "select * from emp where sal>2000";
//通过Connection对象创建集装箱
Statement statement = conn.createStatement();
//执行sql语句,获取结果集
ResultSet rs = statement.executeQuery(sql);

//使用Statement中的方法操作数据库(执行sql语句)
/*
* 常用的三个方法:
* 1、boolean execute(String sql)(功能最强大,所有语句都可以执行)
* 		1)当有结果集ResultSet对象产生时(如执行select * 语句),返回true
* 		2)当没有结果集时(如执行insert、delete语句),返回false
* 		*3)如果返回值为true时,我们可以继续
* 			调用ResultSet getResultSet()方法获取结果集对象
*
* 2、int executeUpdate(String sql)
* 		1)执行给定 SQL 语句,该语句可能为 INSERT、UPDATE 或 DELETE 语句,或者不返回任何内容的 SQL 语句
* 		2)对于 SQL 数据操作语言 (DML) 语句,返回行计数 。 对于什么都不返回的 SQL 语句,返回 0
*
* 3、ResultSet executeQuery(String sql)
* 		1)用于执行查询语句,包含给定查询所生成数据的ResultSet对象(结果集)
* 		2)ResultSet对象永远不能为null,所以不能判断取出的结果是否为空
* 			也就是说,如果取出的结果集没有数据,ResultSet对象也会被创建(类似一个空的集合)
*
* 注:这些方法不会为我们检查SQL语句的语法错误,
* 		如果SQL写错,则到数据库执行时出现异常
*/


遍历结果集

while(rs.next()){
int id = rs.getInt(1);
String name = rs.getString(2);
String job = rs.getString(3);
double sal = rs.getDouble(6);
System.out.println("id = " + id + ",name = "
+ name + ",job = " + job + ",sal = " + sal);
}

/*
* 结果集(ResultSet对象):
* 		表示数据库结果集的数据表,通常通过执行查询数据库的语句生成。
*
* 1、获取ResultSet对象:
* 		1)使用executeQuery(String sql)方法执行查询语句,可返回该对象
* 		2)了解即可:如果执行execute(String sql)方法的返回结果为true(即sql为查询语句)时,
* 			可以继续调用getResultSet()方法获取结果集对象
*
* 2、遍历结果集:
* 		1)当next()方法返回true时,表示有下一条记录(存在),并且会指向下一条记录(选中)
* 		2)当next()方法返回false时,表示已经到了结果集的末尾
*
* 3、取得某一列的值:
* 		1)当使用next()方法移动到“正确(根据业务进行判断)”的记录行后,
* 			我们可以获取该条记录的信息(分别获取“属性”值)
* 		2)可以根据该列的数据类型调用对应的“ get["属性名"]或get[第几列(从1开始)] ”方法取得值
* 		3)如果不知道字段的返回值类型,可以使用“getObject(int columnIndex)
* 			或 getObject(String columnLabel)”方法来获取数据,然后再进行判断、强转
*
* 4、注意点:
* 		1)尽可能使用列名来代替 * ,这样不容易弄错列的位置
* 		2)返回结果只有一条时(如查询条数),可以使用if(rs.next()){}来代替while循环
* 		3)对于数字型的列,如果里面保存的是null,直接使用getInt方法获取时,JDBC会将null转换成0
* 			如果关心返回的是否为null,可以调用rs.wasNull()方法判断最后一次取的值是否为null
* 		4)在开发对运算结果精度要求较高的应用时(如银行),
* 			应该尽量避免使用double、float,建议使用BigDecimal
*/


关闭资源

(从下到上)

resultset.close();
statement.close();
connection.close();


JDBC补充

接口 PreparedStatement 是 Statement 的子接口

定义预编译的sql语句,使用?为占位符

String sql1 = "update student t set t.name=? where id=?"

通过connection对象创建“预编译的集装箱”

PreparedStatement pst = conn.prepareStatement(sql1);

为“预编译的集装箱”中的占位符进行赋值

pst.setString(1,"张三");

pst.setInt(2,1);

预编译的sql对象,好处:

1.预编译的,执行效率比其父接口statement要高;

2. 编译部分语句结构相同,值不一样(参数),则同构;

SQL语句结构不同,则异构;

3.在特定的情况下,Statement在使用拼接的方式可能会出现错误;使用预编译,问号“?”方式完美解决。

JDBC 常见异常

1、ClassNotFoundException:

1)检查jar包是否正确导入;

2)检查加载的“包名+类名”是否写正确;

2、SQL异常:

1)确认Oracle或MySQL服务正常启动(默认自动启动);

2)检查连接信息是否正确(URL,用户名,密码);

3)检查SQL语句(标点,引号,与表中列是否对应.等);

使用JDBC进行模糊查询

String sql2 = "Select * from tmp where ename like ?";
PreparedStatement pst = conn.prepareStatement(sql2);
//模糊查询注意:% 或者  _ 需要在赋值时添加
pst.setString(1, "%M%");
ResultSet rs2 = pst.executeQuery();


工厂模式

把公共部分提取出来,节省资源和空间

package factory;

import java.sql.Statement; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException;/**
把公共部分提取出来,节省资源和空间
*/

public class ConnectionFactory {
private static final String URL = "jdbc:oracle:thin:@localhost:1521:orcl";
private static final String USERNAME = "scott";
private static final String PASSWORD = "tiger";
private static Connection conn;

public static Connection getConnetion() {
// 1、注册驱动(最常用的方式,隐含了向DriverManager中进行注册)
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
} catch (ClassNotFoundException e) {
System.out.println("加载异常");
e.printStackTrace();
}

// 3、获取数据库连接
try {
conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
} catch (SQLException e) {
System.out.println("获取连接失败");
e.printStackTrace();
}
return conn;
}
//判断是否存在
public static void myClose(ResultSet rs, Statement st, Connection conn) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
System.out.println("关闭结果集失败");
e.printStackTrace();
}
}
if (st != null) {
try {
st.close();
} catch (SQLException e) {
System.out.println("关闭Statement失败");
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
System.out.println("关闭连接失败");
e.printStackTrace();
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: