1 jdbc配置
数据库与数据源不是同一个东西。。。
三层关键概念需要理解
- 数据库驱动mysql、hsqldb
- 数据源datasource和数据库连接池Harica、Druid
- 数据库操作工具JDBCTemplates、Mybatis
数据源配置
pom.xml
1 2 3 4
| <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency>
|
嵌入式数据库驱动
嵌入式数据库支持:H2、HSQL、Derby。不需要任何配置,被集成到springboot的jar包当中。
1 2 3 4 5
| <dependency> <groupId>org.hsqldb</groupId> <artifactId>hsqldb</artifactId> <scope>runtime</scope> </dependency>
|
mysql数据库驱动
1 2 3 4
| <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency>
|
1 2 3 4
| spring.datasource.url=jdbc:mysql://localhost:3306/test spring.datasource.username=dbuser spring.datasource.password=dbpass spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver//定义了数据引擎
|
自动配置
- DataSourceAutoConfiguration
- DataSourceTransactionAutoConfiguration
- JdbcTemplateAutoConfiguration
- JndiAutoConfiguration
连接JNDI数据源
JNDI,避免了程序与数据库之间的紧耦合,是指更容易配置和部署。
JNDI不需要用户使用java代码与数据库建立连接,而是将连接交给应用服务器进行管理。java负责与应用服务器上的JNDI通信。
1
| spring.datasource.jndi-name=java:jboss/datasources/customers
|
2 JdbcTemplate操作数据库
准备数据库
1 2 3 4
| CREATE TABLE `User` ( `name` varchar(100) COLLATE utf8mb4_general_ci NOT NULL, `age` int NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci
|
编写领域对象
并不是MVC的一部分。数据层,实现数据访问
1 2 3 4 5 6 7 8
| @Data @NoArgsConstructor public class User {
private String name; private Integer age;
}
|
编写数据访问对象
并非MVC的一部分。服务层,实现业务逻辑
- 定义包含插入、删除、查询的抽象接口UserService
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| public interface UserService {
int create(String name, Integer age);
List<User> getByName(String name);
int deleteByName(String name);
int getAllUsers();
int deleteAllUsers();
}
|
- 通过jdbcTemplate实现Userservice中定义的操作。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| @Service public class UserServiceImpl implements UserService {
private JdbcTemplate jdbcTemplate;
UserServiceImpl(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; }
@Override public int create(String name, Integer age) { return jdbcTemplate.update("insert into USER(NAME, AGE) values(?, ?)", name, age); }
@Override public List<User> getByName(String name) { List<User> users = jdbcTemplate.query("select NAME, AGE from USER where NAME = ?", (resultSet, i) -> { User user = new User(); user.setName(resultSet.getString("NAME")); user.setAge(resultSet.getInt("AGE")); return user; }, name); return users; }
@Override public int deleteByName(String name) { return jdbcTemplate.update("delete from USER where NAME = ?", name); }
@Override public int getAllUsers() { return jdbcTemplate.queryForObject("select count(1) from USER", Integer.class); }
@Override public int deleteAllUsers() { return jdbcTemplate.update("delete from USER"); }
}
|
编写单元测试用例
创建对UserService的单元测试用例,通过创建、删除和查询来验证数据库操作的正确性。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| @RunWith(SpringRunner.class) @SpringBootTest public class Chapter31ApplicationTests {
@Autowired private UserService userSerivce;
@Before public void setUp() { userSerivce.deleteAllUsers(); }
@Test public void test() throws Exception { userSerivce.create("Tom", 10); userSerivce.create("Mike", 11); userSerivce.create("Didispace", 30); userSerivce.create("Oscar", 21); userSerivce.create("Linda", 17);
List<User> userList = userSerivce.getByName("Oscar"); Assert.assertEquals(21, userList.get(0).getAge().intValue());
Assert.assertEquals(5, userSerivce.getAllUsers());
userSerivce.deleteByName("Tom"); userSerivce.deleteByName("Mike");
Assert.assertEquals(3, userSerivce.getAllUsers());
}
}
|