SpringIoC三层架构实战

news2025/1/25 7:19:53

 

 

目录

一、需求分析

 二、创建相关数据库

 三、导入相关依赖

四、实体类准备

五、相关技术讲解(Druid、JDBCTemplate)

 六、三层架构实现案例


一、需求分析

搭建一个三层架构案例,模拟查询全部学生(学生表)信息,持久层使用JdbcTemplate和Druid技术,使用XML方式进行组件管理!


 

 二、创建相关数据库

create database studb;

use studb;

CREATE TABLE students (
  id INT PRIMARY KEY,
  name VARCHAR(50) NOT NULL,
  gender VARCHAR(10) NOT NULL,
  age INT,
  class VARCHAR(50)
);

INSERT INTO students (id, name, gender, age, class)
VALUES
  (1, '张三', '男', 20, '高中一班'),
  (2, '李四', '男', 19, '高中二班'),
  (3, '王五', '女', 18, '高中一班'),
  (4, '赵六', '女', 20, '高中三班'),
  (5, '刘七', '男', 19, '高中二班'),
  (6, '陈八', '女', 18, '高中一班'),
  (7, '杨九', '男', 20, '高中三班'),
  (8, '吴十', '男', 19, '高中二班');

创建完成后表格如下所示


 三、导入相关依赖

  <!-- SpringIoc核心jar包 包含core ioc breans 等 -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.0.2.RELEASE</version>
    </dependency>

    <!-- junit5测试 -->
    <dependency>
      <groupId>org.junit.jupiter</groupId>
      <artifactId>junit-jupiter-api</artifactId>
      <version>5.3.1</version> <!-- 使用属性引用JUnit Jupiter版本 -->
      <scope>test</scope>
    </dependency>

<!--        mysql驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.25</version>
        </dependency>

<!--        spring-jdbc-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>6.0.6</version>
        </dependency>

<!--德鲁伊连接池-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.8</version>
        </dependency>

四、实体类准备

package com.alphamilk;

public class Student {

    private Integer id;
    private String name;
    private String gender;
    private Integer age;
    private String classes;

    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 String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getClasses() {
        return classes;
    }

    public void setClasses(String classes) {
        this.classes = classes;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", gender='" + gender + '\'' +
                ", age=" + age +
                ", classes='" + classes + '\'' +
                '}';
    }
}

五、相关技术讲解(Druid、JDBCTemplate)

JDBCTemplate技术讲解

为了在特定领域帮助我们简化代码,Spring 封装了很多 『Template』形式的模板类。例如:RedisTemplate、RestTemplate 等等,包括我们今天要学习的 JdbcTemplate。 jdbc.properties 提取数据库连接信息

使用JDBCTemplate:

package com.alphamilk;

import com.alibaba.druid.pool.DruidDataSource;
import org.junit.jupiter.api.Test;
import org.springframework.jdbc.core.JdbcTemplate;

public class test {

    @Test
    public  void Test(){

//        创建连接池对象
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setUrl("jdbc:mysql://localhost:3306/studb"); //url地址
        dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");//驱动信息
        dataSource.setUsername("mysql");//数据库用户名
        dataSource.setPassword("123456");//数据库密码

//    1.创建JDBCTemplate对象
        JdbcTemplate jdbcTemplate = new JdbcTemplate();
//      2.传入数据连接池对象
        jdbcTemplate.setDataSource(dataSource);
//      3.实现增删查改
//       实现数据更新操作
//        jdbcTemplate.update();DDL DML DCL等非查询语句
//        jdbcTemplate.query(); DQL 查询单个对象
//        jdbcTemplate.queryForObject(); DQL 查询集合

        /*
        注意:JDBCTemplate只是简化了数据库的CRUD,并不负责提供连接池
        DruidDataSource 用于连接和创建连接池对象和数据库驱动等等
         */
    }
}

将两个对象使用xml配置为组件

1.在项目配置下创建peoperties资源文件,将个人信息所有都放入进去,方便以后修改

alphamilk.url=jdbc:mysql://localhost:3306/studb
alphamilk.driver=com.mysql.cj.jdbc.Driver
alphamilk.username=mysql
alphamilk.password=123456

2.写入配置文件xml

创建xml,配置IoC与DI

<?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">

<!--    引入.properties文件,.properties =》 value = “${key}”-->
<!--    context:property-placeholder location="jdbc.properties","其他properties文件",,,用逗号隔开-->
    <context:property-placeholder location="jdbc.properties"/>

    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="url" value="${alphamilk.url}"/>
        <property name="driverClassName" value="${alphamilk.driver}"/>
        <property name="username" value="${alphamilk.username}"/>
        <property name="password" value="${alphamilk.password}"/>
    </bean>
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"/>
    </bean>
