从零到一:Java三层架构下的图书馆管理系统开发指南

news2024/9/19 9:50:30

引言

使用JavaSE相关知识完成一个以三层架构为设计规范的图书管理系统,不包括前端页面(使用main方法+Scanner()模拟用户输入),目的是为了基于一个项目快速了解三层架构的项目设计规范的实践。

 开发流程

  • 确认需求
  • 导入相关的jar包和JDBCUtils工具类(工具类的目的是为了简化开发)
  • 创建数据库表并准备基础数据
  • 书写对应实体类
  • 先分析功能执行所需的SQL支持,然后书写DAO层
  • 书写DAO的Junit测试类
  • 书写Service层+实现业务需求+事务控制
  • 书写Service的Junit测试类
  • 书写视图层,对接用户接收用户数据,并反馈结果

项目实战

一、确认需求

 需求:想要创建一个图书管理系统,能够对书籍进行新增,修改,删除,查看所有书籍和查看单个书籍等功能,并且需要实现用户注册和登陆功能

项目结构图

导入jar包:

源代码结构图:

二、导入资源

导入相关jar包

        在项目的结构下创建lib包,导入相关的jar包,并右键lib,选择添加为库(目的是为了可以直接使用import导包语句直接使用jar包中的类)

分析:

  • 红色:spring封装JDBC的JDBCTemplate依赖jar包
  • 黄色:mysql驱动jar包(8.0版本)
  • 蓝色:Junit测试驱动jar包

jar包链接:

百度网盘:依赖jar包

阿里网盘:依赖jar包

导入JDBCUtils工具类

package com.csx.util;

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DataSourceUtils;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.transaction.support.TransactionSynchronizationManager;

import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

public class JDBCUtils {
    private static DataSource dataSource =null;

