博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SSM 整合 以及 Ehcache 步骤
阅读量:4097 次
发布时间:2019-05-25

本文共 21572 字,大约阅读时间需要 71 分钟。

Spring 整合 MyBatis 整合步骤

 

1、建立工程,加入Spring和MyBatis的有关jar包

2、建立开发目录结构,创建实体类

3、创建访问数据接口

4、数据数据访问接口的实现类

5、配置SQL映射语句文件

6、配置Mybatis应用配置文件

7、配置Spring应用配置文件

 

---------------------------------------------

配置

configuration 配置

properties 可以配置在Java 属性配置文件中

settings 修改 MyBatis 在运行时的行为方式

typeAliases 为 Java 类型命名一个别名(简称)

typeHandlers 类型处理器

objectFactory 对象工厂

plugins 插件

environments 环境

environment 环境变量

transactionManager 事务管理器

dataSource 数据源

 

mappers  映射器

-------------------------------------------------------

 

spring和springMVC和mybatis整合步骤

 

mybatis-config.xml

 

 

 

AppalicationContext-mvc.xmv

104857600
4096
utf-8

 

 

 

 AppalicationContext.xml

 

/WEB-INF/classes/dbconfig.properties
/static/login/** = anon /static/js/myjs/** = authc /static/js/** = anon /code.do = anon /login_login = anon /app**/** = anon /weixin/** = anon /** = authc

 

===========================

Ehcache 缓存

合理使用缓存

在**mapper.xml 文件如同加入

<!-- 以下两个<cache>标签二选一,第一个可以输出日志,第二个不输出日志 -->  

 <cache type="org.mybatis.caches.ehcache.LoggingEhcache"/>  

<!-- <cache type="org.mybatis.caches.ehcache.EhcacheCache"/> -->  

 

 

这样本页面所有都默认加入缓存,请注意不能乱加,具体如何合理加入缓存,请百度搜索详细资料,我就不在此啰嗦

 

单个开关

Insert  update  delete   flushCache="false"

Select  useCache="false"

 

 

=================================================

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

=======================

项目用到spring+mybatis框架,弄了一上午的spring+ehcache的整合,就是不见效果,后来发现Mybatis与Ehcache整合也需要进行配置,两个都配置会大大降低数据库压力。下面把我的配置过程写下来供大家参考。

 

1. 下载mybatis相关包与ehcache相关包

下载地址为:

2. 在Map文件中打开echached效果,userMapper.xml文件内容如下:

 

Java代码  
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >  
  3. <mapper namespace="com.erpbase.dao.UserMapper">  
  4.               <!-- 以下两个<cache>标签二选一,第一个可以输出日志,第二个不输出日志 -->  
  5.     <cache type="org.mybatis.caches.ehcache.LoggingEhcache" />  
  6.     <cache type="org.mybatis.caches.ehcache.EhcacheCache" />  
  7.     ......  
  8. </mapper>  

 3. 配置ehcache.xml 

 

Java代码  
  1. <?xml version="1.0" encoding="UTF-8"?>    
  2. <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd">  
  3.     <diskStore path="java.io.tmpdir"/>   
  4.      
  5.     <defaultCache      
  6.             maxElementsInMemory="3000"      
  7.             eternal="false"      
  8.             timeToIdleSeconds="3600"      
  9.             timeToLiveSeconds="3600"      
  10.             overflowToDisk="true"      
  11.             diskPersistent="false"      
  12.             diskExpiryThreadIntervalSeconds="100"      
  13.             memoryStoreEvictionPolicy="LRU"      
  14.             />      
  15.     <cache name="userCache"      
  16.            maxElementsInMemory="3000"      
  17.            eternal="false"      
  18.            overflowToDisk="true"      
  19.            timeToIdleSeconds="3600"      
  20.            timeToLiveSeconds="3600"      
  21.            memoryStoreEvictionPolicy="LFU"      
  22.             />    
  23.     ......  
  24. </ehcache>  

 参数说明:

 

 <!-- 

        name: cache的名字,用来识别不同的cache,必须惟一。   

maxElementsInMemory: 内存管理的缓存元素数量最大限值。   

maxElementsOnDisk: 硬盘管理的缓存元素数量最大限值。默认值为0,就是没有限制。   

eternal: 设定元素是否持久话。若设为true,则缓存元素不会过期。   

overflowToDisk: 设定是否在内存填满的时候把数据转到磁盘上。

timeToIdleSeconds: 设定元素在过期前空闲状态的时间,只对非持久性缓存对象有效。默认值为0,值为0意味着元素可以闲置至无限长时间。   

timeToLiveSeconds: 设定元素从创建到过期的时间。其他与timeToIdleSeconds类似。   

diskPersistent: 设定在虚拟机重启时是否进行磁盘存储,默认为false.(我的直觉,对于安全小型应用,宜设为true)。   

diskExpiryThreadIntervalSeconds: 访问磁盘线程活动时间。   

diskSpoolBufferSizeMB: 存入磁盘时的缓冲区大小,默认30MB,每个缓存都有自己的缓冲区。   

memoryStoreEvictionPolicy: 元素逐出缓存规则。共有三种,Recently Used (LRU)最近最少使用,为默认。 First In First Out (FIFO),先进先出。Less Frequently Used(specified as LFU)最少使用  

--> 

4. 配置applicationContext-ehcache.xml

 

Java代码  
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!-- /** * * 缓存配置 *  * */ -->  
  3. <beans xmlns="http://www.springframework.org/schema/beans"  
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  5.     xmlns:ehcache="http://ehcache-spring-annotations.googlecode.com/svn/schema/ehcache-spring"  
  6.     xsi:schemaLocation="      
  7.     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd      
  8.     http://ehcache-spring-annotations.googlecode.com/svn/schema/ehcache-spring    
  9.     http://ehcache-spring-annotations.googlecode.com/svn/schema/ehcache-spring/ehcache-spring-1.1.xsd">  
  10.   
  11.     <!-- <ehcache:annotation-driven /> -->  
  12.   
  13.     <ehcache:annotation-driven cache-manager="ehcacheManager" />  
  14.   
  15.     <ehcache:config cache-manager="ehcacheManager">  
  16.         <ehcache:evict-expired-elements interval="60" />  
  17.     </ehcache:config>  
  18.       
  19.     <bean id="ehcacheManager"  
  20.         class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">  
  21.         <property name="configLocation" value="classpath:ehcache.xml" />  
  22.     </bean>  
  23. </beans>  

 5. 在spring-mvc.xml 中加入如下内容,将ehcache相关配置装配到spring容器中:

 

 