</beans>

 测试:

package com.alphamilk;

import com.alibaba.druid.pool.DruidDataSource;
import com.alphamilk.pojo.Student;
import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

public class test {

    @Test
    public  void Test(){
//        创建Ioc容器
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("SpringProject.xml");
//        通过容器getBean获取组件
        DruidDataSource dataSource = (DruidDataSource) applicationContext.getBean("dataSource");
        JdbcTemplate jdbcTemplate = (JdbcTemplate) applicationContext.getBean("jdbcTemplate");
//        创建sql语句
        String sql = "insert into students (id,name,gender,age,class) values(?,?,?,?,?)";
        /*
        参数1:String sql 可以使用占位符,但是只能用于替代值,不能用于替代关键字和容器名
        参数2:Object。。。parase 传入占位符的值,并且按照从左到右的形式传递
        返回值 int 影响函数
         */
        int rows = jdbcTemplate.update(sql, 9,"黄小狗", "男", 18, "三年级一班");
        System.out.println("rows="+rows);

//        查询单条数据
         sql = "select * from students where id =?";
         /*
         参数1:可以使用占位符
         参数2:RowMapper 列名和属性名的映射器接口
         参数3:Object 。。。parase 可以传参数,替代占位符的值
          */
        Student student1 = jdbcTemplate.queryForObject(sql, new RowMapper<Student>() {
            public Student mapRow(ResultSet rs, int rowNum) throws SQLException {
//                rs 结果集
//                rowNum 行数
//                rs结果集种获取列的值,赋值给实体类对象即可
                Student student = new Student();
                student.setId(rs.getInt("id"));
                student.setName(rs.getString("name"));
                student.setAge(rs.getInt("age"));
                student.setGender(rs.getString("gender"));
                student.setClasses(rs.getString("class"));
                return student;
            }
        }, 1);
        System.out.println("student1="+student1);

//        查询所有学生数据
//        TODO:BeanPropertyRowMapper帮助我们自动映射列和属性值!要求列名和属性名不一致! 不一致起别名
        String sql = "select id , name , gender , age ,class as classes from students";
        List<Student> studentList =jdbcTemplate.query(sql,new BeanPropertyRowMapper<Student>(Student.class));
        System.out.println("StudentList = " +studentList);
    }
}


 六、三层架构实现案例

6.1.持久层(dao层)

dao层对应的接口

package com.alphamilk.dao;

import com.alphamilk.pojo.Student;

import java.util.List;

public interface studentDao {
//    查询所有学生信息
    List<Student> querryAllStudent();
}

dao层对应的实现类

package com.alphamilk.dao;

import com.alphamilk.pojo.Student;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;

import java.util.List;

public class Impl implements studentDao{
    private JdbcTemplate jdbcTemplate;

    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }
    @Override
    public List<Student> querryAllStudent() {
       String sql = "select id , name , gender , age ,class as classes from students";
       List<Student> students = jdbcTemplate.query(sql, new BeanPropertyRowMapper<Student>(Student.class));
        System.out.println("dao层输出"+students);
        return students;
    }
}

6.2业务层

service对应的业务接口

package com.alphamilk.service;

import com.alphamilk.pojo.Student;

import java.util.List;

public interface StudentService {
//    业务实现查询所有的学生信息
    List<Student> findAll();
}

service业务层对应的实现方法

package com.alphamilk.pojo.service.Imp;

import com.alphamilk.pojo.pojo.Student;
import com.alphamilk.pojo.dao.StudentDao;
import com.alphamilk.pojo.service.StudentService;

import java.util.List;

//实现类
public class StudentServiceImpl  implements StudentService {

    private StudentDao studentDao;

    public void setStudentDao(StudentDao studentDao) {
        this.studentDao = studentDao;
    }

    /**
     * 查询全部学员业务
     * @return
     */
    @Override
    public List<Student> findAll() {

        List<Student> studentList =  studentDao.queryAll();

        return studentList;
    }
}

6.3控制层

package com.alphamilk.pojo.Controller;

import com.alphamilk.pojo.pojo.Student;
import com.alphamilk.pojo.service.StudentService;

import java.util.List;

public class StudentController {

    private StudentService studentService;

    public void setStudentService(StudentService studentService) {
        this.studentService = studentService;
    }

    public void  findAll(){
       List<Student> studentList =  studentService.findAll();
        System.out.println("studentList = " + studentList);
    }
}

对应所有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 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:property-placeholder location="jdbc.properties"/>
    <!--druid-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="${alphamilk.driver}"/>
        <property name="url" value="${alphamilk.url}"/>
        <property name="username" value="${alphamilk.username}"/>
        <property name="password" value="${alphamilk.password}"/>
    </bean>
