Apache Derby是关系型数据库,可以嵌入式方式运行,也可以独立运行,当使用嵌入式方式运行时常用于单元测试,本篇我们就使用单元测试来探索Apache Derby的使用
打开IDEA创建Maven项目,这里我使用的JDK版本为1.8版本。

- <dependency>
- <groupId>org.springframeworkgroupId>
- <artifactId>spring-jdbcartifactId>
- <version>4.3.30.RELEASEversion>
- dependency>
- <dependency>
- <groupId>org.apache.derbygroupId>
- <artifactId>derbyartifactId>
- <version>10.14.2.0version>
- <scope>testscope>
- dependency>
- <dependency>
- <groupId>junitgroupId>
- <artifactId>junitartifactId>
- <version>4.13.1version>
- <scope>testscope>
- dependency>
这里使用spring-jdbc主要是为了使用spring执行SQL脚本、执行SQL语句时使用;嵌入式运行Apache Derby需要引入derby的包;单元测试引入了junit
在src/test/resources下新建demo.sql
- DROP TABLE T_USER;
-
- CREATE TABLE T_USER(
- id INT NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
- username VARCHAR(255) NOT NULL
- );
-
- INSERT INTO T_USER(username) VALUES('张三'),('李四'),('王五');
脚本中我们删除并创建了T_USER表,向表中插入了三条数据。
在src/test/java下新建cn.horse.demo包,在包下新建DatabaseTest类
- package cn.horse.demo;
-
- import org.junit.Before;
- import org.junit.Test;
- import org.springframework.core.io.ClassPathResource;
- import org.springframework.jdbc.core.JdbcTemplate;
- import org.springframework.jdbc.core.RowCallbackHandler;
- import org.springframework.jdbc.datasource.DriverManagerDataSource;
- import org.springframework.jdbc.datasource.init.ScriptUtils;
-
- import javax.sql.DataSource;
- import java.sql.ResultSet;
- import java.sql.SQLException;
-
- public class DatabaseTest {
-
- static final DataSource dataSource;
- static final JdbcTemplate jdbcTemplate;
- static {
- DriverManagerDataSource driverManagerDataSource = new DriverManagerDataSource();
- driverManagerDataSource.setDriverClassName("org.apache.derby.jdbc.EmbeddedDriver");
- driverManagerDataSource.setUrl("jdbc:derby:demo;create=true");
- driverManagerDataSource.setUsername("");
- driverManagerDataSource.setPassword("");
- dataSource = driverManagerDataSource;
- jdbcTemplate = new JdbcTemplate(dataSource);
- }
-
- @Before
- public void init() throws SQLException {
- ScriptUtils.executeSqlScript(dataSource.getConnection(), new ClassPathResource("demo.sql"));
- }
- }
DatabaseTest类中我们在类加载时初始化了数据源和JdbcTemplate对象;在单元测试执行之前,我们执行了初始化脚本;
在DatabaseTest类中新增查询方法
- @Test
- public void find() {
- query();
- }
-
- private void query() {
- jdbcTemplate.query("SELECT id, username FROM T_USER", new RowCallbackHandler() {
- @Override
- public void processRow(ResultSet rs) throws SQLException {
- System.out.println("id: " + rs.getInt("id") + ", username: " + rs.getString("username"));
- }
- });
- }
执行单元测试的结果如下:

在DatabaseTest类中新增添加方法
- @Test
- public void add() {
- jdbcTemplate.execute("INSERT INTO T_USER(username) VALUES('赵六')");
- query();
- }
执行单元测试的结果如下:

在DatabaseTest类中新增更新方法
- @Test
- public void update() {
- jdbcTemplate.execute("UPDATE T_USER SET username='张三1' WHERE id = 1");
- query();
- }
执行单元测试的结果如下:

在DatabaseTest类中新增删除方法
- @Test
- public void delete() {
- jdbcTemplate.execute("DELETE FROM T_USER WHERE id = 1");
- query();
- }
执行单元测试的结果如下:
