JDBC相关(一):JDBC简介及相关类介绍

4 篇文章 0 订阅
3 篇文章 0 订阅

JDBC相关(一):JDBC简介及相关类介绍

JDBC(Java Databse Connectivity): Java数据库连接即为用Java语言来操作数据库,原来我们操作数据库是在控制台使用SQL语句来操作数据库,JDBC是用Java语言向数据库发送SQL语句。本文主要包括以下内容:

  1. JDBC原理
  2. JDBC核心类(接口)介绍
  3. JDBC链接数据库步骤和代码演示
  4. 全部代码

(一)JDBC原理

(1)早期SUN公司想编写一套可以连接所有数据库的API,但是后来发现数据库种类多而且差异大,更新时间也不同,后来SUN与数据库厂商商定:SUN提供规范并命名为JDBC,而各个厂商提供,遵循了JDBC规范的,可以访问自己数据库的API;
(2)使用JDBC就可以使用同一种API访问不同的数据库系统,开发人员使用标准的API编写应用程序,根据不同的数据库加入不同的数据库驱动程序工作。
(3)需要注意的是:JDBC仅仅是接口,而JDBC驱动才是接口的实现,没有驱动无法完成数据库连接!每个数据库厂商都有自己的驱动,用来连接自己公司的数据库。
JDBC示意图

(二)JDBC核心类介绍:

核心类作用
DriverManager注册驱动;获取Connection
Connectionconnection对象表示连接,获取Statement对象
Statement(PreStatement)向数据库发送SQL语句
ResultSet结果集,一是一个二维的表格
  • DriverManager :
    (1)注册驱动:这可以让JDBC知道要使用的是哪个驱动;
    (2)获取Connection:如果可以获取到Connection,那么说明已经与数据库连接上了。
  • Connection :
    connection对象表示连接,与数据库的通讯都是通过这个对象展开的:最为重要的一个方法就是用来获取Statement对象;

  • Statement的作用:
    statement是用来向数据库发送SQL语句的,这样数据库就会执行发送过来的SQL语句:
    方法一:void executeUpdate(String sql):执行更新操作(insert、update、delete等);
    方法二:ResultSet executeQuery(String sql):执行查询操作,数据库在执行查询后会把查询结果,查询结果就是ResultSet;

  • ResultSet:
    ResultSet对象表示查询结果集,只有在执行查询操作后才会有结果集的产生。结果集是一个二维的表格,有行有列。操作结果集要学习移动ResultSet内部的“行光标”,以及获取当前行上的每一列上的数据:

(三)JDBC链接数据库步骤和代码演示

链接数据库步骤(以MySql为例):
先进行到包:MySql的驱动包“mysql-connector-java-5.1.13-bin.jar”,请点击下载:点击下载MySql驱动

1. 获取连接:


获取连接需要两步,一是使用DriverManager来注册驱动,二是使用DriverManager来获取Connection对象。
(1)注册驱动共有三种方式,首先是最常见的方式进行,:

    Class.forName(“com.mysql.jdbc.Driver”)

      这种方式不会对具体的驱动类产生依赖(即不用import驱动类),Class类的forName方法中对参数指定的类进行了装载操作。在这里将com.mysql.jdbc.Driver类装载到jvm。众所周知,类装载时,将执行被装载类的静态代码块,而com.mysql.jdbc.Driver类有一个静态代码块如下:
