JDBC(1)

2022-09-19

jar文件

首先创建一个module提供jar文件,在module下写一个类:

public class Dept {
    private Integer deptNo;
    private String name;
    private String loc;

    public Dept() {
    }

    public Dept(Integer deptNo, String name, String loc) {
        this.deptNo = deptNo;
        this.name = name;
        this.loc = loc;
    }

    public Integer getDeptNo() {
        return deptNo;
    }

    public void setDeptNo(Integer deptNo) {
        this.deptNo = deptNo;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getLoc() {
        return loc;
    }

    public void setLoc(String loc) {
        this.loc = loc;
    }
}

然后打包成jar包,为第二个工程做帮助,如何打包:

左上角File => Project Structure => Artifacts =>Jar

先建一个empty的jar,然后把右边想打成jar包的文件拖到左边jar01.jar的位置:

image-20220814173314108

apply后点上面的build,build artifacts:

image-20220814173521285

成功后会出现out目录。

然后通过idea将jar包移动到需要类文件的工程中,复制粘贴即可然后还需要add as lib,这样该工程就能用jar包里的java类了:

image-20220814174136970

写个类测试:

public class demo01 {
    //测试能否使用jar包里的dept类
    public static void main(String[] args) {
        Dept dept = new Dept(1,"bo","四川");
        System.out.println(dept.getDeptNo()+dept.getLoc()+dept.getName());
    }

JDBC规范

  • javaee中的一种规范
  • 指定Java类与数据库服务器的沟通规则
  • JDBC提供接口存在JDKJAR包中(java.sql包)
    • JDBC的规范接口实现类由不同数据库服务器产商以JAR包形式提供
    • 想访问哪个数据库(mysql,oracle)就由哪种实现类的jar包与之沟通

JDBC使用规则

image-20220814175434565

比如我们现在想访问mysql服务器,就需要从mysql取得提供的特殊实现类jar包,并且把jar包呢加入我们的工程中(maven中可以导入依赖)。

JDBC规范调用流程

1.将mysql服务器厂商提供的Driver接口实现类注册到JVM

2.通过JDBC规范中的DriverManager在Java工程与MySQL服务器之间建立一个“连接通道”

3.通过mysql服务器厂商提供的connection接口实现类建立一个交通工具 【PreparedStatement

4.通过交通工具 【PreparedStatement】将sql命令从java工程推送到mysql服务器执行并带回执行结果。

5.销毁本次交易过程中涉及到的所有资源对象。

image-20220814181134586

JDBC规范下接口介绍

1.位置

JDBC规范下接口存在于JDK_1.8.jar下java.sql包

2.分类

1) java.sql.DriveManager类:这个类负责将数据库产商提供的Driver接口实现进行注册,在Java工程与MySQL服务器之间建立一个“连接通道”(io流) 2) java.sql.connection接口:负责管理Java工程与数据库服务器之间的连接通道 3) java.sql.PreparedStatement:负责在连接通道上建立交通工具 4) java.sql.ResultSet:负责管理数据库服务器返回的临时表

JDBC开发事例

先导入mysql提供的jar包:

image-20220814190543203

按使用流程进行开发:

   public static void main(String[] args) throws Exception{
        //1.将mysql服务器所提供的的jar包中的Driver接口实现类注册到jvm
        Driver driver = new com.mysql.jdbc.Driver();
        DriverManager.registerDriver(driver);

        String sql = "insert into t_departments(DEPARTMENT_ID,DEPARTMENT_NAME,MANAGER_ID,LOCATION_ID) values('300','300','300','300')";
        String url = "jdbc:mysql//localhost:3306/companydb";
        //2.通过DriverManager在Java工程和mysql服务器间建立连接通道,相当于Java工程登录mysql
        //参数分别为url,user,password,url:  "jdbc:mysql//服务器所在计算机IP地址:服务器端口号/某个数据库
        Connection connection = DriverManager.getConnection(url, "root", "123456");

        //3.通道有了,需要交通工具,把sql命令装进去
        PreparedStatement preparedStatement = connection.prepareStatement("");

        //4.通过交通工具把sql推送到mysql服务器上,并带回执行结果
        int result = preparedStatement.executeUpdate(sql);

        //5.销毁相关资源
        if (preparedStatement!=null){
            preparedStatement.close();
        }
        if (connection!=null){
            connection.close();
        }
        System.out.println("本次交易中添加了"+result+"行数据");
    }
}

