欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JDBC(二)

程序员文章站 2024-03-22 23:44:10
...

 1.1获取连接

1.1.1 获取连接步骤

数据库驱动包mysql-connector-java-5.1.37-bin下载链接:https://pan.baidu.com/s/1LiZ3ZHIGuLR_c1VVlMae3A 密码:iet9

  1. 导入数据库的驱动包(mysql-connector-java-5.1.37-bin.jar)。
  2. 在当前模块下上新建一个文件夹(lib),然后把jar包拷贝进去。(Ctrl+C 、Ctrl+V)
  3. 让当前的模块关联该jar包。
  4. 注册驱动(java程序需要通过驱动才能才能连接到数据库,因此需要注册驱动。mysql的驱动入口类是Driver)
  • 目标:如果获取到数据库的连接。
  • 步骤:
  1. 加载数据库的驱动类。
  2. 获取连接。 
  3. 从JDK5.0开始,Class.forname这句话可以省略不写。 考虑到系统的兼用性问题,所以还是建议写上

JDBC(二)

  • 示例代码:
package com.sunny.jdbc;

import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;

public class Test01 {
    public static void main(String[] args) throws Exception {
        // 协议://ip地址:端口号/访问的数据库
        String  url = "jdbc:mysql://localhost:3306/test";
        //数据库用户名
        String  user = "root";
        //数据库密码
        String password = "root";
        //1.把数据库的驱动类加载到内存中
        Class.forName("com.mysql.jdbc.Driver");//推荐使用
        // DriverManager.registerDriver(new Driver());  //更换驱动类的时候不好更换。需要修改源代码。
        //2.问驱动管理器获取连接
        Connection connection = DriverManager.getConnection(url,user,password);
        System.out.println("获取到的连接:"+connection);
    }
}

JDBC(二)

JDBC(二)

 疑问:Class.forName("com.mysql.jdbc.Driver");与Connection connection = DriverManager.getConnection(url,user,password);看起来没有任何关系?其实不是的,因为在加载Driver类的时候,其实它的目的是为了执行该类的静态代码块。而静态代码块中出现了DriverManager。我们来查看一下Driver的源码。

public class Driver extends NonRegisteringDriver implements java.sql.Driver {
    public Driver() throws SQLException {
    }

    static {
        try {
            DriverManager.registerDriver(new Driver());
        } catch (SQLException var1) {
            throw new RuntimeException("Can't register driver!");
        }
    }
}

 1.2 URL地址的组成

  • url=协议://ip地址:端口号/数据库名称
  • jdbc:mysql://localhost:3306/test

1.3 JDBC实现增删改查

 1.3.1准备表数据

-- 创建分类表
CREATE TABLE category (
  cid INT PRIMARY KEY AUTO_INCREMENT,
  cname VARCHAR(100)
);
-- 初始化数据
INSERT INTO category (cname) VALUES('家电');
INSERT INTO category (cname) VALUES('服饰');
INSERT INTO category (cname) VALUES('化妆品');

1.3.2 JDBC常用的方法

  • 注意:在java.sql.Connection 接口中有Statement createStatement()方法获取到Statement 对象。
  1. Statement createStatement()创建一个Statement对象来将SQL语句发送到数据库。
  2. boolean  execute(String sql)此方法可以执行任意的SQL语句。返回boolean值,表示是否返回ResultSet结果集。仅当执行Select语句,且有返回结果时返回true,其它语句返回false。
  3. int executeUpdate(String sql)根据执行的DML(INSERT、UPDATE、DELETE)语句,返回受影响的行数。
  4. ResultSet executeQuery(String sql)根据查询语句返回结果集,只能执行SELECT语句。
  •  使用步骤
  1. 注册驱动。
  2. 获取连接。
  3. 获取Statement对象。
  4. 使用Statement对象执行SQL语句。
  5. 释放资源。
package com.sunny.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
/*
目标 : 使用jdbc向数据库发送sql语句,创建表。
相关的类与方法:
Connection的方法:
      createStatement()   获取到一个运输器
      Statement(sql运输器)
      execute(sql)  执行sql语句
 */
