Java进阶(一)JDBC
来源:互联网 发布:怎么用淘宝小号发广告 编辑:程序博客网 时间:2024/05/22 04:42
用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();}}}}
- Java进阶(一)JDBC
- JAVA JDBC连接SQL Server数据库进阶(一)---ConnectionFactory
- Java进阶之JDBC
- Java进阶---异常(一)
- java web学习(进阶篇)七 Spring JDBC
- Java进阶(一)Annotation(注解)
- Java菜鸟进阶篇(一)
- Java进阶篇--容器(一)
- java进阶(一):枚举-enum
- java进阶(一)--控制反转IoC
- Java进阶教程(一)关键字
- Java多线程进阶一(基础入门)
- JAVA WEB进阶一
- Java面试-进阶(一)
- Java JDBC学习实战(一): JDBC的基本操作
- JDBC进阶版本(JDBCVersion2)
- Java基础(十二)-----JDBC(一)
- java学习(21)--JDBC(一)
- Unity uGUI设置自适应
- JQuery中$.each 和$(selector).each()的区别详解【转】
- linux中nginx
- iOS ——XML数据结构及其两种解析数据的方式SAX 、DOM
- 深度?广度?浅析技术人员的职业发展之路
- Java进阶(一)JDBC
- 删除QT程序在EGLFS下的左和上白边框(Remove QT application the border line on EGLFS)
- Object Identification #Facebook Relay文档翻译#
- 磁盘iops 测试 fio 及报错解释
- java中代理模式以及new和newInatance()的区别
- 我的Android进阶之旅------>Android中编解码学习笔记
- traceroute程序
- Java之内存分析和String对象
- Base64编码1