<!--JDBCTemplate-->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"/>
    </bean>
<!--    dao层配置-->
    <bean id="studentDao" class="com.alphamilk.pojo.dao.Imp.StudentDaoImpl">
        <property name="jdbcTemplate" ref="jdbcTemplate"/>
    </bean>
<!--    service层配置-->
    <bean id="studentService" class="com.alphamilk.pojo.service.Imp.StudentServiceImpl">
        <property name="studentDao" ref="studentDao"/>
    </bean>
<!--    controller层配置-->
    <bean id="studentController" class="com.alphamilk.pojo.Controller.StudentController">
        <property name="studentService" ref="studentService"/>
    </bean>
</beans>

最后的测试

package com.alphamilk;

import com.alphamilk.pojo.Controller.StudentController;
import org.junit.jupiter.api.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class newTest {
    @Test
    public void test(){
//        创建Ioc容器
        ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("SpringProject02.xml");
//        获取组件内容
        StudentController studentController = (StudentController) classPathXmlApplicationContext.getBean("studentController");
//        调用组件方法
        studentController.findAll();
//        关闭容器
        classPathXmlApplicationContext.close();
    }
}


基于XML三层架构总结:

注入的属性必须添加 setter 方法、代码结构乱!

配置文件和 Java 代码分离、编写不是很方便!

XML配置文件解析效率低

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/924351.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

美团发布2023年Q2财报:营收680亿元,同比增长33.4%

8月24日&#xff0c;美团(股票代码:3690.HK)发布2023年第二季度及半年业绩报告。今年二季度&#xff0c;美团实现营收680亿元(人民币&#xff0c;下同)&#xff0c;同比增长33.4%。 财报显示&#xff0c;二季度&#xff0c;美团继续深入推进“零售科技”战略&#xff0c;持续加…

leetcode:2011. 执行操作后的变量值(python3解法)

难度&#xff1a;简单 存在一种仅支持 4 种操作和 1 个变量 X 的编程语言&#xff1a; X 和 X 使变量 X 的值 加 1--X 和 X-- 使变量 X 的值 减 1 最初&#xff0c;X 的值是 0 给你一个字符串数组 operations &#xff0c;这是由操作组成的一个列表&#xff0c;返回执行所有操作…

算法与数据结构(十)--图的入门

一.图的定义和分类 定义&#xff1a;图是由一组顶点和一组能够将两个顶点连接的边组成的。 特殊的图&#xff1a; 1.自环&#xff1a;即一条连接一个顶点和其自身的边; 2.平行边&#xff1a;连接同一对顶点的两条边&#xff1b; 图的分类&#xff1a; 按照连接两个顶点的边的…

Flask 单元测试

如果一个软件项目没有经过测试&#xff0c;就像做的菜里没加盐一样。Flask 作为一个 Web 软件项目&#xff0c;如何做单元测试呢&#xff0c;今天我们来了解下&#xff0c;基于 unittest 的 Flask 项目的单元测试。 什么是单元测试 单元测试是软件测试的一种类型。顾名思义&a…

idea使用tomcat

1. 建立javaweb项目 2. /WEB-INF/web.xml项目配置文件 如果javaweb项目 先建立项目&#xff0c;然后在项目上添加框架支持&#xff0c;选择javaee 3. 项目结构 4.执行测试&#xff1a;

按软件开发阶段的角度划分:单元测试、集成测试、系统测试、验收测试

1.单元测试&#xff08;Unit Testing&#xff09; 单元测试&#xff0c;又称模块测试。对软件的组成单位进行测试&#xff0c;其目的是检验软件基本组成单位的正确性。测试的对象是软件里测试的最小单位&#xff1a;模块。 测试阶段&#xff1a;编码后或者编码前&#xff08;…

服务器(容器)开发指南——code-server

文章目录 code-server简介code-server的安装与使用code-server的安装code-server的启动code-server的简单启动指定配置启动code-server code-server环境变量配置 code-server端口转发自动端口转发手动添加转发端口 nginx反向代理code-servercode-server打包开发版镜像 GitHub官…

Qt --- QTimer

在Qt开发界面的时候&#xff0c;非常多的时候都得使用定时器&#xff0c;定时器具体可以干什么呢&#xff1f;比如&#xff1a;控制时钟、定时改变样式、改变进度等。。。说到这里&#xff0c;经常使用QQ&#xff0c;而不同的时段都会显示不同的背景&#xff0c;我认为如果用Qt…

商城-学习整理-集群-K8S-集群环境部署(二十四)

