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的主要步骤有七步:

  1.  注册驱动
  2. 管理驱动 //第二步可以隐藏在第一步中
  3. 设置连接参数
  4. 获取数据库连接(connection)(用于从java中通过connection传输数据的经过驱动关键(DriverManager)
            //可传入oracle或者masql  如果是查select 是有返回值的在返回到结果集里)
  5. 操作数据库(使用SQL语句)
  6. 处理返回结果集 //根据情况是否有或者没有
  7. 关闭资源(关闭资源是从下往上)

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

注册驱动

(最常用的方式,隐含了低昂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();}}}}



0 0
原创粉丝点击