https://www.bilibili.com/video/av47952931?p=38
数据库部分
继续用上次的表

在基于xml的案例上修改
(加上整合junit的部分,具体记录在笔记8)
pom.xml加上整合junit需要的依赖spring-test
junit版本4.12及以上
beans.xml名称空间需要修改
在Spring文档中搜索xmlns:context(基于xml时是xmlns)找名称空间
配置Service和Dao的部分可以不要了
加上component-scan告知Spring在创建容器时要扫描的包
实体类、接口没有变化
业务层实现类AccountServiceImpl加注解
@Service(“accountService”)
变量accountDao上加注解,由于只有一个AccountDao,可以用@Autowired
对应的set方法可以删掉
持久层实现类AccountDaoImpl加注解
@Repository(“accountDao”)
runner同样用@Autowired,set方法删掉
测试类改为整合junit的写法
完整代码
项目结构
pom.xml
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 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
   | <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">     <modelVersion>4.0.0</modelVersion>
      <groupId>com.coconutnut</groupId>     <artifactId>day02_02_account_xml</artifactId>     <version>1.0-SNAPSHOT</version>          <packaging>jar</packaging>
           <dependencies>                  <dependency>             <groupId>org.springframework</groupId>             <artifactId>spring-context</artifactId>             <version>5.0.2.RELEASE</version>         </dependency>
      	         <dependency>             <groupId>org.springframework</groupId>             <artifactId>spring-test</artifactId>             <version>5.0.2.RELEASE</version>         </dependency>
                   <dependency>             <groupId>commons-dbutils</groupId>             <artifactId>commons-dbutils</artifactId>             <version>1.4</version>         </dependency>
                   <dependency>             <groupId>mysql</groupId>             <artifactId>mysql-connector-java</artifactId>             <version>8.0.16</version>         </dependency>
                   <dependency>             <groupId>com.mchange</groupId>             <artifactId>c3p0</artifactId>             <version>0.9.5.2</version>         </dependency>
                   <dependency>             <groupId>junit</groupId>             <artifactId>junit</artifactId>             <version>4.12</version>         </dependency>     </dependencies>
  </project>
   | 
 
beans.xml
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
   | <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"        xmlns:context="http://www.springframework.org/schema/context"        xsi:schemaLocation="http://www.springframework.org/schema/beans         http://www.springframework.org/schema/beans/spring-beans.xsd         http://www.springframework.org/schema/context         http://www.springframework.org/schema/context/spring-context.xsd">
      <context:annotation-config/>
           <context:component-scan base-package="com.cc"></context:component-scan>
           <bean id="runner" class="org.apache.commons.dbutils.QueryRunner" scope="prototype">                  <constructor-arg name="ds" ref="dataSource"></constructor-arg>     </bean>
           <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">                  <property name="driverClass" value="com.mysql.cj.jdbc.Driver"></property>         <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/groot?characterEncoding=utf8"></property>         <property name="user" value="root"></property>         <property name="password" value="iamgroot"></property>     </bean>
  </beans>
   | 
 
实体类
Account.java
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 42 43 44 45 46
   | package com.cc.domain;
  import java.io.Serializable;
 
 
 
  public class Account implements Serializable {
      private Integer id;     private String name;     private Float money;
      public Integer getId() {         return id;     }
      public void setId(Integer id) {         this.id = id;     }
      public String getName() {         return name;     }
      public void setName(String name) {         this.name = name;     }
      public Float getMoney() {         return money;     }
      public void setMoney(Float money) {         this.money = money;     }
      @Override     public String toString() {         return "Account{" +                 "id=" + id +                 ", name='" + name + '\'' +                 ", money=" + money +                 '}';     } }
   | 
 
业务层
IAccountService.java
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 42 43
   | package com.cc.service;
  import com.cc.domain.Account;
  import java.util.List;
 
 
 
  public interface IAccountService {
      
 
 
      void createAccount(Account account);
      
 
 
      void deleteAccount(Integer accountId);
      
 
 
      void updateAccount(Account account);
      
 
 
 
      Account retrieveAccountById(Integer accountId);
      
 
 
      List<Account> retrieveAllAccounts();
  }
   | 
 
