一、三层架构

1.controller:接受请求,响应数据

service:业务逻辑层,处理业务逻辑,接口实现。在service中要创建dao层对象,才能拿到返回数据

dao:数据访问层,负责数据访问操作(增删改查),面向接口的方式

三层架构请求流程:前端发起请求,controller接收请求后调用service进行逻辑处理,service调用dao层,dao调用数据,将数据返回给service,service进行逻辑处理,再将结果返回给controller,controller响应给前端。

Dao层实现类

package com.example.third.dao.impl;
import java.util.List;

import com.example.third.dao.EmpDao;
import com.example.third.pojo.Emp;
import com.example.third.utils.XmlParserUtils;

//EmpDaoA是EmpDao接口的一个实现类,
public class EmpDaoA implements EmpDao {
    //加载并解析xml文件,获取Emp对象列表,直接使用相对路径来指定xml文件的位置
    @Deprecated
    public List<Emp> listEmp() {
     String file = "no6/third/src/main/resources/emp.xml";
    System.out.println("file:"+file);
    List<Emp> empList = XmlParserUtils.parse(file, Emp.class);
    return empList;//调用XmlParserUtils工具类的parse方法,传入xml文件路径和Emp类的Class对象,返回一个Emp对象列表

}
}

Dao层接口

package com.example.third.dao;
import java.util.List;
import com.example.third.pojo.Emp;
//EmpDao接口定义了一个方法listEmp(),用于获取员工信息的列表。

public interface EmpDao {
    //EmpDao接口定义了一个方法listEmp(),用于获取员工信息的列表。这个接口是一个数据访问对象(DAO)接口,负责与数据源进行交互,获取员工信息的数据。
    List<Emp> listEmp();
}

二、分层解耦

1.内聚:软件中各个功能模块内部的功能联系

2.耦合:衡量软件中各个层/模块之间的依赖、关联程度,关联度越高,耦合度越高

eg、controller中创建了service类,改变service就要改变controller的代码,二者之间耦合

低耦合高内聚

3.分层解耦

创建service对象放到一个容器中,controller只需要在容器中查找对应的对象,即可完成对象

(1)控制反转(IOC):对象创建的控制权由程序自身转移到容器。在类上加上@Component注解,将当前类交给IOC容器管理。

声明bean的注解@Compoent@Controller(标注在控制器上)@Service(标注在业务类上)@Respostory(标注在数据访问类上)。

@componet(value+“名字”)为bean命名,默认首字母小写

(2)依赖注入(DI):容器为应用程序提供运行时所依赖的资源。在对象前加上@Autowired注解·,运行时IOC容器会提供该类型对象,并赋值给对应变量

(3)Bean是对象(bean):IOC容器中创建、管理的对象

三、Mybatis

1.对教案中的user表进行增删改查的mapper和test测试文件

UserMapperTest.java

package com.example.mybatis01;


import com.example.mybatis01.mapper.UserMapper;
import com.example.mybatis01.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.junit.jupiter.api.Test;

import java.util.List;

@SpringBootTest  // 这个注解让测试类能启动Spring容器
public class UserMapperTest {

    @Autowired  // 把UserMapper自动注入进来,方便我们调用
    private UserMapper userMapper;

    // 测试1:查询所有
    @Test
    public void testList() {
        List<User> list = userMapper.list();
        System.out.println("===== 查询所有用户 =====");
        for (User user : list) {
            System.out.println(user);
        }
    }

    // 测试2:根据ID查询
    @Test
    public void testGetById() {
        User user = userMapper.getById(1);
        System.out.println("===== 查询ID为1的用户 =====");
        System.out.println(user);
    }

    // 测试3:新增用户
    @Test
    public void testInsert() {
        User user = new User();
        user.setName("令狐冲");
        user.setAge((short) 28);
        user.setGender((short) 1);
        user.setPhone("13912345678");

        int rows = userMapper.insert(user);
        System.out.println("===== 新增用户 =====");
        System.out.println("影响行数:" + rows);
        System.out.println("生成的新ID:" + user.getId());
    }

    // 测试4:修改用户(把ID为1的名字改一下)
    @Test
    public void testUpdate() {
        User user = new User();
        user.setId(1);
        user.setName("白眉大侠");  // 把原来叫白眉鹰王的改成白眉大侠
        user.setAge((short) 55);
        user.setGender((short) 1);
        user.setPhone("18800000000");

        int rows = userMapper.update(user);
        System.out.println("===== 修改用户 =====");
        System.out.println("影响行数:" + rows);
    }

    // 测试5:删除用户(删除ID为7的用户,如果ID不存在就报错)
    @Test
    public void testDelete() {
        int rows = userMapper.delete(7);  
        System.out.println("===== 删除用户 =====");
        System.out.println("影响行数:" + rows);
    }
}

UserMapper.java

package com.example.mybatis01.mapper;

import com.example.mybatis01.pojo.User;
import org.apache.ibatis.annotations.*;

import java.util.List;

@Mapper
public interface UserMapper {

    // 1. 查询所有用户
    @Select("select id, name, age, gender, phone from [dbo].[user]")
    List<User> list();

    // 2. 根据id查询
    @Select("select id, name, age, gender, phone from [dbo].[user] where id = #{id}")
    User getById(Integer id);

    // 3. 新增用户(id自增,不传id)
    @Insert("insert into [dbo].[user](name, age, gender, phone) values(#{name}, #{age}, #{gender}, #{phone})")
    @Options(useGeneratedKeys = true, keyProperty = "id")  // 返回自增id
    int insert(User user);

    // 4. 修改用户
    @Update("update [dbo].[user] set name=#{name}, age=#{age}, gender=#{gender}, phone=#{phone} where id=#{id}")
    int update(User user);

    // 5. 删除用户
    @Delete("delete from [dbo].[user] where id = #{id}")
    int delete(Integer id);
}

2.实体类改成lombok来实现

(1)在 pom.xml 中添加 Lombok 依赖

(2)给 VS Code 装Lombok Annotations Support 插件

(3)user.java代码

package com.example.mybatis01.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data          // 这个注解会自动生成:getter/setter、toString、equals、hashCode
@NoArgsConstructor  // 生成无参构造方法
@AllArgsConstructor // 生成全参构造方法
public class User {
    private Integer id;
    private String name;
    private Short age;
    private Short gender;
    private String phone;
}

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