public class Test02 {
    public static void main(String[] args) throws Exception {
        String url = "jdbc:mysql://localhost:3306/test";
        String user = "root";
        String password = "root";
        //第一步:获得连接
        Class.forName("com.mysql.jdbc.Driver");
        Connection connection = DriverManager.getConnection(url,user,password);
        //第二步:获取到sql运输器
        Statement st = connection.createStatement();
        String  sql = "create table student(id int primary key,name varchar(10));";
        //第三步:通知SQL运输器执行SQL
        boolean flag = st.execute(sql);
        System.out.println("sql语句执行后的结果是:"+flag);

        //关闭资源(关闭的原则:先开后关,后开先关)
        st.close();
        connection.close();

    }
}
  •  boolean  execute(String sql)此方法可以执行任意的SQL语句。返回boolean值,表示是否返回ResultSet结果集。仅当执行Select语句,且有返回结果时返回true,其它语句返回false。

JDBC(二)

JDBC(二)


1.3.3增删改代码演示

package com.sunny.jdbc;

import org.junit.Test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

/*
    目标:使用jdbc对数据库的数据进行增删改
    int executeUpdate(String sql)根据执行的DML(INSERT、UPDATE、DELETE)语句,返回受影响的行数
 */
public class Test03 {

    //往数据库的表添加数据
    @Test
    public void add() throws Exception {
        //获取到连接
        Connection connection = getConnection();
        //准备SQL语句,获取SQL运输器
        String sql = "insert into category(cname)values('烟酒')";
        Statement st = connection.createStatement();
        //执行SQL语句
        int num = st.executeUpdate(sql);
        System.out.println("影响的行数:"+num);

        //关闭资源
        st.close();
        connection.close();

    }

    //往数据库的表删除元素
    @Test
    public void delete() throws SQLException {
        //获得连接
        Connection connection = getConnection();
        //准备SQL语句,获得SQL运输器
        String sql = "delete from category where cname='家电'";
        Statement st = connection.createStatement();
        //执行SQL语句
        int num = st.executeUpdate(sql);
        System.out.println(num);
        //关闭资源
        st.close();
        connection.close();
    }
    //更新表中的数据
    @Test
    public void update() throws SQLException {
        //获取到连接
        Connection connection = getConnection();
        //准备SQL语句,获得SQL运输器
        String sql = "update category set cname='汽车' where Cid=2";
        Statement st = connection.createStatement();
        //执行SQL
        int num = st.executeUpdate(sql);
        System.out.println("影响的行数:"+num);
        //关闭资源
        st.close();
        connection.close();

    }


    public  Connection  getConnection() {
        Connection connection = null;
        try {
            //添加try-catch块,使用的快捷键是Ctrl+alt+t
            String url = "jdbc:mysql://localhost:3306/test";
            String user = "root";
            String password = "root";
            //获取连接
            Class.forName("com.mysql.jdbc.Driver");
            connection = DriverManager.getConnection(url, user, password);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return connection;
    }
}

1.3.4 查询

  •  一个SQL语句查询的时候会返回一个ResultSet对象,ResultSet对象代表了本次查询的结果集。

1.3.4.1ResultSet常用方法

  • Next()把结果集的(游标)指针向下移动一个单位。如果可以移动返回true,否则返回false。

JDBC(二)

 1.3.4.2 ResultSet内部工作原理

  • 将一个二维表格数据封装成ResultSet对象,ResultSet内部有一个游标(指针),默认指向结果集的开始位置。
  • next()方法:1.将指针向后移动一行。2.返回的是boolean类型,true指针指向的位置还有记录,false指针指向的位置没有记录。
  • 获得游标指向那行的数据:rs.getXxx(String columnLabel):通过字段名获取值/rs.getXxx(int columnIndex):通过字段序号获得值。

JDBC(二)

