Spring使用XML+注解实现的小案例+Spring-Junit整合

Spring使用XML+注解实现的小案例

项目结构

在这里插入图片描述

数据库

在这里插入图片描述

配置文件

  1. pom.xml

    <?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.xiaoge</groupId>
        <artifactId>account_xmlioc</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.13</version>
            </dependency>
    
            <dependency>
                <groupId>c3p0</groupId>
                <artifactId>c3p0</artifactId>
                <version>0.9.1.2</version>
            </dependency>
    
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.12</version>
            </dependency>
    
        </dependencies>
    
    
    </project>
    
  2. bean.xml重点

    <?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
            https://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context
            https://www.springframework.org/schema/context/spring-context.xsd">
    
    
        <!--
           告知spring在创建容器时要扫描的包,
           配置所需要的标签不是在bean的约束中,
           而是一个名称为context名称空间和约束中
       -->
        <!-- base-package: 指定了包, 它就会扫描这个包下及其子包, 所有类上和接口上的注解 -->
        <context:component-scan base-package="com.xiaoge"></context:component-scan>
    
    
        <!-- 配置QueryRunner对象 配置成多例, 单例对象会有线程安全问题 -->
        <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/eesy"></property>
            <property name="user" value="root"></property>
            <property name="password" value="123456"></property>
        </bean>
    
    </beans>
    

实体类

  1. Account

    package com.xiaoge.domain;
    
    import java.io.Serializable;
    
    /**
     * @Author: 潇哥
     * @DateTime: 2020/4/7 下午10:16
     * @Description: 账户实体类
     */
    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 +
                    '}';
        }
    }
    

持久层

  1. AccountDao接口

    package com.xiaoge.dao;
    
    import com.xiaoge.domain.Account;
    
    import java.util.List;
    
    /**
     * @Author: 潇哥
     * @DateTime: 2020/4/7 下午10:25
     * @Description: 账户的持久层接口
     */
    public interface AccountDao {
    
        /**
         * 查询所有
         * @return
         */
        public List<Account> findAllAccount();
    
        /**
         * 查询一个
         * @return
         */
        public Account findAccountById(Integer id);
    
        /**
         * 保存
         */
        public void saveAccount(Account account);
    
        /**
         * 更新
         * @param account
         */
        public void updateAccount(Account account);
    
        /**
         * 删除
         * @param id
         */
        public void deleteAccount(Integer id);
    
    }
    
    
  2. AccountDaoImpl实体类

    package com.xiaoge.dao.impl;
    
    import com.xiaoge.dao.AccountDao;
    import com.xiaoge.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;
    
    /**
     * @Author: 潇哥
     * @DateTime: 2020/4/7 下午10:25
     * @Description: 账户的持久层实现类
     */
    @Repository("accountDao")
    public class AccountDaoImpl implements AccountDao {
    
        @Autowired
        private QueryRunner runner;
    
        public List<Account> findAllAccount() {
            try {
                return runner.query("select * from account", new BeanListHandler<Account>(Account.class));
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
    
        public Account findAccountById(Integer id) {
            try {
                return runner.query("select * from account where id = ? ", new BeanHandler<Account>(Account.class), id);
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
    
        public void saveAccount(Account account) {
            try {
                runner.update("insert into account(name, money) values(?, ?)", account.getName(), account.getMoney());
            } 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 void deleteAccount(Integer id) {
            try {
                runner.update("delete from account where id = ?", id);
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
    }
    
    

业务层

  1. AccountService接口

    package com.xiaoge.service;
    
    import com.xiaoge.domain.Account;
    
    import java.util.List;
    
    /**
     * @Author: 潇哥
     * @DateTime: 2020/4/7 下午10:14
     * @Description: 账户的业务层接口
     */
    public interface AccountService {
    
        /**
         * 查询所有
         * @return
         */
        public List<Account> findAllAccount();
    
        /**
         * 查询一个
         * @return
         */
        public Account findAccountById(Integer id);
    
        /**
         * 保存
         */
        public void saveAccount(Account account);
    
        /**
         * 更新
         * @param account
         */
        public void updateAccount(Account account);
    
        /**
         * 删除
         * @param id
         */
        public void deleteAccount(Integer id);
    }
    
  2. AccountServiceImpl实现类

    package com.xiaoge.service.impl;
    
    import com.xiaoge.dao.AccountDao;
    import com.xiaoge.domain.Account;
    import com.xiaoge.service.AccountService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    import java.util.List;
    
    /**
     * @Author: 潇哥
     * @DateTime: 2020/4/7 下午10:14
     * @Description: 账户的业务层实现类
     */
    @Service("accountService")
    public class AccountServiceImpl implements AccountService {
    
        @Autowired  // 它会自动取核心容器(map集合 找值, 键都不会匹配的)中找AccountDao类型匹配的唯一个bean, 那就是我们用注解修饰了的@Repository AccountDaoImpl类
        private AccountDao accountDao;
    
        public List<Account> findAllAccount() {
            return accountDao.findAllAccount();
        }
    
        public Account findAccountById(Integer id) {
            return accountDao.findAccountById(id);
        }
    
        public void saveAccount(Account account) {
            accountDao.saveAccount(account);
        }
    
        public void updateAccount(Account account) {
            accountDao.updateAccount(account);
        }
    
        public void deleteAccount(Integer id) {
            accountDao.deleteAccount(id);
        }
    }
    
    

测试

  1. AccountServiceTest

    package com.xiaoge.test;
    
    import com.xiaoge.domain.Account;
    import com.xiaoge.service.AccountService;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    
    import java.util.List;
    
    /**
     * @Author: 潇哥
     * @DateTime: 2020/4/7 下午10:52
     * @Description: 使用Junit单元测试, 测试我们的配置
     * Spring整合junit的配置
     *      1. 导入spring整合junit的jar(座标)
     *      2. 使用junit提供的一个注解把原有的main方法替换了, 替换成spring提供的
     *          @Runwith
     *      3. 告知spring的运行器, spring和ioc的创建基于xml还是注解的, 并且说明位置
     *          @ContextConfiguration
     *              locations: 指定xml文件的位置, 加上classpath关键字, 表示在类路径下
     *              classes: 指定注解类所在的位置
     *
     * 当我们使用spring 5.x版本的时候, 要求junit的jar必须是4.12及以上版本
     */
    
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations = "classpath:bean.xml")
    public class AccountServiceTest {
    
        @Autowired
        private AccountService accountService;
    
        @Test
        public void findAllTest() {
            // 1. 执行方法
            List<Account> allAccount = accountService.findAllAccount();
    
            for (Account account : allAccount) {
                System.out.println(account);
            }
    
        }
    
        @Test
        public void findOneTest() {
            // 1. 执行方法
            Account account = accountService.findAccountById(1);
    
            System.out.println(account);
    
        }
    
        @Test
        public void saveAccountTest() {
            // 1. 构造对象
            Account account = new Account();
            account.setId(4);
            account.setName("ddd");
            account.setMoney(2000f);
    
            // 2. 执行方法
            accountService.saveAccount(account);
    
        }
    
        @Test
        public void updateAccountTest() {
            // 1. 构造对象
            Account account = new Account();
            account.setId(3);
            account.setName("ddd");
            account.setMoney(2000f);
    
            // 2. 执行方法
            accountService.updateAccount(account);
    
    
        }
    
        @Test
        public void deleteAccountTest() {
            // 1. 执行方法
            accountService.deleteAccount(3);
    
        }
    }
    
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章