Java进阶(一)JDBC
2015-10-02 16:25
441 查看
用Java来写的应用程序,无论是 B/S 架构还是 C/S架构,要想程序很好的完成需要的功能,最主要的还是数据。这就要提到数据库。事实上,数据库可以独立的应用,但是程序要想利用数据库并进行相关的增删改查(CRUD)操作,就需要将Java程序与数据库相连接。这时,就要用到JDBC。
而JDBC的主要步骤有七步:
注册驱动
管理驱动 //第二步可以隐藏在第一步中
设置连接参数
获取数据库连接(connection)(用于从java中通过connection传输数据的经过驱动关键(DriverManager)
//可传入oracle或者masql 如果是查select 是有返回值的在返回到结果集里)
操作数据库(使用SQL语句)
处理返回结果集 //根据情况是否有或者没有
关闭资源(关闭资源是从下往上)
下面,来一点点仔细分析一下这几个步骤:
驱动类:
oracle数据库;oracle.jdbc.driver.OracleDriver
MySQL数据库:com.jdbc.mysql.driver
oracle数据库
jdbc:oracle:thin@<机器名/IP地址><:端口>:数据库名
jdbc:oracle:thin@127.0.0.1:1521:orcl
mysql数据库
jdbc:mysql://<机器名/IP地址><:端口>/数据库名
jdbc:mysql://localhost:3306/dbname
String sql1 = "update student t set t.name=? where id=?"
通过connection对象创建“预编译的集装箱”
PreparedStatement pst = conn.prepareStatement(sql1);
为“预编译的集装箱”中的占位符进行赋值
pst.setString(1,"张三");
pst.setInt(2,1);
2. 编译部分语句结构相同,值不一样(参数),则同构;
SQL语句结构不同,则异构;
3.在特定的情况下,Statement在使用拼接的方式可能会出现错误;使用预编译,问号“?”方式完美解决。
1)检查jar包是否正确导入;
2)检查加载的“包名+类名”是否写正确;
2、SQL异常:
1)确认Oracle或MySQL服务正常启动(默认自动启动);
2)检查连接信息是否正确(URL,用户名,密码);
3)检查SQL语句(标点,引号,与表中列是否对应.等);
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();
}
}
}
}
相关文章推荐
- 错误: 找不到或无法加载主类
- JAVA SHH框架搭建(多图)
- 关于spring中<context:component-scan base-package="" />写法
- Java 序列化相关
- java.util.Comparator用法
- Java数据类型和MySql数据类型对应表
- java的一些原则
- 使用Java 的Mongo API操作doc
- java抽象类
- Eclipse建筑物SSH(struts-2.2.3 + spring-2.5.6 + hibernate-3.6.8)相框-随着源代码
- JAVA 日期赋值及比较
- java的访问权限
- java描述学生
- java环境变量
- java 加载数据库驱动 与forname无关
- 采用JSP+JavaBean的方式进行简单的实现用户的网页登陆实例
- 采用JSP+JavaBean的方式进行简单的实现用户的网页登陆实例
- 详细解析接口和抽象类的区别——Java
- JDK源码阅读(二) AbstractList
- Java 读写文件相关