## 1 jdbc配置 > 数据库与数据源不是同一个东西。。。 ### 数据源配置 pom.xml ``` org.springframework.boot spring-boot-starter-jdbc ``` ### 嵌入式数据库支持 嵌入式数据库支持:H2、HSQL、Derby。不需要任何配置,被集成到springboot的jar包当中。 ``` org.hsqldb hsqldb runtime ``` ### 连接mysql数据库 * 引入mysql依赖包 ``` mysql mysql-connector-java ``` * 配置数据源信息 ``` 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//定义了数据引擎 ``` ### 连接JNDI数据源 JNDI,避免了程序与数据库之间的紧耦合,是指更容易配置和部署。 JNDI不需要用户使用java代码与数据库建立连接,而是将连接交给应用服务器进行管理。java负责与应用服务器上的JNDI通信。 ``` spring.datasource.jndi-name=java:jboss/datasources/customers ``` ## 2 使用jdbcTemplate操作数据库 ### 准备数据库 ``` 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的一部分。数据层,实现数据访问) ``` @Data @NoArgsConstructor public class User { private String name; private Integer age; } ``` ### 编写数据访问对象(并非MVC的一部分。服务层,实现业务逻辑) * 定义包含插入、删除、查询的抽象接口UserService ``` 定义包含有插入、删除、查询的抽象接口UserService public interface UserService { /** * 新增一个用户 * * @param name * @param age */ int create(String name, Integer age); /** * 根据name查询用户 * * @param name * @return */ List getByName(String name); /** * 根据name删除用户 * * @param name */ int deleteByName(String name); /** * 获取用户总量 */ int getAllUsers(); /** * 删除所有用户 */ int deleteAllUsers(); } ``` * 通过jdbcTemplate实现Userservice中定义的操作。 ``` @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 getByName(String name) { List 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的单元测试用例,通过创建、删除和查询来验证数据库操作的正确性。 ``` @RunWith(SpringRunner.class) @SpringBootTest public class Chapter31ApplicationTests { @Autowired private UserService userSerivce; @Before public void setUp() { // 准备,清空user表 userSerivce.deleteAllUsers(); } @Test public void test() throws Exception { // 插入5个用户 userSerivce.create("Tom", 10); userSerivce.create("Mike", 11); userSerivce.create("Didispace", 30); userSerivce.create("Oscar", 21); userSerivce.create("Linda", 17); // 查询名为Oscar的用户,判断年龄是否匹配 List userList = userSerivce.getByName("Oscar"); Assert.assertEquals(21, userList.get(0).getAge().intValue()); // 查数据库,应该有5个用户 Assert.assertEquals(5, userSerivce.getAllUsers()); // 删除两个用户 userSerivce.deleteByName("Tom"); userSerivce.deleteByName("Mike"); // 查数据库,应该有5个用户 Assert.assertEquals(3, userSerivce.getAllUsers()); } } ```