Java代码  
  1. <!-- 加载ehcache缓存配置文件     
  2.         说明:在这里我遇到了这样一个问题,当使用@Service等注解的方式将类声明到配置文件中时,    
  3.         就需要将缓存配置import到主配置文件中,否则缓存会不起作用    
  4.         如果是通过<bean>声明到配置文件中时,    
  5.         则只需要在web.xml的contextConfigLocation中加入applicationContext-ehcache.xml即可,    
  6.         不过还是推荐使用如下方式吧,因为这样不会有任何问题    
  7.     -->    
  8.     <import resource="classpath:applicationContext-ehcache.xml"/>  

 6. 在userServiceImpl.java中加入通过注解进行配置:

 

 

Java代码  
  1.        @Cacheable(cacheName="userCache")  <strong>//这里的cacheName要跟ehcache.xml中保持一致</strong>  
  2. public List<User> getUserList(User user, Map<String, Object> map) {  
  3.     long l1 = new Date().getTime();  
  4.   
  5.     List<User> list = userMapper.getUserList(user);  
  6.     Integer listSize = userMapper.getUserCount(user);  
  7.   
  8.     long l2 = new Date().getTime();  
  9.     System.out.println("++++++++++++total time use: " + (l2-l1));  
  10.   
  11.     map.put("rows", list);  
  12.     map.put("total", listSize);  
  13.   
  14.     return list;  
  15. }  

 

 

到此spring+mybatis+EHCache配置完成。可以对比在加上@Cacheable(cacheName="userCache")和不加的两种情况下的(l2-l1)的时间,在我本地如果不加用时在40ms左右,加上之后第一次加载是40ms,第二次用时1ms,说明第一次加载的数据已经被放到缓存当中去,可见效率得到极大提升。

 

 

 

