发表于: 2017-07-14 19:55:53

1 1054


子任务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 url = "jdbc:mysql://127.0.0.1:3306/test";
  String username = "root";
  String password = "123456";
  // 创建MySQL 数据库连接类的实例
  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


Junit用来测试Java的一个框架。
Junit中最重要的程序包是junit.framework,他包含所有的核心类,比如Assert、TestCase、TestResult、TestSuite等。
测试里面的方法有很多,得自己来设计。根据不同的测试要求,选用不同的测试方法。比如 我想测试一个方法的值,我可以使用assert断言。再比如,有一个方法  设计出来就是让他抛出一个错误,那就用使用注解@Test(expected = XXXException.class)
注解分好多种,我们可以用不同种类的注解来设计不同的测试。
@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框架,学写一个小例子







返回列表 返回列表
评论

    分享到