暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

人大金仓数据库 JDBC 接口功能

数据猿 2023-09-21
392

1.概述

JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。

JUnit是一个Java语言的单元测试框架,
JUnit是一个开放源代码的Java测试框架,用于编写和运行可重复的测试。

2.具体内容

数据库接口

其实是一类软件。它用于将用户的请求行为翻译成数据库能够理解的特殊内容,交给数据库去执行;也将数据库中返回给应用的数据内容,翻译成应用能够理解的格式。这个翻译的依据,就是数据库的通讯协议。

JDBC简介:

JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API(应用程序编程接口),可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。

file

JDBC重要角色:

Driver、DriverManager、Connection、Statement、ResultSet。

Connection:

表示与特定数据库的连接,可以获取到数据库的一些信息,这些信息包括:其表信息,应该支持的SQL语法,数据库内有什么存储过程,此链接功能的信息等等。

Statement:

功能在于根据传入的sql语句,将传入sql经过整理组合成数据库能够识别的sql语句(对于静态的sql语句,不需要整理组合;而对于预编译sql语句和批量语句,则需要整理),然后传递sql请求,之后会得到返回的结果。对于查询sql,结果会以ResultSet的形式返回。

file

ResultSet:

ResultSet对象是sql语句查询的结果,作为数据库结果的映射,其映射关系如下图所示。ResultSet对从数据库返回的结果进行了封装,使用迭代器的模式逐条取出结果集中的记录。

file

JDBC主要成员关系:

file

JDBC 操作数据库步骤:

1.加载JDBC驱动程序

2.取得数据库连接

3.执行各种SQL语句

  • 执行静态的SQL语句对象
  • 执行预编译SQL语句对象
  • 执行数据库存储过程

4.获取查询结果

5.关闭数据库连接

加载JDBC驱动程序

三种加载方式:

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

DriverManager.registerDriver(new com.mysql.jdbc.Driver())

System.setProperty(“jdbc.drivers”,”com.mysql.jdbc.Driver”);

前期准备:

首先在本地数据库创建表student

file

其次需要导入驱动jar包,通过Maven对jar包进行管理,将jar包导入maven本地仓库,需要在命令行下执行如下命令:

mvn install:install-file -DgroupId=com. -DartifactId= -Dversion= -Dfile=D:\ .jar

file

通过pom.xml文件对依赖进行管理

file

举例1:验证Class.forName(“com.mysql.jdbc.Driver”);

public class demo1 {
    public static void main(String[] args) {
        try{
            Class.forName("com.kingbase8.Driver");//加载数据库驱动
            String url="jdbc:kingbase8://10.11.2.xx:1212/test";//数据库连接子协议
            Connection conn=DriverManager.getConnection(url,"system","123456");
            Statement stmt=conn.createStatement();
            ResultSet rs=stmt.executeQuery("select * from student");
            while(rs.next()){//不断指向下一条记录
                System.out.println("DeptNo:"+rs.getInt(1));
                System.out.println("\tDeptName:"+rs.getString(2));
                System.out.println("\tLOC:"+rs.getString(3));
            }
            rs.close();
            stmt.close();
            conn.close();
        }catch(ClassNotFoundException e){
            System.out.println("找不到指定的驱动程序类!");
        }catch(SQLException e){
            e.printStackTrace();
        }
    }
}

执行结果:

file

举例2:验证DriverManager.registerDriver(new com.mysql.jdbc.Driver())

public class demo3 {
    public static void main(String[] args) {
        try{
            new com.kingbase8.Driver();//创建driver对象,加载数据库驱动
            String url="jdbc:kingbase8://10.11.2.39:54321/test";//数据库连接子协议
            Connection conn= DriverManager.getConnection(url,"system","123456");
            Statement stmt=conn.createStatement();
            ResultSet rs=stmt.executeQuery("select * from student");
            while(rs.next()){//不断指向下一条记录
                System.out.println("ID:"+rs.getInt(1));
                System.out.println("\tage:"+rs.getString(2));
                System.out.println("\tname:"+rs.getString(3));
            }
            rs.close();
            stmt.close();
            conn.close();
        }catch(SQLException e){
            e.printStackTrace();
        }
    }
}

