发表于: 2017-07-14 19:55:53
1 1053
子任务17
上次日报 的JDBC部分写的不是很详细。 投机取巧没去研究下 Java原生JDBC部分。这次给填上。
先建好 目录结构,并导入mysql的连接包,也就用到了包里面的驱动。
model包里面是 数据表的映射类。StudentDao类是接口,StudentDaoImp是接口的实现。App是程序入口。
我们来 看看这个实现类怎么写:
package me.flyingming.dao.imp;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import me.flyingming.dao.StudentDao;
import me.flyingming.model.Student;
public class StudentDaoImp implements StudentDao {
public Connection getConnection() throws ClassNotFoundException,
SQLException {
// 加载MySQL JDBC驱动
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://127.0.0.1:3306/test";
String username = "root";
String password = "123456";
// 创建MySQL 数据库连接类的实例
Connection conn = DriverManager.getConnection(url, username, password);
System.out.println("Database connection established");
return conn;
}
public void insertStudent(Student student) {
Connection conn = null;
try {
conn = getConnection();
} catch (ClassNotFoundException | SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try {
//禁用自动提交
conn.setAutoCommit(false);
System.out.println("默认的事务隔离级别" + conn.getTransactionIsolation());
//用conn创建Statement对象实例
Statement sql_statement = conn.createStatement();
//插入数据
sql_statement.executeUpdate("insert into student (name,score) values ('" + student.getName() +"'," + student.getScore() +")" );
System.out.println("Insert success");
//提交事务
conn.commit();
} catch (Exception e){
if (conn != null){
//关闭连接
try{
conn.close();
System.out.println("Database connection terminated");
} catch (Exception ex) {
}
}
}
}
}
我写的很简单,就实现了一个 插入数据行的方法。
我们来研究下这个方法的具体流程。
1. 加载驱动
Class.forName("com.mysql.jdbc.Driver");
2.创建连接实例
驱动被加载后,就可以用DriverManager来生成一个实例了
String username = "root";
String password = "123456";
Connection conn = DriverManager.getConnection(url, username, password);
3.利用连接实例来创建Statement实例
//用conn创建Statement对象实例
Statement sql_statement = conn.createStatement();
4.利用statement实例 来执行SQL操作
sql_statement.executeUpdate("insert into student (name,score) values ('" + student.getName() +"'," + student.getScore() +")" );
5.提交事务
conn.commit();
事务,是一个数据库的概念。指的是 一组SQL操作,这组操作作为一个整体,要么全成功,要么全失败。举例,从银行给人家汇20元钱,是要分为两个步骤的。1.从你账户扣除20 2.人家账户增加20。假如没有事务的话,有可能会出现 1操作成功,而2失败,这就有bug了。所以我们用 事务这个概念把12两个操作包起来,要么汇款成功,要么失败。
原本的JDBC中,一项数据库操作代表一项事务,所以进行一项数据库操作时候,会自动提交。本例里面,我们用一个try将一些操作(其实也是一个数据库操作。。)包起来,形成一个事务。所以,我们用setAutoCommit(false)来禁止了自动提交,几项操作完成之后,才手动commit()。
6.关闭连接
conn.close();
这就是原生JDBC的全部步骤了。一般实现的时候,我们会把 重复步骤,比如 加载驱动,创建连接实例,关闭连接什么的 提取出来放在一个方法里,简化一下代码。
子任务18
注解分好多种,我们可以用不同种类的注解来设计不同的测试。
@BeforeClass:针对所有测试,只执行一次,且必须为static void
@Before:初始化方法
@Test:测试方法,在这里可以测试期望异常和超时时间
@After:释放资源
@AfterClass:针对所有测试,只执行一次,且必须为static void
@Ignore:忽略的测试方法
Assert断言,一些重要方法如下:
void assertEquals(boolean expected, boolean actual)
void assertFalse(boolean condition)
void assertNotNull(Object object)
void assertTrue(boolean condition)
等
TestCaset测试Case,运行测试的一些方法。一些重要方法如下:
int countTestCases()
String getName()
TestResult createResult()
void run(TestResult result)
void setUp()
void tearDown()
TestResult测试结果,用来收集所有执行测试案例的结果。一些重要方法如下:
void addError(Test test, Throwable t)
void addFailure(Test test, AssertionFailedError t)
void endTest(Test test)
int errorCount()
Enumeration errors()
int failureCount()
void run(TestCase test)
int runCount()
拿子任务17做一个例子,StudentDaoImpTest这个类,怎么写单元测试呢?
得写 获取 SQL操作的返回值result,断言这个返回值。
如果有 写 查询方法的话,还可以配合查询方法 来断言 是否插入成功。我就不写了,有点麻烦。
今天完成的事情: 学习了原生的JDBC写法。学习了一些Junit知识。
明天计划的事情:搭建Spring框架,学写一个小例子
评论