static{
try{
java.sql.DriverManager.registerDriver(newDriver());
}catch(SQLExceptione){
thrownew RuntimeException("can't register driver!");
}

    com.mysql.jdbc.Driver类中的static块会创建本类对象,并注册到DriverManager中。这说明只要去加载com.mysql.jdbc.Driver类,那么就会执行这个static块,从而也就会把com.mysql.jdbc.Driver注册到DriverManager中,所以可以把注册驱动类的代码修改为加载驱动类。

(2)获取Connection对象

Connection con =DriverManager.getConnection(url,username,password);

      url是用来找到要连接数据库“网址”,就好比你要浏览器中查找百度时,也需要提供一个url。下面是mysql的url:
                              jdbc:mysql://localhost:3306/mydb1

JDBC规定url的格式由三部分组成,每个部分中间使用逗号分隔。
 第一部分是jdbc,这是固定的;
 第二部分是数据库名称,那么连接mysql数据库,第二部分当然是mysql了;
 第三部分是由数据库厂商规定的,我们需要了解每个数据库厂商的要求,mysql的第三部分分别由数据库服务器的IP地址(localhost)、端口号(3306),以及DATABASE名称(mydb1)组成。

      username,password分别是数据库的用户名和密码。

2.获取Statement


(1) Statement是用来向数据库发送要执行的SQL语句的!

在得到Connectoin之后,说明已经与数据库连接上了,下面是通过Connection获取Statement对象的代码:Statement stmt = con.createStatement();

  • 送SQL增、删、改语句:
String sql = “insert into user value(’zhangSan’, ’123’)”;
int m = stmt.executeUpdate(sql);

其中int类型的返回值表示执行这条SQL语句所影响的行数,我们知道,对insert来说,最后只能影响一行,而update和delete可能会影响0~n行。
如果SQL语句执行失败,那么executeUpdate()会抛出一个SQLException。

  • 发送SQL查询语句:
String sql = “select * from user”;
ResultSet rs = stmt.executeQuery(sql);

执行查询使用的不是executeUpdate()方法,而是executeQuery()方法。executeQuery()方法返回的是ResultSet,ResultSet封装了查询结果,我们称之为结果集。

(2)批处理

      批处理:就是一批一批的处理,而不是一个一个的处理!
       假如你有10条SQL语句要执行时,一次向服务器发送一条SQL语句,这么做效率上很差!处理的方案是使用批处理,即一次向服务器发送多条SQL语句,然后由服务器一次性处理。
批处理只针对更新(增、删、改)语句,批处理没有查询什么事儿!
可以多次调用Statement类的addBatch(String sql)方法,把需要执行的所有SQL语句添加到一个“批”中,然后调用Statement类的executeBatch()方法来执行当前“批”中的语句。

  • void addBatch(String sql):添加一条语句到“批”中;
  • int[] executeBatch():执行“批”中所有语句。返回值表示每条语句所影响的行数据;
  • void clearBatch():清空“批”中的所有语句。
for(int i = 0; i < 10; i++) {
                String number = "S_10" + i;
                String name = "stu" + i;
                int age = 20 + i;
                String gender = i % 2 == 0 ? "male" : "female";
                String sql = "insert into stu values('" + number + "', '" + name + "', " + age + ", '" + gender + "')";
                stmt.addBatch(sql);
            }
            stmt.executeBatch();

当执行了“批”之后,“批”中的SQL语句就会被清空!也就是说,连续两次调用executeBatch()相当于调用一次!因为第二次调用时,“批”中已经没有SQL语句了。
还可以在执行“批”之前,调用Statement的clearBatch()方法来清空“批”!

(3)PreparedStatement批处理

      PreparedStatement的批处理有所不同,因为每个PreparedStatement对象都绑定一条SQL模板。所以向PreparedStatement中添加的不是SQL语句,而是给“?”赋值。

            String sql = "insert into stu values(?,?,?,?)";
            pstmt = con.prepareStatement(sql);
            for(int i = 0; i < 10; i++) {
                pstmt.setString(1, "S_10" + i);
                pstmt.setString(2, "stu" + i);
                pstmt.setInt(3, 20 + i);
                pstmt.setString(4, i % 2 == 0 ? "male" : "female");
                pstmt.addBatch();
            }
            pstmt.executeBatch();

3.读取结果集中的数据


      ResultSet就是一张二维的表格,它内部有一个“行光标”,光标默认的位置在“第一行上方”,我们可以调用rs对象的next()方法把“行光标”向下移动一行,当第一次调用next()方法时,“行光标”就到了第一行记录的位置,这时就可以使用ResultSet提供的getXXX(int col)方法来获取指定列的数据了:
rs.next();//光标移动到第一行
rs.getInt(1);//获取第一行第一列的数据
当你使用rs.getInt(1)方法时,你必须可以肯定第1列的数据类型就是int类型,如果你不能肯定,那么最好使用rs.getObject(1)。在ResultSet类中提供了一系列的getXXX()方法,比较常用的方法有:
         Object getObject(int col)
         String getString(int col)
         int getInt(int col)
         double getDouble(int col)

4.关闭资源:


         与IO流一样,使用后的东西都需要关闭!关闭的顺序是先得到的后关闭,后得到的先关闭。

                  rs.close();
                  stmt.close();
                  con.close();

(四)全部代码:

1.注册驱动:


        Class.forName("com.mysql.jdbc.Driver");
        String url = "jdbc:mysql://localhost:3306/mydb1";
        Connection con =DriverManager.getConnection(url, "root", "123");
        Statement stmt = con.createStatement();

2.数据库操作


(1)插入数据:
public void insert() throws Exception {
        String sql = "insert into user values('zhangSan', '123')";
        stmt.executeUpdate(sql);
        System.out.println("插入成功!");
        }
(2)修改数据:
    public void update() throws Exception {
        Connection con = getConnection();
        Statement stmt = con.createStatement();
        String sql = "update user set password='456' where   username='zhangSan'";
        stmt.executeUpdate(sql);
        System.out.println("修改成功!");
    }
(3)查询和读取数据:
public void query() {
        Connection con = null;
        Statement stmt = null;
        ResultSet rs = null;
        try {
            String sql = "select * from user";
            rs = stmt.executeQuery(sql);
            while(rs.next()) {
                String username = rs.getString(1);
                String password = rs.getString(2);
                System.out.println(username + ", " + password);
            }
        } catch(Exception e) {
            throw new RuntimeException(e);
        } finally {
            try {
                if(rs != null) rs.close();
                if(stmt != null) stmt.close();
                if(con != null) con.close();
            } catch(SQLException e) {}
        }
(4)删除数据:
public void delete() throws Exception {
        Connection con = getConnection();
        Statement stmt = con.createStatement();
        String sql = "delete from user where username='zhangSan'";
        stmt.executeUpdate(sql);
        System.out.println("删除成功!");
        }

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值