拓展说明:

对于清除缓存的方法,ehcache提供了两种,一种是在ehcache.xml中配置的时间过后自动清除,一种是在数据发生变化后触发清除。个人感觉第二种比较好。可以将 

@TriggersRemove(cacheName="userCache",removeAll=true)

@TriggersRemove(cacheName="userCache", when=When.AFTER_METHOD_INVOCATION, removeAll=true) 

这句代码加到service里面的添加、删除、修改方法上。这样只要这几个方法有调用,缓存自动清除。

 

对于Mybatis更简单,对不想缓存的sql结果,可以再后面添加useCache="false"即可:

 

Java代码  
  1. <select id="getLabelValueList" resultMap="BaseResultMap" parameterType="com.Product" useCache="false">  
  2. select Id, Name  
  3. from Product  
  4. where Enable = 1  
  5. <if test="shopid != null and shopid != 0 " >  
  6.   AND Id not in (select Productid from shopproduct where shopid = #{shopid})   
  7. </if>  
  8. order by Id  
  9. </select>  

 

==============================================

 

 

 

使用Maven搭建Spring+SpringMVC+Mybatis+ehcache项目

==============================================

搭建Spring不用说肯定是必须的,前端使用SpringMVC 而不使用Struts2是因为SpringMVC的效率要比struts2要高很多,虽然struts2有丰富的标签可以使用,使用Mybatis是因为以后项目要做报表模块,Mybatis使用SQL Mapping的方式很容易操作数据库。

这里我们使用intellij idea来做我们的开发工具,废话不多说,开干。框架的版本是

Spring 3.2.8.RELEASE

Spring MVC 3.2.8.RELEASE

mybatis 3.2.8

一、创建Maven Web项目

(略)本项目中用的maven是 3.3.3版本的,要求jdk版本是1.7之后的

二、在pom.xml中加入项目依赖的jar包

项目包依赖关系如下:

pom文件如下:

1.7
UTF-8
UTF-8
2.2
1.2
3.0.1
3.2.8.RELEASE
1.7.5
4.11
org.aspectj
aspectjrt
1.8.7
org.aspectj
aspectjweaver
1.8.7
org.springframework
spring-webmvc
${spring-framework.version}
org.springframework
spring-tx
${spring-framework.version}
org.springframework
spring-jdbc
${spring-framework.version}
org.springframework
spring-test
${spring-framework.version}
test
org.springframework
spring-tx
${spring-framework.version}
org.springframework
spring-web
${spring-framework.version}
org.slf4j
slf4j-api
${slf4j.version}
compile
org.slf4j
slf4j-log4j12
1.7.12
org.mybatis
mybatis-spring
1.2.2
org.mybatis
mybatis
3.2.8
org.mybatis
mybatis-ehcache
1.0.0
mysql
mysql-connector-java
5.1.34
junit
junit
${junit.version}
test
commons-dbcp
commons-dbcp
1.4
commons-lang
commons-lang
2.5
javax.servlet
jstl
${jstl.version}
javax.servlet
javax.servlet-api
${servlet.version}
provided
javax.servlet.jsp
jsp-api
${jsp.version}
provided
org.apache.taglibs
taglibs-standard-impl
1.2.3

三、添加日志的支持

日志我们使用slf4j,并用log4j来实现

SLF4J不同于其他日志类库,与其它有很大的不同。SLF4J(Simple logging Facade for Java)不是一个真正的日志实现,而是一个抽象层( abstraction layer),它允许你在后台使用任意一个日志类库。

SLF4J还有很多优点,具体可以参考 

日志的实现类还是用熟悉的log4j,先要在项目的pom.xml文件中加入日志的支持

org.slf4j
slf4j-api
1.7.5
compile
org.slf4j
slf4j-log4j12
1.7.12

配置很简单,log4j的详细配置可以参考log4j官网

log4j.properties

log4j.rootLogger=INFO,Console,Filelog4j.appender.Console=org.apache.log4j.ConsoleAppenderlog4j.appender.Console.Threshold = DEBUGlog4j.appender.Console.layout=org.apache.log4j.PatternLayoutlog4j.appender.Console.layout.ConversionPattern=%d %p [%c]  - %m%nlog4j.appender.A2=org.apache.log4j.DailyRollingFileAppenderlog4j.appender.A2.File=${catalina.home}/logs/log4j.appender.A2.Append=falselog4j.appender.A2.DatePattern='-'yyyy-MM-dd'.log'log4j.appender.A2.layout=org.apache.log4j.PatternLayoutlog4j.appender.A2.layout.ConversionPattern=%d %p [%c] - %m%n

三、整合Spring+Mybatis

把Spring和Mybatis的jar包都引入之后就可以整合这两个框架了

先看下项目的相关配置文件

其中gererator.properties和generatorConfig.xml是用来根据数据库自动生成mapper接口,实体,以及映射文件的

mybatis-config是mybatis的一些映射的相关配置,比如mapper,cache等

spring-mybatis是自动扫描,自动装配mapper以及datasource,sqlSessionFactory等配置

这些会在接下来详细说明

1.JDBC配置文件

jdbc.initialSize=5jdbc.maxActive=20jdbc.maxIdle=5jdbc.defaultAutoCommit=truejdbc.removeAbandoned=true  jdbc.removeAbandonedTimeout=30 jdbc.logAbandoned=truejdbc.testWhileIdle=truejdbc.validationQuery=select 1 from dualjdbc.timeBetweenEvictionRunsMillis=30000jdbc.numTestsPerEvictionRun=10jdbc.driverClassName=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://localhost:3306/testjdbc.username=rootjdbc.password=root

2.创建spring-mybatis.xml

创建spring-mybatis.xml来配置mybatis的一些信息,主要是数据源、事务、自动扫描、自动注入等功能

3.创建数据库表

CREATE TABLE `user` (    `id` int(11) NOT NULL AUTO_INCREMENT,    `user_name` varchar(40) NOT NULL,    `password` varchar(255) NOT NULL,    PRIMARY KEY (`id`)  ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;  insert  into `user`(`id`,`user_name`,`password`) values (1,'赵宏轩','123456');

4.创建User的Mapping映射文件,User实体和Mapper接口

1.在pom.xml中添加mybatis-generator-maven-plugin插件

HelloSSM
org.mybatis.generator
mybatis-generator-maven-plugin
1.3.2
true
true
```####2.在maven项目下的src/main/resources 目录下建立名为 generatorConfig.xml的配置文件以及和generator有关的属性文件,作为mybatis-generator-maven-plugin 插件的执行目标![目录结构](http://i13.tietuku.com/274205a36b4c55d5.png) generatorConfig.xml ```xml

还有与之相关联的generator.properties文件

jdbc.driverLocation=D:\\idea\\maven\\mysql\\mysql-connector-java\\5.1.29\\mysql-connector-java-5.1.29.jarjdbc.driverClassName=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://localhost:3306/testjdbc.username=rootjdbc.password=root

3.在Intellij IDEA添加一个“Run运行”选项,使用maven运行mybatis-generator-maven-plugin插件

1).点击Run,选择Edit Configurations

2).点击左上角的 
+ ,选择 
maven 
3).输入name,选择Working directory,Command line 填上 
mybatis-generator:generate -e 