  1.3.4.3 查询的结果示例

package com.sunny.jdbc;
import org.junit.Test;
import java.sql.*;
import java.util.Collection;
/*
    目标:使用jdbc对数据进行查询
    如果是查询,需要使用statement的executeQuery()方法
    需要新增的类:ResultSet(结果集),ResultSet需要使用到的方法:
    1.next()把当前指针往下移动一个单元
    2.getXX(name)指定列名获取数据
 */
public class Test04 {

    @Test
    public void query() throws Exception {
        //获得连接
        Connection connection = getConnection();
        //准备SQL语句,获得SQL运输器
        String sql = "select* from category";
        Statement st = connection.createStatement();
        //执行SQL语句,executeQuery返回的是一个结果集ResultSet。
        ResultSet rs = st.executeQuery(sql);//本次SQL语句查询的数据已经全部都封装到ResultSet里面去了
        //从ResultSet里面取出想应的数据
        //next()方法时把结果集的指针往下移动一个单元
        while (rs.next()){
            int cid = rs.getInt("cid");
            String cname = rs.getString("cname");
            System.out.println("编号:"+cid+"类名"+cname);
        }

        //关闭资源
        rs.close();
        st.close();
        connection.close();
    }

    public  Connection  getConnection() {
        Connection connection = null;
        try {
            //添加try-catch块,使用的快捷键是Ctrl+alt+t
            String url = "jdbc:mysql://localhost:3306/test";
            String user = "root";
            String password = "root";
            //获取连接
            Class.forName("com.mysql.jdbc.Driver");
            connection = DriverManager.getConnection(url, user, password);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return connection;
    }
}

如果需要提示信息,按下ctrl+q

JDBC(二)


2.1JDBC工具类编写

  •  我们发生不管我们是在做增、删除、修改、查询都需要获取Connection连接,使用完毕之后我们都要关闭连接,这些工作是不断重复在做的事情,所以我们可以把这些工作定义成为一个工具类的方法,减少我们重复编写代码。
package Utils;

import java.sql.*;
import java.util.Collection;
/*
    工具类
 */
public class JDBCUtils {

    public static final String DIVERCLASS = "com.mysql.jdbc.Driver";
    public  static final String URL = "jdbc:mysql://localhost:3306/test";
    public static  final String USER = "root";
    public static  final String PASSWORD = "root";

    //每次别人获取连接的时候,都需要加载该类。但是一个类只需要加载一次就够了。静态代码块只需要执行一次。
    static {
        try {
            Class.forName(DIVERCLASS);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    //连接
    public static Connection getConnection() {
        Connection connection = null;
        try {
           connection = DriverManager.getConnection(URL,USER,PASSWORD);
            return connection;
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return connection;
    }

    //关闭资源
    public static void close(ResultSet rs, Statement  st,Connection conn){
        if(rs!=null){
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(st!=null){
            try {
                st.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(conn!=null){
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

使用工具类改进查询

public class Demo4 {



    //查询
    @Test
    public void query() throws SQLException {
        //第一步: 获取连接
        Connection connection = JDBCUtils.getConnection();
        //第二步: 准备sql语句,得到sql的运输器
        String sql = "select * from category";
        Statement st = connection.createStatement();

        //第三步:执行sql语句, executeQuery 返回的是一个结果集ResultSet 。  如果需要提示信息,按下ctrl+q
        ResultSet rs = st.executeQuery(sql);  //本次sql语句查询的数据已经全部都封装到ResultSet里面去了。


        //第四步:从ReusltSet中取出相应的数据。

        //next() 方法是把结果集的指针往下移动一个单元,如果可以移动,那么返回true,否则返回false.
        while(rs.next()){
            int cid = rs.getInt("cid");
            String cname = rs.getString("cname");
            System.out.println("编号:"+cid+" 类名:"+cname);
        }


        //第五步:关闭资源
        JDBCUtils.close(rs,st,connection);
    }
}

关于JDBC的其它内容详见上一篇博客JDBC(一)https://blog.csdn.net/Huangyuhua068/article/details/82024782