JDBC 笔记

JDBC 笔记

JDBC 是什么?

JDBC 全称就是 Java database connection ,是 sun 公司定义的一组连接数据库的接口,具体的实现类是由各个数据库厂商提供的,称之为驱动。所以,要通过 JDBC 的 API 连接数据库时,必须要有对应的驱动支持。

下面是 JDBC 的架构图:

这里写图片描述

其中的 DriverMannager 类是 sun 公司编写的类,专门用来管理不同数据库厂商提供的驱动。

到底怎么通过 JDBC 操纵数据库呢?

首先需要下载你需要使用的数据库厂商提供的 Java 驱动包,导入项目中。然后在项目中直接编写代码就可以了。

@Test
public void test() throws Exception{
    ResultSet rs = null;
    Connection con = null;
    PreparedStatement ps = null;
    //第一步,加载驱动
    Class.forName("com.mysql.jdbc.Driver");
    //第二步,获得连接对象
    con =  DriverManager.getConnection("jdbc:mysql://localhost:3306/testjdbc","root","adminadminadmin");
            //利用 preparedStatement 接口来执行 sql 语句,这里会做一个预处理。通过占位符的方式代替变量,可以有效的解决 sql 注入的问题
            ps= con.prepareStatement("select id,username,password from demo1 where id > ?");
            ps.setObject(1, 3);
            //第三步,执行 sql 语句,查询就用 executeQuery() 方法,其他就用 executeUpdate() 方法。
            rs = ps.executeQuery();
            System.out.println(rs);
            while(rs.next()){//遍历结果集,得到结果。
                System.out.println(rs.getString(1) + "---" + rs.getString(2) + "---" + rs.getString(3));
            }
}

如何封装 JDBC 代码呢?

数据库的连接是通过 Socket 实现的,网络的连接是非常占用资源的,JDBC 非常需要进行优化。而且,数据库的连接信息都不是直接写在程序中的,而是用资源文件代替。

下面就展示怎么写:封装 JDBCUtils 类

public class JDBCUtils {
    //将资源文件放进 Properties 对象中,方便读取文件内容
    static Properties p = null;
    static {
        p = new Properties();
        try {       p.load(JDBCUtils.class.getResourceAsStream("/db.properties"));//此处读取资源文件存在路径的问题,/ 表示在 src 目录下。
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public static Connection getMysqlConnection1() {
        try {
            Class.forName(p.getProperty("mysqlDriver"));
            return DriverManager.getConnection(p.getProperty("mysqlURL"),p.getProperty("mysqlUsername"),p.getProperty("mysqlPassword"));
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;

    }

    public static void close(ResultSet rs,PreparedStatement ps,Connection con) {
        if(rs != null){
            try {
                rs.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                System.out.println("rs");
            }
        }
        if(ps != null) {
            try {
                ps.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                System.out.println("ps");
            }
        }
        if(con != null) {
            try {
                con.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                System.out.println("con");
            }
        }
    }
}

调用 JDBCUtils 类封装的方法

    Connection con = null;
    PreparedStatement ps = null;
    ResultSet rs = null;
    try {
        con = JDBCUtils.getMysqlConnection1();
        ps = con.prepareStatement("select * from testdate");
        rs = ps.executeQuery();
        while(rs.next()) {
             System.out.println(rs.getObject(1) + "->" +rs.getObject(2) + "->" + rs.getObject(3) + "->" + rs.getObject(4));
         }
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }finally {
        JDBCUtils.close(rs, ps, con);
    }    

补充一个关于事务处理的实现

事务是通过 Connection 对象来控制的,若其中某个 sql 没有执行成功,就会采用回滚操作 rollback( ) 。

ResultSet rs = null;
        Connection con = null;
        PreparedStatement ps1 = null;
        PreparedStatement ps2 = null;
        try {
            //加载驱动
            Class.forName("com.mysql.jdbc.Driver");
            //获得连接对象
            con = DriverManager.getConnection("jdbc:mysql://localhost:3306/testjdbc","root","adminadminadmin");
            con.setAutoCommit(false);
            //利用 preparedStatement 接口来执行 sql 语句,可以有效解决 sql 注入的问题,这里会做一个预处理,prepareStatement()
            //方法会进行判断,sql 注入的问题直接被解决了
            ps1= con.prepareStatement("insert into demo1(username,password,age) values('zh','123456','80')");
            ps1.executeUpdate();
            System.out.println("第一个执行成功");
            ps2= con.prepareStatement("insert into demo1(username,password,aged) values('zh','123456','80')");
            ps2.executeUpdate();
            con.commit();
        } catch (Exception e) {
            //e.printStackTrace();
            try {
                System.out.println("回滚");
                con.rollback();
            } catch (SQLException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
        }finally {
            if(rs != null) {
                try {
                    rs.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            if(ps1 != null) {
                try {
                    ps1.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            if(con != null) {
                try {
                    con.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
一、概述: JDBC从物理结构上说就是Java语言访问数据库的一套接口集合。从本质上来说就是调用者(程序员)和实现者(数据库厂商)之间的协议。JDBC的实现由数据库厂商以驱动程序的形式提供。JDBC API 使得开发人员可以使用纯Java的方式来连接数据库,并进行操作。 ODBC:基于C语言的数据库访问接口。 JDBC也就是Java版的ODBC。 JDBC的特性:高度的一致性、简单性(常用的接口只有4、5个)。 1.在JDBC中包括了两个包:java.sql和javax.sql。 ① java.sql 基本功能。这个包中的类和接口主要针对基本的数据库编程服务,如生成连接、执行语句以及准备语句和运行批处理查询等。同时也有一些高级的处理,比如批处理更新、事务隔离和可滚动结果集等。 ② javax.sql 扩展功能。它主要为数据库方面的高级操作提供了接口和类。如为连接管理、分布式事务和旧有的连接提供了更好的抽象,它引入了容器管理的连接池、分布式事务和行集等。 注:除了标出的Class,其它均为接口。 API 说明 java.sql.Connection 与特定数据库的连接(会话)。能够通过getMetaData方法获得数据库提供的信息、所支持的SQL语法、存储过程和此连接的功能等信息。代表了数据库。 java.sql.Driver 每个驱动程序类必需实现的接口,同时,每个数据库驱动程序都应该提供一个实现Driver接口的类。 java.sql.DriverManager (Class) 管理一组JDBC驱动程序的基本服务。作为初始化的一部分,此接口会尝试加载在”jdbc.drivers”系统属性中引用的驱动程序。只是一个辅助类,是工具。 java.sql.Statement 用于执行静态SQL语句并返回其生成结果的对象。 java.sql.PreparedStatement 继承Statement接口,表示预编译的SQL语句的对象,SQL语句被预编译并且存储在PreparedStatement对象中。然后可以使用此对象高效地多次执行该语句。 java.sql.CallableStatement 用来访问数据库中的存储过程。它提供了一些方法来指定语句所使用的输入/输出参数。 java.sql.ResultSet 指的是查询返回的数据库结果集。 java.sql.ResultSetMetaData 可用于获取关于ResultSet对象中列的类型和属性信息的对象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值