4.点击运行查看结果

运行插件控制台如果打印build Success 就说明成功了

会在指定目录产生三个文件,分别是 
实体 , 
Mapper接口 , 
Mapping配置文件 

5.创建mybatis-config.xml配置文件

其中最后的mapper有四种配置方式,但是,在我的电脑上只有使用url的方式才行,不知道是怎么回事,待查询。

6.建立Service接口和实现类

IUserService.java代码如下

package com.zeusjava.kernel.service;import com.zeusjava.kernel.entity.User;/** * Created by LittleXuan on 2015/10/17. */public interfaceIUserService{    publicUsergetUserById(intuserId);}

UserServiceImpl.java的代码如下

package com.zeusjava.kernel.service.impl;import com.zeusjava.kernel.dao.UserMapper;import com.zeusjava.kernel.entity.User;import com.zeusjava.kernel.service.IUserService;import org.springframework.stereotype.Repository;import org.springframework.stereotype.Service;import javax.annotation.Resource;/** * Created by LittleXuan on 2015/10/17. */@Service("userService")public class IUserServiceImpl implements IUserService {	@Resource	private UserMapper userMapper;	@Override	public User getUserById(int userId) {		return this.userMapper.selectByPrimaryKey(userId);	}}

7.建立测试类

import com.zeusjava.kernel.entity.User;import com.zeusjava.kernel.service.IUserService;import org.junit.Test;import org.junit.runner.RunWith;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.test.context.ContextConfiguration;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import javax.annotation.Resource;/** * Created by LittleXuan on 2015/10/17. */@RunWith(SpringJUnit4ClassRunner.class)	 //表示继承了SpringJUnit4ClassRunner类@ContextConfiguration(locations = {
"classpath:conf/spring/beans-mybatis.xml"})public classSSMTest{ private static Logger logger = LoggerFactory.getLogger(SSMTest.class); @Resource private IUserService userService = null; @Test public void test1() { User user = userService.getUserById(1); logger.info("姓名:"+user.getUserName()); }}