AccountServiceImpl.java
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
   | package com.cc.service.impl;
  import com.cc.dao.IAccountDao; import com.cc.domain.Account; import com.cc.service.IAccountService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service;
  import java.util.List;
 
 
 
  @Service("accountService") public class AccountServiceImpl implements IAccountService {
      @Autowired     private IAccountDao accountDao;
      public void createAccount(Account account) {         accountDao.createAccount(account);     }
      public void deleteAccount(Integer accountId) {         accountDao.deleteAccount(accountId);     }
      public void updateAccount(Account account) {         accountDao.updateAccount(account);     }
      public Account retrieveAccountById(Integer accountId) {         return accountDao.retrieveAccountById(accountId);     }
      public List<Account> retrieveAllAccounts() {         return accountDao.retrieveAllAccounts();     } }
   | 
 
持久层
IAccountDao.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
   | package com.cc.dao;
  import com.cc.domain.Account;
  import java.util.List;
 
 
 
  public interface IAccountDao {
      void createAccount(Account account);
      void deleteAccount(Integer accountId);
      void updateAccount(Account account);
      Account retrieveAccountById(Integer accountId);
      List<Account> retrieveAllAccounts();
  }
   | 
 
AccountDaoImpl.java
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 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
   | package com.cc.dao.impl;
  import com.cc.dao.IAccountDao; import com.cc.domain.Account; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.BeanHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository;
  import java.sql.SQLException; import java.util.List;
 
 
 
  @Repository("accountDao") public class AccountDaoImpl implements IAccountDao {
      @Autowired     private QueryRunner runner;
      public void createAccount(Account account) {         try {             runner.update("insert into account(name,money) values(?,?)", account.getName(), account.getMoney());         } catch (SQLException e) {             throw new RuntimeException(e);         }     }
      public void deleteAccount(Integer accountId) {         try {             runner.update("delete from account where id = ?", accountId);         } catch (SQLException e) {             throw new RuntimeException(e);         }     }
      public void updateAccount(Account account) {         try {             runner.update("update account set name = ?, money = ? where id = ?", account.getName(), account.getMoney(),account.getId());         } catch (SQLException e) {             throw new RuntimeException(e);         }     }
      public Account retrieveAccountById(Integer accountId) {         try {             return runner.query("select * from account where id = ?", new BeanHandler<Account>(Account.class), accountId);         } catch (SQLException e) {             throw new RuntimeException(e);         }     }
      public List<Account> retrieveAllAccounts() {         try {             return runner.query("select * from account", new BeanListHandler<Account>(Account.class));         } catch (SQLException e) {             throw new RuntimeException(e);         }     }
  }
   | 
 
测试方法
AccountServiceTest.java
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 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
   | package com.cc.test;
  import com.cc.domain.Account; import com.cc.service.IAccountService; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
  import java.util.List;
 
 
 
 
  @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = "classpath:beans.xml") public class AccountServiceTest {
      @Autowired     private IAccountService as;
      @Test     public void testCreate(){         Account account = new Account();         account.setName("eee");         account.setMoney(10000f);         as.createAccount(account);     }
      @Test     public void testDelete(){         as.deleteAccount(1);     }
      @Test     public void testUpdate(){         Account account = as.retrieveAccountById(3);         account.setMoney(3000f);         as.updateAccount(account);     }
      @Test     public void testRetrieveOne(){         Account account = as.retrieveAccountById(1);
          System.out.println(account);     }
      @Test     public void testRetrieveAll(){         List<Account> accounts = as.retrieveAllAccounts();
          for(Account account : accounts){             System.out.println(account);         }     }
  }
   | 
 
测试
testRetrieveAll()

testRetrieveOne()

testCreate()

testDelete()

testUpdate()