报错集

启动测试后报错:

 `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.

根据错误提示修改代码,把驱动换成新的(加上cj):

Driver driver = new com.mysql.cj.jdbc.Driver();

下一行代码出现了新的错误:

No suitable driver found for jdbc:mysql//localhost:3306/companydb

发现是url格式错误jdbc:mysql//localhost:3306/companydb

mysql后面少了一个冒号,所以应该是:jdbc:mysql://服务器所在计算机IP地址:服务器端口号/某个数据库

更改好后又有一个新的错误:SQL String cannot be empty

字面意思,preparedStatement后面的sql语句不能为空,把写好的sql语句填上去即可:

PreparedStatement preparedStatement = connection.prepareStatement("sql");

修改完成后,打开表,发现多了一行全是300的数据,成功:

image-20220815104116581

优化和注意

第二种加载驱动的方式(最好用这个):

Class.forName("com.mysql.cj.jdbc.Driver");
excute

preparedStatement.executeUpdate(sql) update是对表进行更新操作时调用的方法,如果是查询操作就是excuteQuery返回ResultSet结果集

示例2,推送更新命令

    public static void main(String[] args) throws Exception{
        Class.forName("com.mysql.cj.jdbc.Driver");

        String url = "jdbc:mysql://localhost:3306/companydb";
        Connection connection = DriverManager.getConnection(url, "root", "123456");

        String sql = "update t_departments set DEPARTMENT_NAME='ikun' where DEPARTMENT_ID>='300'";
        PreparedStatement preparedStatement = connection.prepareStatement(sql);

        System.out.println(preparedStatement.executeUpdate(sql));

        if (preparedStatement!=null){
            preparedStatement.close();
        }
        if (connection!=null){
            connection.close();
        }

    }

查看表的更新:

image-20220815112358984

ResultSet接口(推送查询命令)

preparedStatement.excuteQuery:

  • 负责推送查询命令
  • 返回结果是查询命令得到临时表,在JDBC规范中,临时表交给ResultSet接口实现类管理

获取临时表信息:

resultset的next()方法:每次执行时要求指针向下移动一行,如果指针指向位置是一个具体数据行,此时next方法将返回true,没有数据行了就返回false了。

我们可以用这个方法来作为循环结束的条件,用循环体来寻找get我们需要的信息

    public static void main(String[] args) throws Exception{
        Class.forName("com.mysql.cj.jdbc.Driver");

        String url = "jdbc:mysql://localhost:3306/companydb";
        Connection connection = DriverManager.getConnection(url, "root", "123456");

        String sql = "select * from t_departments";
        PreparedStatement preparedStatement = connection.prepareStatement(sql);

        //获取临时表
        ResultSet resultSet = preparedStatement.executeQuery(sql);
        //通过ResultSet来获取临时表数据
        while (resultSet.next()){
            String department_name = resultSet.getString("DEPARTMENT_ID");
            String manager_id = resultSet.getString("MANAGER_ID");
            System.out.println("部门名称:"+department_name+"经理id:"+manager_id);
        }
        if (resultSet!=null){
            resultSet.close();
        }
        if (preparedStatement!=null){
            preparedStatement.close();

        }
        if (connection!=null){
            connection.close();
        }
    }

最后注意关闭资源,先开的后关。

结果:

部门名称10经理id200
部门名称100经理id108
部门名称110经理id205
部门名称120经理idnull
部门名称130经理idnull
部门名称140经理idnull
部门名称150经理idnull