运行单元测试,结果如下,说明spring和mybatis的整合已经完成。

四、和SpringMVC整合

和Spring MVC的整合就简单的多了,只需要添加一个Spring MVC配置文件,和配置一下Web.xml就行了,我在前面的博客写过一篇文章,请戳 

1.配置Spring MVC 配置文件zeusjava-servlet.xml

在配置文件里主要配置 自动扫描控制器 , 视图解析器 , 注解

2.配置web.xml

在web.xml里配置Spring MVC的DispatcherServlet和mybatis的配置文件

HelloSSM
contextConfigLocation
classpath:spring-mybatis.xml
encodingFilter
org.springframework.web.filter.CharacterEncodingFilter
true
encoding
UTF-8
encodingFilter
/*
org.springframework.web.context.ContextLoaderListener
org.springframework.web.util.IntrospectorCleanupListener
SpringMVC
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:spring-mvc.xml
1
true
SpringMVC
/
/index.jsp

3.在WEB_INF/jsp建立一个简单的测试页面user.jsp

<%@ page language="java" pageEncoding="UTF-8"%>

用户ID为${user.id}的用户详情

ID:${user.id}姓名:${user.userName}

4.建立User控制器

通过url传入一个id,解析这个id然后查询数据库,得到User对象放入jsp页面显示。

package com.zeusjava.web.controller;/** * Created by LittleXuan on 2015/10/18. */import javax.annotation.Resource;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpSession;import com.zeusjava.kernel.entity.User;import com.zeusjava.kernel.service.IUserService;import org.apache.commons.lang.StringUtils;import org.springframework.stereotype.Controller;import org.springframework.ui.Model;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;@Controller@RequestMapping("/user")public classUserController{	@Resource	private IUserService userService;	@RequestMapping(value="/userInfo/{id}",method=RequestMethod.GET)	public String toIndex(HttpServletRequest request, Model model,@PathVariable("id") String id) {		if(StringUtils.isEmpty(id)){			throw new IllegalArgumentException("id不能为空");		}		int userId = Integer.parseInt(id);		User user = this.userService.getUserById(userId);		model.addAttribute("user", user);		return "user";	}}

5.添加tomcat服务器并部署war包

1. File-Project Structure 点击 Artifacts 一栏

点击 + ,选择 Web-Application-Exploded 然后选择from maven选中本项目

Web Application Exploded是没有压缩的war包,相当于文件夹

Web Application Achieved是雅俗后的war包

2.intellij会自动帮我们生成一个war包

3.点击 Run-Run Configurations

点击 + 选择 tomcat server->local 

4.点击 Configure

5.点击 Deployment选项卡 ,点击 + 号,选择一个artifact,就是第二部的war包

6.OK启动服务器

在任务栏输入 http://localhost:8081/HelloSSM/user/userInfo/1 ,回车,结果如下:

一个简单的SSM项目环境就搭建好了。

