Mybatis-plus动态数据库之主、副数据库配置从数据库(主数据库或其它数据库都可以)读取

Mybatis-plus实现多数据源主从库读取写入 之前的项目都是使用通用Mapper,对于简单的单表CRUD无论是通用Mapper和MP都是支持的很好了,无论选择哪种都能适用我们的项目,为什么之前用的通用Mapper现在想用MP呢,主要是通用Mapper的社区太不活跃了,遇到问题在群里提出问题的时候,基本上是没人回复的,相比这些MP就比较好了。 对于MP的使用,看MP的文档,已经基本就会用了,这些对新手还是挺好的。 我这边用的是S... 阅读详情

我卑微Java开发攻城狮一名,最近在做一个项目,Mysql、Oracle、Sql server、PostgreSql都有用到,所以需要用到动态数据库。本人采用Mybatis-plus的动态数据源,但是我这数据库有点多,放到yml不好管理、也不太安全,于是我就想到从一个数据库(主数据库)读取所有数据库信息,但是Mybatis-plus的动态数据配置是自动加载yml或properties配置文件的,所以我加了一个处理器来更改Spring中的bean,从而更改动态数据源加载配置的方法,通过读取主数据库一个表(dbs),把所有的数据库信息加载到mybatis-plus动态数据源配置信息中去,这样既方便又安全,还便于管理。话不多硕,干就完了,奥利给!

1.这是Java相关代码,当然你可以改代码,可以把副(从)数据库配置放到其他数据库,MySQL或Redis都可以

package com.qy.processor;

import com.baomidou.dynamic.datasource.DynamicDataSourceCreator;
import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;
import com.baomidou.dynamic.datasource.provider.YmlDynamicDataSourceProvider;
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DataSourceProperty;
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceProperties;
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.druid.DruidConfig;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by Because of you on 2019/12/29.
 */
@Component
@PropertySource({"classpath:db.properties"})//加载resource下的db.properties
public class DbProcessor implements BeanPostProcessor {
    @Value("${db.driver}")
    private String driver;
    @Value("${db.url}")
    private String url;
    @Value("${db.username}")
    private String username;
    @Value("${db.password}")
    private String password;
    @Value("${db.sql}")
    private String sql;
    @Autowired
    private DefaultListableBeanFactory defaultListableBeanFactory;
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        //设置数据库配置
        if(StringUtils.endsWithIgnoreCase(beanName,"dynamicDataSourceProvider")) {
            boolean containsBean = defaultListableBeanFactory.containsBean("dynamicDataSourceProvider");
            if(containsBean) {
                defaultListableBeanFactory.removeBeanDefinition("dynamicDataSourceProvider");
            }
            defaultListableBeanFactory.registerBeanDefinition("dynamicDataSourceProvider", BeanDefinitionBuilder.genericBeanDefinition(DynamicDataSourceProperties.class).getBeanDefinition());
            bean = null;
            DynamicDataSourceCreator dynamicDataSourceCreator = (DynamicDataSourceCreator) defaultListableBeanFactory.getBean("dynamicDataSourceCreator");
            YmlDynamicDataSourceProvider ymlDynamicDataSourceProvider = new YmlDynamicDataSourceProvider(this.createDynamicDataSourceProperties(),dynamicDataSourceCreator);
            return ymlDynamicDataSourceProvider;
        }
        //设置主数据库
        if(StringUtils.endsWithIgnoreCase(beanName,"dataSource")) {
            DynamicRoutingDataSource dynamicRoutingDataSource = (DynamicRoutingDataSource)bean;
            dynamicRoutingDataSource.setPrimary("oracle");
            return  dynamicRoutingDataSource;
        }
        return bean;
    }
    public DynamicDataSourceProperties createDynamicDataSourceProperties() {
        Map<String,DataSourceProperty> map = new HashMap<String,DataSourceProperty>();
        DataSourceProperty mainDbProperty = new DataSourceProperty();
        //把主数据设置进去
        mainDbProperty.setDriverClassName(driver);
        mainDbProperty.setUrl(url);
        mainDbProperty.setUsername(username);
        mainDbProperty.setPassword(password);
        map.put("oracle",mainDbProperty);
        List<Map<String,String>> list = this.listDbs();
        DataSourceProperty otherDbProperty =  null;
        //设置副数据库
        for (Map<String,String> tmpMap : list) {
            otherDbProperty = new DataSourceProperty();
            String nickname = tmpMap.get("nickname");
            otherDbProperty.setDriverClassName(tmpMap.get("driver"));
            otherDbProperty.setUrl(tmpMap.get("url"));
            otherDbProperty.setUsername(tmpMap.get("username"));
            otherDbProperty.setPassword(tmpMap.get("password"));
            map.put(nickname,otherDbProperty);
        }
        DruidConfig druidConfig = this.createDruidConfig();
        DynamicDataSourceProperties dynamicDataSourceProperties = new DynamicDataSourceProperties();
        dynamicDataSourceProperties.setDruid(druidConfig);
        dynamicDataSourceProperties.setDatasource(map);
        return dynamicDataSourceProperties;
    }

    /**
     * 获取数据库连接
     * @return
     */
    public Connection getConnection() throws ClassNotFoundException, SQLException {
        Class.forName(driver);
        return DriverManager.getConnection(url,username,password);
    }

    /**
     * 查询所有数据库配置
     * @return
     */
    public List<Map<String,String>> listDbs() {
        List<Map<String,String>> resultList = null;
        Connection connection = null;
        PreparedStatement ps = null;
        ResultSet rs =  null;
        try {
            connection =  this.getConnection();
            ps = connection.prepareStatement(sql);
            rs = ps.executeQuery();
            resultList = new ArrayList<Map<String,String>>();
            Map<String,String> resultMap = null;
            while (rs.next()) {
                String nickname = rs.getString("NICKNAME");
                String dbdriver = rs.getString("DRIVER");
                String dburl = rs.getString("URL");
                String dbusername = rs.getString("USERNAME");
                String dbpassword = rs.getString("PASSWORD");
                resultMap = new HashMap<String,String>();
                resultMap.put("nickname",nickname);
                resultMap.put("driver",dbdriver);
                resultMap.put("url",dburl);
                resultMap.put("username",dbusername);
                resultMap.put("password",dbpassword);
                resultList.add(resultMap);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally{
            if(rs!=null) {
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(ps!=null) {
                try {
                    ps.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(connection!=null) {
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            return  resultList;
        }
    }

    /**
     * 配置druid连接池配置
     * @return
     */
    public DruidConfig createDruidConfig() {
        DruidConfig druidConfig = new DruidConfig();
        druidConfig.setInitialSize(10);
        druidConfig.setMaxActive(100);
        druidConfig.setMinIdle(10);
        druidConfig.setMaxWait(60000L);
        druidConfig.setPoolPreparedStatements(true);
        druidConfig.setMaxPoolPreparedStatementPerConnectionSize(20);
        druidConfig.setTimeBetweenEvictionRunsMillis(60000L);
        druidConfig.setMinEvictableIdleTimeMillis(300000L);
        //validation-query: SELECT 1 FROM DUAL
        druidConfig.setTestWhileIdle(true);
        druidConfig.setTestOnBorrow(false);
        druidConfig.setTestOnReturn(false);
        druidConfig.setFilters("stat,wall");
        return druidConfig;
    }
}

2.我用的主数据是oracle,这是db.properties,放到Springboot resource目录下,当然你的主数据连接信息也可以加密,相关业务代码你可以自己添加

db.driver=oracle.jdbc.driver.OracleDriver
db.url=jdbc:oracle:thin:@127.0.0.1:1521:myorcl
db.username=数据库名
db.password=密码
db.sql=select nickname,driver,url,username,password from DBS

3.创建副(从)数据库配置表

create table dbs(
     id number(4) primary key,
     nickname varchar2(8) not null,
     driver varchar2(32) not null,
     url  varchar2(64) not null,
     username varchar2(32) not null,
     password varchar2(32) not null,
     create_time date,
     remark varchar2(128)
)

老铁!别走,如果我的代码可以帮到你,请给我一颗小心心。奥利给!

                                                         非学无以广才,非志无以成学。

 

SpringBoot+MybatisPlus多数据源配置,主从库读写分离完整讲解 前言 参考文章:基于Mybatis框架,采用切面编程方式实现      https://www.jianshu.com/p/2222257f96d3 以上,包括其他技术文章,实现方式都是大同小异,都存在着一些小问题。譬如: 采用切面编程,字符串匹配方式,局限于方法写死,特别是项目处于开发收尾的话,改动代码量大。 以注解的方式类同。 本篇优势: 源代码不变(通过mybatis拦截器),易... 阅读详情

相关推荐

springboot+mybatis-plus实现多数据源(从数据库加载多数据源)

所以我们初始化的时候就需要配置这两个属性,默认数据源就是主数据源。但是我们初始化的时候数据源对象还没生成并没有读取数据库,那我们的数据源怎么加载了,这里我用到了一个全局的hashMap。springboot+mybatis-plus配置多数据源的方式网上有很多,但是都是把数据源配置在yml或者properties中,由于本人所在项目需要从数据库加载数据源,所以本文介绍本人实现的方法是从数据库加载数据源。4.经过上面的,主数据源就已经配置完成了,并且提供的一个可以随时添加数据源的map。...

web18224617243的博客 6077

基于mybaits-plus实现动态数据源

基于mybaits-plus动态数据源

hanwang2008的博客 948

基于mybatis-plus历史背景下的多租户平台改造

别误会,本篇【并不是】要用mybatis-plus自身的多租户方案:在表中加一个tenant_id字段来区分不同的租户数据。并不是的!而是在假设业务系统已经使用mybatis-plus多数据源的前提下,如何实现业务数据库隔开的多租户系统。这里面有点绕:多数据源可以是一个系统本身的功能需求,假设当前系统算做是个单租户,它使用了两个数据库:master1和sys1master2和sys2, 总共就是四个数据库(数据源)了…咱们这里简单化处理,假设一个业务系统只使用一个数据库。

酸衡子的博客 1043

SpringBoot整合Mybatisplus实现完全动态获取多数据源

SpringBoot整合Mybatisplus实现完全动态获取多数据源

nandao158的博客 6224

SpringBoot多数据源实践:基于场景的构建、实现和事务一体化研究

java代码解读复制代码user.setUsername("张三");role.setRole("管理员");int a=1/0;结果:master回滚,slave回滚、temp回滚只有一个服务,切用到多个数据源时,用@DSTransational注解比较方便,可以控制多数据源进行回滚。为什么说只有一个服务采用@DSTransactional注解,多服务不行吗?不行。

2403_88969259的博客 763

【gateway nc adapter虚拟网卡 win11 联想】问题的解决

由于需要登录公司内网,于是启用奇安信VPN。但启动后报出网关未连接的问题,于是我检查了我的网络适配器,并尝试解决,以下给出几种我实践过程中的行动,并附带最后成功的解决方法。

m0_73602417的博客 6559

springboot+mybatis-plus实现读写分离

shigen坚持日更的博客写手,擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。坚持记录和分享从业两年以来的技术积累和思考,不断沉淀和成长。最近shigen加班也比较严重,很多天文章没有更新了,各位读者和伙伴见谅哈。好的,现在我们进入正题。在之前的文章中,我相信伙伴们已经清楚了docker如何快速的搭建mysql主从服务了。那怎么使用呢?这个问题在shigen的心里藏了很久,趁着周末的功夫我正好研究了一下,并把我的代码放在了gitee上,感兴趣的伙伴可以自己上去看看。

shigen的博客 287

基于单片机的自动喷淋系统设计【毕业设计】

随着人民生活质量提高与生活节奏的加快,城市居民对于花草绿植的家庭培养与装饰需求增加,随之因浇灌植物的需要,智能浇花系统的市场逐渐扩大。现有自动浇花系统大部分只能通过设置固定浇水时间而难以实现适时、适量浇水,或在植物环境土壤含水量低时进行报警而并不能实际补水。为克服局限性而设计以单片机为控制中心的自动浇花系统。通过湿度传感器检测目标植物环境土壤湿度数据,再经ADCO832将其放大转换为数字量,由单片机读取输出向LCD1602 显示屏显示并通过比对键盘向单片机所设置的湿度范围而利用中断服务程序进行补水需求判断。

qq_48771816的博客 1712

Spring Boot + Mybatis 多数据源配置实现读写分离

本文来自网易云社区作者:王超应用场景:项目中有一些报表统计与查询功能,对数据实时性要求不高,因此考虑对报表的统计与查询去操作slave db,减少对master的压力。根据网上多份资料测试发现总是使用master数据源,无法切换到slave,经过多次调试修改现已完美通过,现整理下详细步骤和完整代码如下:实现方式:配置多个数据源,使用Spring AOP实现拦截注解实现数据源的动态切换。1. app...

网易数帆社区博客 1997

(南京观海微电子)——TCON介绍

TCON又称:逻辑板,控制板,在液晶电视里的作用和CRT中的视放板相当,但有本质的区别,逻辑板不是一个纯粹的信号放大器,它输入是LVDS格式信号,而不是RGB。逻辑板的作用是把数字板送来的LVDS或TTL图像数据信号,时钟信号进行处理移位寄存器存储将图像数据信号,时钟信号转换成屏能够识别的控制信号行列信号RSDS控制屏内的MOSFET管工作而控制液晶分子的扭曲度。目前国内主要的TCON板生产商有视显光电。传统TCON的布局主要分为以下两种:X+C分离式和X+C一体式。

m0_75095200的博客 3835

STM32F103内部晶振配置实战:从代码修改到频率验证(附工程模板)

本文详细介绍了STM32F103内部晶振(HSI)的配置实战,从代码修改到频率验证的全流程,并附赠可直接使用的工程模板。通过对比HSI与外部晶振的优缺点,帮助开发者在成本敏感和空间受限的应用中实现稳定时钟配置,同时提供频率校准和常见问题排查方法。

weixin_29171087的博客 323

深度揭秘:Java 应用程序中实现数据库读写分离的高效策略与实战

这种方式通过自定义数据源路由和 mybatis 拦截器,实现根据 SQL 语句类型自动切换主从数据源,从而达到读写分离的效果。1、引入依赖</</</</配置数据源3、定义数据源枚举MASTER,SLAVE线程级数据源上下文管理动态路由数据源@Slf4j@Overridelog.info("DynamicRoutingDataSource 切换数据源到从库");log.info("DynamicRoutingDataSource 切换数据源到主库");

kingwinstar的博客 993

蓝牙钥匙 第48次 全面解析防中继攻击保护:从原理到防护技术实践

中继攻击已成为物联网安全领域的重要威胁,2023年全球相关损失达数十亿美元。本文深入分析中继攻击原理,揭示其通过转发设备延长通信距离而不破解加密的特点。重点探讨两种关键防护技术:基于距离测量的方法(包括UWB超宽带技术)可精确检测异常距离;基于时间戳的挑战-响应机制则通过严格时间窗口识别中继延迟。文章还提出多层次防护体系构想,结合AI异常检测和量子安全协议等前沿技术。研究显示,集成多种防护技术并遵循行业标准是应对中继攻击的有效途径,为物联网设备安全提供重要参考。

IT深耕十余载,大道之简 1835

【亲测免费】 SpringBoot-DynamicDataSource 使用教程

SpringBoot-DynamicDataSource 是一个用于 Spring Boot 项目的动态数据源管理库。它支持多数据源配置,包括主从分离、读写分离和分布式事务等功能。该项目旨在简化在 Spring Boot 应用中管理多个数据源的复杂性,提供了一种灵活且高效的方式来处理数据源切换和配置。 ## 项目快速启动 ### 1. 添加依赖 首先,在您的 Spring Boot 项目的

gitblog_00963的博客 1112

leaflet 综合教程170+ 【目录 】(已包含162篇文章)

vue+leaflet系列教程旨在为开发者提供简单快捷的,。在每一个示例中,解释相应的API知识点,做到。注意本示例目录中的内容可能加载是vue+openlayers的示例, 本目录是要加载vue+leaflet的示例,只是内容少,逐渐更新中。

大剑师兰特的GIS世界 1万+

【车载以太网】【AVB/TSN】IEEE802.1Qav队列及转发协议

目录 一、概述 二、优先级排队算法 三、基于信用的流量整形算法 一、概述 IEEE 802.1Qav 队列及转发协议(Qav)针对不同数据流选择不同的传输选择算法来保障对时间敏感的 AV 数据流的实时传输。为了避免传统的异步以太网数据流量与 AVB 流量之间对网络资源的竞争,AVB 交换机内使用优先级排队算法和基于信用的流量整形算法实现数据流的调度。 二、优先级排队算法 优先级排队算法主要用于传统以太网数据流(BE, Best Effort)的调度传输,BE 流通过基于优先级...

专注汽车软件开发、AutoSAR、车载以太网、SOA、EE架构。 4689

基于Vue3+SpringBoot前后端分离音乐网站全栈开发实战

前后端分离架构是现代Web开发的主流范式,其核心原理是将用户界面与业务逻辑解耦,通过API进行通信。这种架构模式带来了职责清晰、并行开发和独立部署等技术价值,广泛应用于电商、社交、内容平台等复杂应用场景。在Java全栈开发领域,Spring Boot凭借其快速构建和简化配置的特性,成为后端开发的热门选择,而Vue.js则以其响应式和组件化优势在前端生态中占据重要地位。结合MySQL、Redis和JWT等关键技术,可以构建出高性能、可扩展的Web应用。本文将以一个音乐网站项目为例,手把手演示如何整合Vue 3

weixin_30600197的博客 429

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Spring定时任务实现高效跨库数据同步

功能描述:从数据库读取同步任务配置,根据每个任务配置的 Cron 表达式判断是否需要执行,支持灵活的定时策略。2. 从配置表获取启用的数据库连接配置(源库URL、用户名、密码、schema,目标库对应信息)功能描述:从配置表中读取源库和目标库的连接信息,以及需要同步的表列表,实现跨库数据同步。5. 逐表执行同步:先从源库查询全量数据,然后删除目标库原有数据,最后批量插入新数据。2. 配置化设计:数据库连接、同步表、同步 SQL 均存储在数据库中,支持动态配置。4. 分别建立源库和目标库的 JDBC 连接。

m0_59296485的博客 384

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Java全栈实习管理系统:Spring Boot与Vue3实战解析

现代Web开发中,前后端分离架构已成为主流技术范式,其通过RESTful API实现数据交互,显著提升开发效率与系统可维护性。以Spring Boot为代表的后端框架提供强大的IoC容器和自动化配置,结合MyBatis-Plus等ORM工具可高效实现数据持久化。Vue3的Composition API则革新了前端状态管理方式,配合Vite构建工具实现极致性能。这种技术组合特别适合教育管理类系统开发,如文中介绍的实习管理系统,它采用MySQL 8.0处理业务数据,利用WebSocket实现实时通知,展现了全栈

weixin_30655569的博客 489

SpringBoot+MybatisPlus(多数据源和主从分离)

简介 dynamic-datasource-spring-boot-starter 基于 springBoot2.0. 它适用于读写分离,一主多从的环境。 主数据库使用 INSERT UPDATE DELETE 操作. 从数据库使用 SELECT 操作. 如果你的项目比较复杂,建议使用 sharding-jdbc . 示例 dynamic-datasource-example 一个简...

weixin_34092455的博客 601

计算机毕业设计房屋租赁开题报告:基于Spring Boot的实战系统架构与避坑指南

通过以上步骤,你应该能够搭建起一个结构清晰、功能完整、具备一定健壮性的房屋租赁系统后端。这份开题报告和随之产生的代码,足以让你在答辩时清晰地阐述你的技术选型依据架构设计思路核心业务流程实现以及对安全性能的考量。如何让项目更进一步?预约看房功能:在房源和订单之间引入一个(看房预约)实体,设计其状态(待确认、已安排、已完成、已取消),并处理房源时间段的冲突问题。这涉及到更复杂的业务规则校验。信用评分体系:为User实体增加信用分字段。

2600_94960230的博客 101

SpringBoot+Vue构建企业级多维知识管理系统

知识管理系统是企业数字化转型的核心基础设施,其核心价值在于实现信息的结构化存储与智能检索。通过SpringBoot+Vue技术栈构建的系统架构,采用动态维度建模技术解决传统分类体系固化问题,结合MPTT算法实现高性能分类树查询。在工程实践层面,系统整合了MySQL全文检索与Elasticsearch混合搜索方案,并基于RBAC扩展模型实现细粒度权限控制。典型应用场景包括制造业设备知识库、医疗科研文献平台等,其中Vuex状态管理可降低40%内存占用,MyBatis-Plus使多维度查询代码量减少60%。这种架

weixin_30788239的博客 567

Campus-imaotai:基于Spring Boot与Vue的i茅台自动化预约系统技术架构解析

Campus-imaotai是一款基于Spring Boot 2.5与Vue.js 2.x构建的i茅台应用自动化预约系统,通过微服务架构和定时任务调度机制,实现了茅台商品预约流程的全面自动化。该系统采用前后端分离设计,后端基于Java技术栈提供RESTful API服务,前端采用Element UI构建管理界面,支持多用户账号管理、智能门店匹配、定时预约执行等核心功能。 ## 技术架构解析 #

gitblog_00795的博客 1118

AI代码助手实战:零代码构建企业级数据看板

在数据驱动的时代,企业级数据可视化与报表开发是提升业务洞察力的核心技术。其核心原理在于将多源异构数据通过ETL、SQL查询与API接口进行整合,并利用前端图表库进行直观展示,从而实现从数据到决策的价值转化。这项技术在商业智能、运营监控和财务分析等场景中至关重要,能显著提升决策效率与数据透明度。本文聚焦于如何利用AI代码助手这一前沿工具,结合开源低代码报表平台,高效完成从复杂SQL生成、后端接口开发到前端图表集成的全流程实战。通过引入Claude Code与DeepSeek模型,我们将深入探讨如何通过精准的提

341
上一篇: Vue实现百度离线地图(v2.0)
下一篇: Java 爬虫之识别图片验证码后登录
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值