目录 一、MySQL集群1、mysql集群原理2、Docker安装模拟MySQL主从复制集群1、下载mysql镜像2、创建Master实例并启动3、创建 Slave 实例并启动4、为 master 授权用户来同步数据1、进入 master 容器2、进入 mysql 内部 &#xff08;mysql –uroot -p&#xff09;3、查看 master 状…

告别数字化系统“物理叠加”,华为云推动智慧门店价值跃迁

文|智能相对论 作者|叶远风 有大屏幕滚动播放广告&#xff1b; 有人脸识别系统让消费者自助结账&#xff1b; 有订单管理系统综合分析一段时间内总体经营情况&#xff1b; 有全门店监控直连总部机房&#xff1b; …… 以搭载数字化系统的硬件设备为表面特征的智慧门店&a…

Seaborn 基本语法及特点

文章目录 简介图类型关系型图数据分布型图分类数据型图回归模型分析型图多子图网格型图FacetGrid () 函数PairGrid () 函数 绘图风格、颜色主题和绘图元素缩放比例绘图风格颜色主题绘图元素缩放比例 简介 Seaborn 是 Python 中一个非常受用户欢迎的可视化库。Seaborn 在 Matpl…

webpack5 (二)

什么是bable 是 js 编译器&#xff0c;主要的作用是将 ES6 语法编写的代码转换为向后兼容的 js 语法&#xff0c;以便可以运行在当前版本和旧版本的浏览器或其他环境中。 它的配置文件有多种写法&#xff1a; babel.config.*(js/json) babelrc.*(js/json) package.json 中的…

centos7物理机安装并配置外网访问

安装准备工作 安装之前需要准备一下&#xff0c;需要一个U盘&#xff0c;其次需要准备以下内容 1.需要centos7的ISO系统镜像 2.使用UltraISO软件写入ISO镜像 3.一台windows系统 将系统写入到U盘&#xff0c;写入步骤 打开UltraISO点击文件 → 打开&#xff0c;选择Linux镜…

飞天使-k8s基础组件分析-安全

文章目录 名称空间解释访问kubernetes API的控制RBAC的介绍 kubeconfig用户的创建集群默认角色 给组创建授权针对pod配置服务账户参考文档 名称空间解释 名字是啥&#xff1f; 答&#xff1a;集群中每个对象的名称对于该类型的资源都是唯一的。并且每一个对象在整个集群中也有…

『C语言入门』初识C语言

文章目录 前言C语言简介一、Hello World&#xff01;1.1 编写代码1.2 代码解释1.3 编译和运行1.4 结果 二、数据类型2.1 基本数据类型2.2 复合数据类型2.3 指针类型2.4 枚举类型 三、C语言基础3.1 变量和常量3.2 运算符3.3 控制流语句3.4 注释单行注释多行注释注释的作用 四、 …

【给自己挖个坑】三维视频重建(NSR技术)-KIRI Engine

文章目录 以下是我和AI的对话通过手机拍摄物体的视频&#xff0c;再根据视频生成三维模型&#xff0c;这个可实现吗我想开发类似上面的手机应用程序&#xff0c;如何开发呢 看了以上回答&#xff0c;还是洗洗睡吧NSR技术的实现原理是什么呢有案例吗我是名Java工程师&#xff0c…

Flink_state 的优化与 remote_state 的探索

摘要&#xff1a;本文整理自 bilibili 资深开发工程师张杨&#xff0c;在 Flink Forward Asia 2022 核心技术专场的分享。本篇内容主要分为四个部分&#xff1a; 相关背景state 压缩优化Remote state 探索未来规划 点击查看原文视频 & 演讲PPT 一、相关背景 1.1 业务概况 从…

ABB PP846 3BSE042238R1触摸屏

触摸界面&#xff1a;这款触摸屏设备允许用户通过触摸屏幕来执行操作&#xff0c;如选择、控制和设置。 高分辨率显示&#xff1a;触摸屏可能具有高分辨率的显示屏&#xff0c;以显示图形、数据和控制界面。 多语言支持&#xff1a;它可能支持多种语言&#xff0c;以适应不同…

数据采集:selenium 获取 CDN 厂家各省市节点 IP

写在前面 工作需要遇到&#xff0c;简单整理理解不足小伙伴帮忙指正 对每个人而言&#xff0c;真正的职责只有一个&#xff1a;找到自我。然后在心中坚守其一生&#xff0c;全心全意&#xff0c;永不停息。所有其它的路都是不完整的&#xff0c;是人的逃避方式&#xff0c;是对…

nacos安装部署

docker下载安装&#xff08;双端口&#xff0c;支持seata使用&#xff09; 1、docker run --name nacos -e MODEstandalone -d -p 8848:8848 -p 9848:9848 -p 9849:9849 nacos/nacos-server 2、访问&#xff1a;http://localhost:8848/&#xff0c;账号密码nacos