五、和ehcache的整合

Ehcache是Hibernate的默认的cache,但是mybatis中需要自己集成,在Mybatis中使用会大大增加性能,下面开始整合mybatis和Ehcache

1.使用首先要把需要的jar包依赖加入pom中

org.mybatis
mybatis-ehcache
1.0.0
org.ehcache
ehcache
3.0.0.m3

2.在Resource中添加一个ehcache.xml的配置文件

说明:

name:Cache的唯一标识  maxElementsInMemory:内存中最大缓存对象数  maxElementsOnDisk:磁盘中最大缓存对象数,若是0表示无穷大  eternal:Element是否永久有效,一但设置了,timeout将不起作用  overflowToDisk:配置此属性,当内存中Element数量达到maxElementsInMemory时,Ehcache将会Element写到磁盘中  timeToIdleSeconds:设置Element在失效前的允许闲置时间。仅当element不是永久有效时使用,可选属性,默认值是0,也就是可闲置时间无穷大  timeToLiveSeconds:设置Element在失效前允许存活时间。最大时间介于创建时间和失效时间之间。仅当element不是永久有效时使用,默认是0.,也就是element存活时间无穷大   diskPersistent:是否缓存虚拟机重启期数据  diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认是120秒  diskSpoolBufferSizeMB:这个参数设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区  memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。默认策略是LRU(最近最少使用)。你可以设置为FIFO(先进先出)或是LFU(较少使用)

3.在spring-mybatis.xml中加入chache配置

4.在mapper.xml中配置cache

type是使用的cache类型, LoggingEhcache 会记录下日志,如果不需要日志的话可以使用 EhcacheCache 

这样配置之后,所以的操作都会执行缓存,如果有的操作不需要的话,可以在sql配置里将useCache设置为 false

@Select({	"select",	"id, user_name, password",	"from user",	"where id = #{id,jdbcType=INTEGER}"    })    @Options(useCache = false,timeout = 10000,flushCache = false)    @ResultMap("BaseResultMap")    User selectByPrimaryKey(Integer id);

5.测试性能

测试代码

@Test	publicvoidtest1(){		long beginTime=System.nanoTime();		User user = userService.getUserById(1);		long endTime=System.nanoTime();		System.out.println("查询时间 :" + (endTime-beginTime)+"ns");		logger.info("姓名:"+user.getUserName());	}

第一次把useCache设置为 false

第二次把useCache设置为 true 

两次执行的时间差了大约 0.4 秒

整个项目已经放到github上了,有需要的可以前往  查看, 不懂的地方欢迎探讨...

  • 大小: 55.6 KB
  • 大小: 41 KB

转载地址:http://rqlii.baihongyu.com/

你可能感兴趣的文章
STM32CubeMX 真的不要太好用
查看>>
不要买铝合金机架的无人机,不耐摔,易变形弯曲。
查看>>
ACfly也是基于FreeRTOS的
查看>>
realsense-ros里里程计相关代码
查看>>
似乎写个ROS功能包并不难,你会订阅话题发布话题,加点逻辑处理,就可以写一些基础的ROS功能包了。
查看>>
我觉得在室内弄无人机开发装个防撞机架还是很有必要的,TBUS就做得很好。
查看>>
serial也是见到很多次了,似乎它就是一种串行通信协议
查看>>
TBUS的一些信息
查看>>
专业和业余的区别就在于你在基础在基本功打磨练习花的时间
查看>>
通过mavlink实现自主航线的过程笔记
查看>>
这些网站有一些嵌入式面试题合集
查看>>
我觉得刷题是有必要的,不然小心实际被问的时候懵逼,我觉得你需要刷个50份面试题。跟考研数学疯狂刷卷子一样!
查看>>
Git操作清单
查看>>
Flutter Boost的router管理
查看>>
基于云信的react-native聊天系统
查看>>
网易云音乐移动客户端Vue.js
查看>>
ES7 await/async
查看>>
ES7的Async/Await
查看>>
每个人都能做的网易云音乐[vue全家桶]
查看>>
Vue2.0全家桶仿腾讯课堂(移动端)
查看>>