    static{
        try (
                InputStream is=JDBCUtils.class.getResourceAsStream("/JDBCUtils.properties")
        ){
            Properties p = new Properties();
            p.load(is);
            dataSource = new DriverManagerDataSource(p.getProperty("url"), p.getProperty("username"), p.getProperty("password"));
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
    public static JdbcTemplate getJDBCTemplate(){
        //创建JDBCTemplate对象并传入数据库连接池
        JdbcTemplate template = new JdbcTemplate(dataSource);
        return template;
    }

    /**
     * 获取数据库连接池
     * @return
     */
    public static DataSource getDataSource(){
        return dataSource;
    }

    /**
     * 开始线程绑定 +获取连接
     * @return
     */
    public static Connection startTransaction(){
        if (!TransactionSynchronizationManager.isSynchronizationActive()){
            TransactionSynchronizationManager.initSynchronization();
        }
        Connection connection =DataSourceUtils.getConnection(dataSource);
        try {
            connection.setAutoCommit(false);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
        return connection;
    }

    /**
     * 提交事务
     * @param conn
     */
    public static void commit(Connection conn){
        try {
            conn.commit();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }finally {
            clear(conn);
        }
    }

    /**
     * 回滚事务
     * @param conn
     */
    public static void rollback(Connection conn){
        try {
            conn.rollback();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }finally {
            clear(conn);
        }
    }


    /**
     * 解除线程绑定+释放资源+归还连接到线程池
     * @param conn
     */
    public static void clear(Connection conn){
        //清除线程绑定的资源
        TransactionSynchronizationManager.clear();
        TransactionSynchronizationManager.unbindResourceIfPossible(dataSource);
        //归还数据库连接至连接池
        if (conn!=null){//非空判断,判断为空再归还
            DataSourceUtils.releaseConnection(conn,dataSource);
        }
    }
}

三、创建数据库表并准备基础数据

数据库名 csx_demo

创建两张表:t_user t_book

创表语句不在赘述,保证user_id,book_id为主键即可,自行添加约束

四、书写实体类

可以参考我的另一篇博客:

设计之道:ORM、DAO、Service与三层架构的规范探索

User:

package com.csx.entity;

import java.io.Serializable;

public class User implements Serializable {
    private Integer userId;
    private String userName;
    private String password;
    public User(){}

    public User(Integer userId, String userName, String password) {
        this.userId = userId;
        this.userName = userName;
        this.password = password;
    }

    public Integer getUserId() {
        return userId;
    }

    public void setUserId(Integer userId) {
        this.userId = userId;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "User{" +
                "userId=" + userId +
                ", userName='" + userName + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

Book:

package com.csx.entity;

import java.io.Serializable;

public class Book implements Serializable {
    private Integer bookId;
    private String bookName;
    private String author;
    private Double price;
    private Integer stock;

    @Override
    public String toString() {
        return "Book{" +
                "bookId=" + bookId +
                ", bookName='" + bookName + '\'' +
                ", author='" + author + '\'' +
                ", price=" + price +
                ", stock=" + stock +
                '}';
    }

    public Book(){}
    public Book(Integer bookId, String bookName, String author, Double price, Integer stock) {
        this.bookId = bookId;
        this.bookName = bookName;
        this.author = author;
        this.price = price;
        this.stock = stock;
    }

    public Integer getBookId() {
        return bookId;
    }

    public void setBookId(Integer bookId) {
        this.bookId = bookId;
    }

    public String getBookName() {
        return bookName;
    }

    public void setBookName(String bookName) {
        this.bookName = bookName;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public Double getPrice() {
        return price;
    }

    public void setPrice(Double price) {
        this.price = price;
    }

    public Integer getStock() {
        return stock;
    }

    public void setStock(Integer stock) {
        this.stock = stock;
    }
}

五、书写DAO层

分析业务实现需要的SQL支持,例如查询书籍信息需要select的SQL支持,新增数据需要insert的SQL支持等

UserDao:

package com.csx.dao;

import com.csx.entity.User;

public interface UserDao {

    /**
     * 查询根据用户名指定用户是否存在
     * @param userName
     * @return
     */
    public User selectUserByUserName(String userName);

    /**
     * 新增用户信息
     * @param user
     * @return
     */
    public int insertUser(User user);


}

UserDaoImpl:

package com.csx.dao.impl;

import com.csx.dao.UserDao;
import com.csx.entity.User;
import com.csx.util.JDBCUtils;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;

import java.util.List;

public class UserDaoImpl implements UserDao {
    private JdbcTemplate template = JDBCUtils.getJDBCTemplate();
    /**
     * 查询根据用户名指定用户是否存在
     *
     * @param userName
     * @return
     */
    @Override
    public User selectUserByUserName(String userName) {
        String sql ="select * from t_user where user_name=?";
        List<User> list = template.query(sql, new BeanPropertyRowMapper<>(User.class), userName);
        return list.isEmpty()?null:list.get(0);
    }

    /**
     * 新增用户信息
     *
     * @param user
     * @return
     */
    @Override
    public int insertUser(User user) {
        String sql="insert into t_user(user_name,password) values(?,?)";
        int n = template.update(sql, user.getUserName(), user.getPassword());
        return n;
    }
}

BookDao:

package com.csx.dao;

import com.csx.entity.Book;

import java.util.List;

public interface BookDao {
    /**
     * 查询所有图书信息
     * @return 返回查询到的所有图书信息
     */
    public List<Book> selectBooks();

    /**
     * 根据book_name查询指定图书信息
     * @param booName 图书名
     * @return  指定图书信息
     */
    public Book selectBookByBookName(String booName);

    /**
     * 插入图书信息
     * @return
     */
    public int insertBook(Book book);

    /**
     * 根据图书名删除图书
     * @param bookName
     * @return
     */
    public int deleteBookByBookName(String bookName);
}

BookDaoImpl:

package com.csx.dao.impl;

import com.csx.dao.BookDao;
import com.csx.entity.Book;
import com.csx.util.JDBCUtils;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;

import java.util.List;

public class BookDaoImpl implements BookDao {
    private JdbcTemplate template = JDBCUtils.getJDBCTemplate();
    /**
     * 查询所有图书信息
     *
     * @return 返回查询到的所有图书信息
     */
    @Override
    public List<Book> selectBooks() {
       String sql="select * from t_book";
        List<Book> list = template.query(sql, new BeanPropertyRowMapper<>(Book.class));
        return list;
    }

    /**
     * 根据book_name查询指定图书信息
     *
     * @param booName 图书名
     * @return 指定图书信息
     */
    @Override
    public Book selectBookByBookName(String booName) {
       String sql="select * from t_book where book_name=?";
        List<Book> list = template.query(sql, new BeanPropertyRowMapper<>(Book.class), booName);
        return list.isEmpty()?null:list.get(0);
    }

    /**
     * 插入图书信息
     *
     * @return
     */
    @Override
    public int insertBook(Book book) {
        String sql="insert into t_book(book_name,author,price,stock) values(?,?,?,?)";
        int n=template.update(sql,book.getBookName(),book.getAuthor(),book.getPrice(),book.getStock());
        return n;
    }

    /**
     * 根据图书名删除图书
     *
     * @param bookName
     * @return
     */
    @Override
    public int deleteBookByBookName(String bookName) {
       String sql="delete from t_book where book_name=?";
        int n = template.update(sql, bookName);
        return n;
    }
}

六、书写DAO层的测试类

实际开发中,测试是很重要的一部分,理论上,我们应该对DAO和Service中所有的方法和功能都进行测试。

 BookDaoImplTest:

package com.csx.test;

import com.csx.dao.BookDao;
import com.csx.dao.impl.BookDaoImpl;
import com.csx.entity.Book;
import org.junit.Test;

import java.util.List;

public class BookDaoImplTest {
    private BookDao bookDao =new BookDaoImpl();

    @Test
    public void selectBooks(){
        List<Book> books = bookDao.selectBooks();
        books.forEach(book -> System.out.println(book));

    }
    @Test
    public void selectBookByBookName(){
        Book book = bookDao.selectBookByBookName("堂吉诃德");
        System.out.println(book);
    }
    @Test
    public void insertBook(){
        Book book =new Book(null,"无敌烽火轮","csx",99.9,20);
        int i = bookDao.insertBook(book);
        if (i==1){
            System.out.println("新增成功");
        }else {
            System.out.println("新增失败");
        }

    }
    @Test
    public void deleteBookByBookName(){
        int i = bookDao.deleteBookByBookName("无敌烽火轮");
        if (i==1){
            System.out.println("删除成功");
        }else {
            System.out.println("删除失败");
        }

    }


}

UserDaoImplTest:

package com.csx.test;

import com.csx.dao.UserDao;
import com.csx.dao.impl.UserDaoImpl;
import com.csx.entity.User;
import org.junit.Test;

public class UserDaoImplTest {
    private UserDao userDao =new UserDaoImpl();

    @Test
    public void selectUserByUserName(){
        User user = userDao.selectUserByUserName("admin");
        System.out.println(user);
    }

    @Test
    public void insertUser(){
        User user =new User(null,"test1","test");
        int n=userDao.insertUser(user);
        System.out.println(n);
    }
}

七、书写Service层

Service层关注代码的功能实现,在这一层不仅要调用DAO的SQL支持完成功能逻辑,还需要关注事务执行的完整性(即事务的安全控制,保证多条SQL执行的完整性)

 UserService:

package com.csx.service;

import com.csx.dao.UserDao;
import com.csx.dao.impl.UserDaoImpl;

public interface UserService {
    /**
     * 注册用户功能
     * @param username  用户传递的用户名
     * @param password  用户传递的密码
     * @return  注册是否成功的boolean结果
     */
   public boolean register(String username,String password);

    /**
     * 用户登录功能
     * @param username  用户传递的用户名
     * @param password  用户传递的密码
     * @return  登录是否成功的boolean结果
     */
   public boolean login(String username,String password);

}

UserServiceImpl:

package com.csx.service.impl;

import com.csx.dao.UserDao;
import com.csx.dao.impl.UserDaoImpl;
import com.csx.entity.User;
import com.csx.service.UserService;
import com.csx.util.JDBCUtils;

import java.sql.Connection;

public class UserServiceImpl implements UserService {
    private UserDao userDao =new UserDaoImpl();

    /**
     * 注册用户功能
     *
     * @param username 用户传递的用户名
     * @param password 用户传递的密码
     * @return 注册是否成功的boolean结果
     */
    @Override
    public boolean register(String username, String password) {
        boolean boo =false;
        Connection conn =null;
        try {
            conn = JDBCUtils.startTransaction();
            //业务功能
            User u = userDao.selectUserByUserName(username);
            if (u == null) {
                User user = new User(null, username, password);
                userDao.insertUser(user);
                boo = true;
            } else {
                throw new RuntimeException("用户名重复,注册失败!");
            }
            JDBCUtils.commit(conn);
        }catch (Exception e){
            JDBCUtils.rollback(conn);
            throw  new RuntimeException(e);
        }
        return boo;
    }

    /**
     * 用户登录功能
     *
     * @param username 用户传递的用户名
     * @param password 用户传递的密码
     * @return 登录是否成功的boolean结果
     */
    @Override
    public boolean login(String username, String password) {
        boolean boo =false;
        Connection conn =null;
        try{
            conn= JDBCUtils.startTransaction();
            //业务功能
        User user = userDao.selectUserByUserName(username);
        //判断用户名是否存在
        if (user!=null){
            //判断密码是否正确
            if (user.getPassword().equals(password)){
                boo=true;
            }else {
                throw new RuntimeException("密码错误!");
            }
        }else {
            throw new RuntimeException("用户不存在!");
        }
        JDBCUtils.commit(conn);
        }catch (Exception e){
            JDBCUtils.rollback(conn);
            throw new RuntimeException(e);
        }
        return boo;

    }
}

BookService:

package com.csx.service;

import com.csx.entity.Book;

import java.util.List;

public interface BookService {
    /**
     * 查询所有图书信息
     * @return
     */
    public List<Book> queryBooks();

    /**
     * 根据图书名查询指定图书信息
     * @param bookName
     * @return
     */
    public Book queryBookByBookName(String bookName);

    /**
     * 插入新的图书信息,图书名不可重复
     * @param book
     * @return
     */
    public boolean addBook(Book book);

    /**
     * 根据图书名删除指定图书信息
     * @param bookName
     * @return
     */

    public boolean removeBookByBookName(String bookName);
}

BookServiceImpl:

package com.csx.service.impl;

import com.csx.dao.BookDao;
import com.csx.dao.impl.BookDaoImpl;
import com.csx.entity.Book;
import com.csx.service.BookService;
import com.csx.util.JDBCUtils;

import java.sql.Connection;
import java.util.List;

public class BookServiceImpl implements BookService {
    private BookDao bookDao =new BookDaoImpl();

    /**
     * 查询所有图书信息
     *
     * @return
     */
    @Override
    public List<Book> queryBooks() {
        return bookDao.selectBooks();
    }

    /**
     * 根据图书名查询指定图书信息
     *
     * @param bookName
     * @return
     */
    @Override
    public Book queryBookByBookName(String bookName) {
        return bookDao.selectBookByBookName(bookName);
    }

    /**
     * 插入新的图书信息,图书名不可重复
     *
     * @param book
     * @return
     */
    @Override
    public boolean addBook(Book book) {
        boolean boo =false;
        Connection conn =null;
        try{
            conn= JDBCUtils.startTransaction();
            //业务功能
            Book b = bookDao.selectBookByBookName(book.getBookName());
            if (b==null){
                bookDao.insertBook(book);
                boo=true;
            }else {
                throw new RuntimeException("图书存在,无法重复添加!");
            }
            JDBCUtils.commit(conn);
        }catch (Exception e){
            JDBCUtils.rollback(conn);
            throw new RuntimeException(e);
        }
        return boo;
    }

    /**
     * 根据图书名删除指定图书信息
     *
     * @param bookName
     * @return
     */
    @Override
    public boolean removeBookByBookName(String bookName) {
        return bookDao.deleteBookByBookName(bookName)==1?true:false;
    }
}

这里主要展示完整的实现流程,至于如何实现事务控制,我会在其他博客中详细说明

 八、书写Service层的测试类

BookServiceImplTest:

package com.csx.test;

import com.csx.entity.Book;
import com.csx.service.BookService;
import com.csx.service.impl.BookServiceImpl;
import org.junit.Test;

import java.util.List;

public class BookServiceImplTest {
    private BookService bookService =new BookServiceImpl();
    @Test
    public  void queryBooks(){
        List<Book> books = bookService.queryBooks();
        books.forEach(book -> System.out.println(book));
    }
    @Test
    public void queryBookByBookName(){
        Book book = bookService.queryBookByBookName("伪君子");
        System.out.println(book);
    }
    @Test
    public void addBook(){
       boolean n= bookService.addBook(new Book(null,"海鲜养殖","海王",22.4,100));
        if (n){
            System.out.println("新增成功");
        }else {
            System.out.println("新增失败");
        }
    }
    @Test
    public void removeBookByBookName(){
        boolean b = bookService.removeBookByBookName("海鲜养殖");
        if (b){
            System.out.println("删除成功");
        }else {
            System.out.println("删除失败");
        }

    }
}

UserServiceImplTest:

package com.csx.test;

import com.csx.service.UserService;
import com.csx.service.impl.UserServiceImpl;
import org.junit.Test;

public class UserServiceImplTest {
    private UserService userService =new UserServiceImpl();

    @Test
    public void register(){
        boolean b = userService.register("root1", "root");
        if (b){
            System.out.println("注册成功");
        }else {
            System.out.println("注册失败");
        }
    }
    @Test
    public  void  login(){
        boolean login = userService.login("root", "123456");
        if (login){
            System.out.println("登录成功");
        }else {
            System.out.println("登录是吧");
        }
    }

}

九、书写视图层

package com.csx.view;

import com.csx.entity.Book;
import com.csx.service.BookService;
import com.csx.service.UserService;
import com.csx.service.impl.BookServiceImpl;
import com.csx.service.impl.UserServiceImpl;

import java.util.List;
import java.util.Scanner;

public class BookManagerView {
    public static void main(String[] args) {
        //用户注册
        Scanner sc =new Scanner(System.in);
        UserService userService =new UserServiceImpl();
        while (true){
            System.out.println("请输入要注册的账户名:");
            String username = sc.next();
            System.out.println("请输入要注册的密码:");
            String password = sc.next();
           try{
                if(userService.register(username,password)) {
                System.out.println("注册成功!");
                break;
            }else {
                System.out.println("注册失败!");
                return;
            }
             }catch (RuntimeException e) {
            System.out.println(e.getMessage());
            return;
           }}
           //用户登录
        while (true) {
            System.out.println("请登录!");
            System.out.println("输入用户名:");
            String userName =sc.next();
            System.out.println("输入密码:");
            String passWord=sc.next();
            try{
                if(userService.login(userName,passWord)){
                    System.out.println("登录成功!");
                    break;
                }else {
                    System.out.println("登录失败");
                    continue;
                }
            }catch (Exception e){
                System.out.println(e.getMessage()+",请重试!");
                continue;
            }
        }
        int n;
        BookService bookService =new BookServiceImpl();
        do{
            System.out.println("---------------------------------------------------------------------------------------");
            System.out.println("Welcome To Use MyBMS!");
            System.out.println("请输入指定功能序号:");
            System.out.println("1.查询所有图书信息 2.查询指定图书信息");
            System.out.println("3.新增图书信息 4.删除图书 5.退出系统");
            n = sc.nextInt();
            if (n==5){
                System.out.println("退出成功!");
                break;
            }
            switch (n){
                case 1:
                    List<Book> books = bookService.queryBooks();
                    if (books==null){
                        System.out.println("不存在任何图书信息");
                        break;
                    }
                    books.forEach(book -> System.out.println(book));break;
                case 2:
                    System.out.println("请输入要查询图书的名字:");
                    String bookName = sc.next();
                    Book book = bookService.queryBookByBookName(bookName);
                    if (book==null){
                        System.out.println("图书不存在!");
                        break;
                    }
                    System.out.println(book);break;
                case 3:
                    System.out.println("请输入新增图书名:");
                    String newBookName = sc.next();
                    System.out.println("请输入新增图书作者:");
                    String bookAuthor =sc.next();
                    System.out.println("请输入新增图书价格:");
                    double bookPrice =sc.nextDouble();
                    System.out.println("请输入新增图书库存:");
                    int bookStock=sc.nextInt();
                    Book newBook =new Book(null,newBookName,bookAuthor,bookPrice,bookStock);
                    try{
                        System.out.println(bookService.addBook(newBook)?"新增图书成功!":"新增图书失败!");break;
                    }catch (Exception e){
                        System.out.println(e.getMessage());break;
                    }
                case 4:
                    System.out.println("请输入要删除的图书名:");
                    String removeBookName = sc.next();
                    System.out.println(bookService.removeBookByBookName(removeBookName)?"删除图书成功!":"图书不存在,删除图书失败!");
                default:
                    System.out.println("输入功能序号不存在!请重新输入!");
            }

        }while (n!=5);


    }
}

功能实现演示

一、注册和登陆功能

这里的注册和登陆功能的逻辑有些问题,只能先注册再登陆(当然在登陆操作时可以使用数据库t_user表中已经存在的数据);

流程:先注册 ->再登陆

二、查询所有书籍信息 

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

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

相关文章

jmeter 梯度测试 如何查看TPS、RT指标

TPS 服务器处理请求总数/花费的总时间 149371 &#xff08;请求量&#xff09; 113&#xff08;1分53秒&#xff09;1321/秒 跟汇总报告的吞吐量差不多&#xff0c;可以认为吞吐量TPS 平均值&#xff0c;中位数&#xff0c;最大值&#xff0c;最小值的单位都是毫秒ms 下载插…

用Git把本地仓库上传到远程仓库

用Git把本地仓库上传到远程仓库 GitHub创建远程仓库 在创建新仓库界面里输入你的仓库名后点击Create repository就好了。 创建本地项目 当你已经有一个项目后在命令行输入如下指令即可 git init git commit -m "first commit" git branch -M main git remote a…

寄存器映射及地址计算(STM32F407)

上篇文章介绍了存储器映射&#xff08;存储器映射&#xff08;STM32F407&#xff09;-CSDN博客&#xff09;&#xff0c;本文介绍寄存器映射的基本概念。 1、寄存器映射简介 寄存器是一类特殊的存储器&#xff0c;它的每个位都有特定的功能&#xff0c;可以实现对外设/功能的…

ubuntu16.04下qt5.7.1添加对openssl的支持

文章目录 前言一、编译安装openssl二、编译qt5.7.1三、配置qtcreator开发环境四、demo 前言 最近工作中要求客户端和服务端通过ssl加密通信,其中客户端是qt编程,服务端是linux编程.我的开发环境是ubuntu16.04;运行环境是debian9.13,是基于gnu的linux操作系统,64位arm架构. 一…

【数据库】|子查询

子查询 什么叫子查询&#xff1f;如何实现子查询&#xff1f; 定义&#xff1a;什么叫子查询&#xff0c;也就是先执行子查询&#xff0c;后执行父查询 ❓✅面试题&#xff1a;如何实现替换&#xff0c;执行顺序&#xff1f; 1、使用子查询&#xff0c;因为子查询会先执行子…

大语言模型LLM权重4bit向量量化(Vector Quantization)/查找表量化基本原理

参考 https://apple.github.io/coremltools/docs-guides/source/opt-palettization-overview.html https://apple.github.io/coremltools/docs-guides/source/opt-palettization-algos.html Apple Intelligence Foundation Language Models 苹果向量量化&#xff1a; DKM:…

深度学习基础--卷积的变种

随着卷积同经网络在各种问题中的广泛应用&#xff0c;卷积层也逐渐衍生出了许多变种&#xff0c;比较有代表性的有&#xff1a; 分组卷积( Group Convolution )、转置卷积 (Transposed Convolution) 、空洞卷积( Dilated/Atrous Convolution )、可变形卷积( Deformable Convolu…

协程的原理与实现:GMP源码走读

在计算机科学领域&#xff0c;尤其是在现代软件开发中&#xff0c;高并发处理能力是衡量技术架构性能的关键指标之一。Go语言&#xff0c;以其简洁的语法和内置的协程支持&#xff0c;为开发者提供了一套高效且易于使用的并发编程模型。本文深入剖析了Go语言协程的原理与其实现…

erlang学习:用ETS和DETS存储数据3,保存元组到磁盘

学习内容 ETS表把元组保存在内存里&#xff0c;而DETS提供了把Erlang元组保存到磁盘上的方法。DETS的最大文件大小是2GB。DETS文件必须先打开才能使用&#xff0c;用完后还应该正确关闭。如果没有正确关闭&#xff0c;它们就会在下次打开时自动进行修复。因为修复可能会花很长…

软件测试学习笔记丨Pytest的使用

本文转自测试人社区&#xff0c;原文链接&#xff1a;https://ceshiren.com/t/topic/22158 1. 简介 pytest是一个成熟的全功能python测试框架测试用例的skip和xfail&#xff0c;自动失败重试等处理能够支持简单的单元测试和复杂的功能测试&#xff0c;还可以用来做selenium/ap…

路由器的固定ip地址是啥意思?固定ip地址有什么好处

‌在当今数字化时代&#xff0c;‌路由器作为连接互联网的重要设备&#xff0c;‌扮演着举足轻重的角色。‌其中&#xff0c;‌路由器的固定IP地址是一个常被提及但可能让人困惑的概念。‌下面跟着虎观代理小二一起将深入探讨路由器的固定IP地址的含义&#xff0c;‌揭示其背后…

元学习之如何学习

首先第一个步骤&#xff08;如图1所示&#xff09;是我们的学习算法里要有一些要被学的东西&#xff0c;就像在 机器学习里面神经元的权重和偏置是要被学出来的一样。在元学习里面&#xff0c;我们通常会考虑要 让机器自己学习网络的架构&#xff0c;让机器自己学习初始化的参数…

echarts 水平柱图 科技风

var category [{ name: "管控", value: 2500 }, { name: "集中式", value: 8000 }, { name: "纳管", value: 3000 }, { name: "纳管", value: 3000 }, { name: "纳管", value: 3000 } ]; // 类别 var total 10000; // 数据…

RockyLinux8.9上yum安装redis6

我百思不得其解的一个问题 我想在RockyLinux8.9上安装redis6&#xff0c;通过yum list | grep redis看到的redis版本只有redis5 appstream-official仓库是我新加的&#xff0c;这里先不管 于是我通过浏览器访问appstream仓库https://dl.rockylinux.org/vault/rocky/8.9/AppSt…

MQTT broker搭建并用SSL加密

系统为centos&#xff0c;基于emqx搭建broker&#xff0c;流程参考官方。 安装好后&#xff0c;用ssl加密。 进入/etc/emqx/certs,可以看到 分别为 cacert.pem CA 文件cert.pem 服务端证书key.pem 服务端keyclient-cert.pem 客户端证书client-key.pem 客户端key 编辑emqx配…

ANSA联合abaqus的转动副创建方式

下面链接详细介绍了ANSA联合Abaqus创建转动副的过程&#xff1a; https://www.bilibili.com/video/BV1cb421b7z9/?spm_id_from333.880.my_history.page.clickhttps://www.bilibili.com/video/BV1cb421b7z9/?spm_id_from333.880.my_history.page.click

复盘高质量Vision Pro沉浸式视频的制作流程与工具

在探索虚拟现实(VR)和增强现实(AR)技术的过程中,高质量的沉浸式体验是至关重要的。最近,国外开发者Dreamwieber在其作品中展示了如何使用一系列工具和技术,创造出令人震撼的Vision Pro沉浸式视频。本文将详细复盘Dreamwieber的工作流,希望能为从事相关领域的开发者们提…

综合评价 | 基于熵权-变异系数-博弈组合法的综合评价模型(Matlab)

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 根据信息熵的定义&#xff0c;对于某项指标&#xff0c;可以用熵值来判断某个指标的离散程度&#xff0c;其信息熵值越小&#xff0c;指标的离散程度越大&#xff0c; 该指标对综合评价的影响&#xff08;即权重&…

【JAVA入门】Day34 - Stream流

【JAVA入门】Day34 - Stream流 文章目录 【JAVA入门】Day34 - Stream流一、Stream 流的作用和使用步骤1.Stream流的创建&#xff0c;数据的添加2. Stream流的中间方法3. Stream流的终结方法 Stream 流有什么作用&#xff1f;我们看一个例子&#xff1a; 【练习】需求&#xff…

SQL的高级查询练习知识点下(day26)

1 学习目标 重点掌握分组查询的语法 重点掌握分页查询的语法 2 分页查询 2.1 语法 SELECT 字段|表达式,... FROM 表 [WHERE 条件] [GROUP BY 分组字段] [HAVING 条件] [ORDER BY 排序的字段] LIMIT [起始的条目索引,]条目数; 2.2 特点 起始条目索引从0开始 limit子句放在…