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提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。
JDBC重要角色:
Driver、DriverManager、Connection、Statement、ResultSet。
Connection:
表示与特定数据库的连接,可以获取到数据库的一些信息,这些信息包括:其表信息,应该支持的SQL语法,数据库内有什么存储过程,此链接功能的信息等等。
Statement:
功能在于根据传入的sql语句,将传入sql经过整理组合成数据库能够识别的sql语句(对于静态的sql语句,不需要整理组合;而对于预编译sql语句和批量语句,则需要整理),然后传递sql请求,之后会得到返回的结果。对于查询sql,结果会以ResultSet的形式返回。
ResultSet:
ResultSet对象是sql语句查询的结果,作为数据库结果的映射,其映射关系如下图所示。ResultSet对从数据库返回的结果进行了封装,使用迭代器的模式逐条取出结果集中的记录。
JDBC主要成员关系:
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
其次需要导入驱动jar包,通过Maven对jar包进行管理,将jar包导入maven本地仓库,需要在命令行下执行如下命令:
mvn install:install-file -DgroupId=com. -DartifactId= -Dversion= -Dfile=D:\ .jar
通过pom.xml文件对依赖进行管理
举例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();
}
}
}
执行结果:
举例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();
}
}
}
执行结果:
举例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();
}
}
}
执行结果:
执行静态的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();
}
}
}
执行结果:
数据库查看结果:
执行预编译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();
}
}
}
执行结果:
讨论: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:并插入三条数据
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);
}
}
}
执行结果:
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方法:
add方法:
更多信息,参见https://help.kingbase.com.cn/v8/index.html