执行结果:

file

举例3:验证System.setProperty(“jdbc.drivers”,”com.mysql.jdbc.Driver”);

public class demo4 {
    public static void main(String[] args) {
        try{
            System.setProperty("jdbc.driver","com.kingbase8.Driver");//系统属性指定数据库驱动
            String url="jdbc:kingbase8://10.11.2.39:54321/test";//数据库连接子协议
            Connection conn= DriverManager.getConnection(url,"system","123456");
            Statement stmt=conn.createStatement();
            ResultSet rs=stmt.executeQuery("select * from student");
            while(rs.next()){//不断指向下一条记录
                System.out.println("ID:"+rs.getInt(1));
                System.out.println("\tage:"+rs.getString(2));
                System.out.println("\tname:"+rs.getString(3));
            }
            rs.close();
            stmt.close();
            conn.close();
        }catch(SQLException e){
            e.printStackTrace();
        }
    }
}

执行结果:

file

执行静态的SQL语句对象-Statement

•Statement接口的executeQuery(String sql)方法将执行查询(select)语句,执行成功后,将返回一个ResultSet类型的结果集对象,该对象将存储所有满足查询条件的数据库记录。
•Statement接口的executeUpdate(String sql)方法将执行添加(insert)、修改(update)和删除(delete)的SQL语句,执行成功后,将返回一个int型数值,该数值为影响数据库记录的行数。

举例:演示executeUpdate(String sql)

public class demo4 {
    public static void main(String[] args) {
        try{
            System.setProperty("jdbc.driver","com.kingbase8.Driver");//系统属性指定数据库驱动
            String url="jdbc:kingbase8://10.11.2.39:54321/test";//数据库连接子协议
            Connection conn = DriverManager.getConnection(url,"system","123456");
            Statement stmt = conn.createStatement();
            int num1 = stmt.executeUpdate("insert into student values (3,22,'cc')");
            ResultSet rs=stmt.executeQuery("select * from student");
            while(rs.next()){//不断指向下一条记录
                System.out.println("ID:"+rs.getInt(1));
                System.out.println("\tage:"+rs.getString(2));
                System.out.println("\tname:"+rs.getString(3));
            }
            rs.close();
            stmt.close();
            conn.close();
        }catch(SQLException e){
            e.printStackTrace();
        }
    }
}

执行结果:
file

数据库查看结果:
file

执行预编译SQL语句对象-PreparedStatement

举例演示:

public class demo5 {
    public static void main(String[] args) {
        try{
            System.setProperty("jdbc.driver","com.kingbase8.Driver");//系统属性指定数据库驱动
            String url="jdbc:kingbase8://10.11.2.39:54321/test";//数据库连接子协议
            Connection conn = DriverManager.getConnection(url,"system","123456");
            Statement stmt = conn.createStatement();
            PreparedStatement ps=conn.prepareStatement("insert into student values (?,?,?)");
            ps.setInt(1,5);
            ps.setInt(2,19);
            ps.setString(3,"cc");
            int num=ps.executeUpdate();
            PreparedStatement ps2 = conn.prepareStatement("select * from student where id = ?");
            ps2.setInt(1,5);
            ResultSet rs = ps2.executeQuery();
            while(rs.next()){//不断指向下一条记录
                System.out.println("ID:"+rs.getInt(1));
                System.out.println("\tage:"+rs.getString(2));
                System.out.println("\tname:"+rs.getString(3));
            }
            rs.close();
            stmt.close();
            conn.close();
        }catch(SQLException e){
            e.printStackTrace();
        }
    }
}

执行结果:

file

讨论:PreparedStatement与Statement的区别

(1)PreparedStatement是预编译的,即会先初始化sql,先把这条sql语句提交到数据库进行预处理,Statement不会初始化,没有预处理,每次都是从0开始执行SQL

(2)PreparedStatement可以替换变量,即可以用占位符“?”代替成变量,而Statement替换变量较为麻烦。

总结:PreparedStatement的第一次执行消耗是很高的,它的性能体现在重复执行,对于只执行一次的sql语句,选择statement是最好的,对于多次执行的sql语句,选择PreparedStatement是最好的。

执行数据库存储过程-CallableStatement

•CallableStatement接口的executeUpdate(String sql)方法将执行添加(insert)、修改(update)和删除(delete)的数据库的存储过程,执行成功后,将返回一个int型数值,该数值为影响数据库记录的行数。
•CallableStatement接口的executeQuery(String sql)方法将执行查询数据库的存储过程,执行成功后,将返回一个ResultSet类型的结果集对象,该对象将存储所有满足查询条件的数据库记录。

举例:

先创建一张表callable:并插入三条数据

file

public class demo6 {
    public static void main(String[] args) {
        try {
            System.setProperty("jdbc.driver","com.kingbase8.Driver");//系统属性指定数据库驱动
            String url="jdbc:kingbase8://10.11.2.39:54321/test";//数据库连接子协议
            Connection conn = DriverManager.getConnection(url,"system","123456");
            Statement stmt = conn.createStatement();
            /*
            存储过程语句, 该语句需在 oracle 兼容模式下执行
             */
            String sql = "create or replace procedure procName (inout id int,"
                    + " in name char(20), out salary float) as "
                    + "begin "
                    + "select number into id from callable "
                    + "where number = id and xm = name;"
                    + "select money into salary from callable "
                    + "where number = id and xm = name;"
                    + "end;";
            /*
             * 执行语句,创建 CallableStatement 对象
             */
            stmt.execute(sql);
            CallableStatement cstmt = conn.prepareCall("{call procName(?,?,?)}");
            /* 参数 1 为 INOUT 类型,参数 2 为 IN 类型,参数 3 为 OUT 类型 */
            /* 注册输出参数 */
            cstmt.registerOutParameter(1,Types.INTEGER);
            cstmt.registerOutParameter(3,Types.REAL);
            /* 设置输入参数 */
            cstmt.setInt(1,1);
            cstmt.setString(2, "aa");

            /* 获取参数信息 */
            ParameterMetaData pmd=cstmt.getParameterMetaData();

            /* 执行语句 */
            cstmt.execute();

            /* 获取输出参数值 */
            int intValue=cstmt.getInt(1);
            float floatValue=cstmt.getFloat(3);
            System.out.println(intValue);
            System.out.println(floatValue);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
}

执行结果:

file

Junit单元测试

JUnit是一个Java语言的单元测试框架,

JUnit是一个开放源代码的Java测试框架,用于编写和运行可重复的测试。

他是用于单元测试框架体系xUnit的一个实例(用于java语言)。

它包括以下特性:

1、用于测试期望结果的断言(Assertion)

2、用于共享共同测试数据的测试工具

3、用于方便的组织和运行测试的测试套件

4、图形和文本的测试运行器

常用注解:

A、@Before 注解:与junit3.x中的setUp()方法功能一样,在每个测试方法之前执行;

B、@After 注解:与junit3.x中的tearDown()方法功能一样,在每个测试方法之后执行;

C、@BeforeClass 注解:在所有方法执行之前执行;

D、@AfterClass 注解:在所有方法执行之后执行;

E、@Test(timeout = xxx) 注解:设置当前测试方法在一定时间内运行完,否则返回错误;

F、@Test(expected = Exception.class) 注解:设置被测试的方法是否有异常抛出。抛出异常类型为:Exception.class;

G、@Ignore 注解:注释掉一个测试方法或一个类,被注释的方法或类,不会被执行。

举例:

public class junitTest1 {
    private Calculator calculator;
    @Before
    public void init() {
        calculator = new Calculator();
    }
    @After
    public void close() {
        System.out.println("关闭资源");
    }
    @Test
    public void add() {
        int res = calculator.cut(10, 10);
        try {
            Assert.assertEquals(1, res);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
    @Test
    public void cut() {
        int res = calculator.cut(10, 10);
        try {
            Assert.assertEquals(0, res);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

执行结果:

cut方法:

file

add方法:

file

更多信息,参见https://help.kingbase.com.cn/v8/index.html

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论