-
mybatis plus自动生成业务代码(controller,service,entity,mapper)
2020-05-08 15:00:49<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> <...--注意3.3.0不支持正则匹配,比如我想生成数据库中以...<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> <version>3.3.0</version> <!--注意3.3.0不支持正则匹配,比如我想生成数据库中以t_yckj_开头的表对应的代码 如下写在3.3.0下无效,只能一个表一个表的去跑代码 --> // StrategyConfig strategy = new StrategyConfig(); // strategy.setInclude("t_yckj_\\w*") </dependency> <!-- velocity 模板引擎, Mybatis Plus 代码生成器需要,还有其他的模板引擎,具体参照官网,注意网络 环境,如果maven下载jar包失败,会导致自动生成代码时报错,报ClassNotFound --> <dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity-engine-core</artifactId> <version>2.0</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <!--<version>5.1.47</version>--> <version>8.0.18</version> </dependency> <!--<dependency>--> <!--<groupId>com.baomidou</groupId>--> <!--<artifactId>mybatis-plus-boot-starter</artifactId>--> <!--<version>3.0.5</version>--> <!--</dependency>--> // 如果mybatis-plus-boot-starter是3.0.5这个版本,引入这一个依赖会自动添加mybatis-plus-generator依赖,如果是 // 其他的版本比如3.3.0这个版本就不会自动添加mybatis-plus-generator这个依赖,需要手动添加,否则会找不到AutoGenerator // 这个类
自动生成代码类
public class TestGenerator { public static void main(String[] args) { // 模块名 product String moduleName = "product"; // 1.创建代码生成器 AutoGenerator mpg = new AutoGenerator(); // 2. 全局配置 GlobalConfig gc = new GlobalConfig(); //获取项目目录 String projectPath = System.getProperty("user.dir"); gc.setOutputDir(projectPath + "/src/main/java"); // 文档注释 作者名 gc.setAuthor("Mr.ZhangSan"); // 是否打开资源管理器 gc.setOpen(false); // 重新生成文件的时候是否覆盖 gc.setFileOverride(true); // 去掉接口的首字母I gc.setServiceImplName("%sService"); // 主键策略 gc.setIdType(IdType.AUTO); // 定义生成的实体类中的日期类型 gc.setDateType(DateType.ONLY_DATE); // 实体属性 Swagger2 注解 gc.setSwagger2(true); mpg.setGlobalConfig(gc); // 3、 数据源配置 DataSourceConfig dsc = new DataSourceConfig(); dsc.setUrl("jdbc:mysql://localhost:3366/yckj_db?autoReconnect=true&useSSL=false&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&allowMultiQueries=true"); // mysql 驱动为5.x时的driverName // dsc.setDriverName("com.mysql.jdbc.Driver"); // mysql 驱动为8.x时的driverName dsc.setDriverName("com.mysql.cj.jdbc.Driver"); dsc.setUsername("root"); dsc.setPassword("123456"); // 设置数据库类型(可选) 可以根据驱动自动推断 dsc.setDbType(DbType.MYSQL); mpg.setDataSource(dsc); // 4、包配置 PackageConfig pc = new PackageConfig(); //模块名 :com.test.product pc.setModuleName(moduleName); pc.setParent("com.test"); // 最终的包名称 com.test.product.controller,其他类似 pc.setController("controller"); pc.setMapper("mapper"); pc.setService("service"); pc.setEntity("entity"); mpg.setPackageInfo(pc); //5、 策略配置 StrategyConfig strategy = new StrategyConfig(); //设置要映射的表名 strategy.setInclude("t_yckj_\\w*"); // 数据库表映射到实体类的命名策略 strategy.setNaming(NamingStrategy.underline_to_camel); //代表前缀不生成 strategy.setTablePrefix("t_yckj_"); //链式编程 strategy.setEntityLombokModel(true); // 数据库列映射到实体类的命名策略 strategy.setColumnNaming(NamingStrategy.underline_to_camel); //逻辑删除字段 strategy.setLogicDeleteFieldName("deleted"); //去掉布尔值的 is_ 前缀 strategy.setEntityBooleanColumnRemoveIsPrefix(true); // 自动填充,策略 TableFill gmtCreate = new TableFill("create_time", FieldFill.INSERT); TableFill gmtModified = new TableFill("update_time", FieldFill.INSERT_UPDATE); ArrayList<TableFill> tableFills = new ArrayList<>(); tableFills.add(gmtCreate); tableFills.add(gmtModified); strategy.setTableFillList(tableFills); // 乐观锁 strategy.setVersionFieldName("version"); // restful api风格 strategy.setRestControllerStyle(true); // URL中驼峰转连字符 addProduct add-product strategy.setControllerMappingHyphenStyle(true); mpg.setStrategy(strategy); // 执行代码生成器 mpg.execute(); } }
-
mybatis-generator自动生成代码后,业务代码中如何调用mapper的api
2020-02-22 16:57:06如何使用mybatis-generator...本篇主要讲生成自动代码后,如何在业务代码中调用相应的api 使用mybatis-generator自动生成的代码目录中,各文件作用如下: UserMapper.xml:表字段映射配置,包括CRUD的相应sql语句 ...如何使用mybatis-generator自动生成代码,见上文,https://blog.csdn.net/qq_39946015/article/details/104441880
本篇主要讲生成自动代码后,如何在业务代码中调用相应的api
使用mybatis-generator自动生成的代码目录中,各文件作用如下:
UserMapper.xml:表字段映射配置,包括CRUD的相应sql语句
UserExample.java:封装了Criteria抽象类,通过调用相应的api设置相应的查询条件
User.java:POJO对象(普通的java对象)
UserMapper.java:dao层,对接业务代码中调用相关api在业务代码中调用Mapper的api步骤如下:
1、搭建mybatis环境
- mybatis.xml,配置数据源环境,将所有mapper整合
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <!--加载数据库属性文件--> <properties resource="db.properties"></properties> <environments default="development"> <environment id="development"> <!--事务配置,JDBC要手动提交事务,MANAGED由容器管理,不需要手动提交--> <transactionManager type="JDBC" /> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </dataSource> </environment> </environments> <!--这是告诉Mybatis区哪找持久化类的映射文件,对于在src下的文件直接写文件名, 如果在某包下,则要写明路径--> <mappers> <mapper resource="com/test/mapper/UserMapper.xml"></mapper> </mappers> </configuration>
- db.properties,数据库配置
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://127.0.0.1:3306/test jdbc.username=root jdbc.password=root
2、测试
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://127.0.0.1:3306/test jdbc.username=root jdbc.password=root
注意:对数据库的保存,删除,更新操作,若采用JDBC事务管理,需要进行事务提交。
拓展:transactionManager(事务管理器)
mybatis.xml中,事务管理器配置成为以下两种方式:
<transactionManager type="JDBC"/> <transactionManager type="MANAGED"/>
JDBC 使用 JdbcTransactionFactory 生成的 JdbcTransaction 对象实现。它是以 JDBC 的方式对数据库的提交和回滚进行操作。
MANAGED 使用 ManagedTransactionFactory 生成的 ManagedTransaction 对象实现。它的提交和回滚方法不用任何操作,而是把事务交给容器处理。在默认情况下,它会关闭连接,然而一些容器并不希望这样,因此需要将 closeConnection 属性设置为 false 来阻止它默认的关闭行为。
不想采用 MyBatis 的规则时,我们可以这样配置:
<transactionManager type="com.mybatis.transaction.MyTransactionFactory"/>
实现一个自定义事务工厂,代码如下所示:
public class MyTransactionFactory implements TransactionFactory { @Override public void setProperties(Properties props) { } @Override public Transaction newTransaction(Connection conn) { return new MyTransaction(conn); } @Override public Transaction newTransaction(DataSource dataSource, TransactionlsolationLevel level, boolean autoCommit) { return new MyTransaction(dataSource, level, autoCommit); } }
这里就实现了 TransactionFactory 所定义的工厂方法,这个时候还需要事务实现类 MyTransaction,它用于实现 Transaction 接口,代码如下所示:
public class MyTransaction extends JdbcTransaction implements Transaction { public MyTransaction(DataSource ds, TransactionIsolationLevel desiredLevel, boolean desiredAutoCommit) { super(ds, desiredLevel, desiredAutoCommit); } public MyTransaction(Connection connection) { super(connection); } public Connection getConnection() throws SQLException { return super.getConnection(); } public void commit() throws SQLException { super.commit(); } public void rollback() throws SQLException { super.rollback(); } public void close() throws SQLException { super.close(); } public Integer getTimeout() throws SQLException { return super.getTimeout(); } }
这样就能够通过自定义事务规则,满足特殊的需要了。
-
mysql自动生成代码环境配置文件_基于springboot和mybatis插件自动生成CURD代码
2021-02-08 17:31:28而这个案例我将会用一个http接口服务的项目,带领初学者如何使用mybatis自动生成的CURD代码,快速开发业务逻辑。二、项目结构三、重点代码说明1、插件的使用首先是单元测试test目录下的,Mybatis插件生成的启动代码...一、项目功能概述
很多同学知道mybatis插件可以生成CURD代码,但是对于生成的代码不会使用。而这个案例我将会用一个http接口服务的项目,带领初学者如何使用mybatis自动生成的CURD代码,快速开发业务逻辑。
二、项目结构
三、重点代码说明
1、插件的使用
首先是单元测试test目录下的,Mybatis插件生成的启动代码,/**
* @author XL
* @title: GgeneratorConfigurationTest
* @projectName jalja-dubbo
* @date 2020/6/6 15:21
* @description: mybatis 插件启动类
*/
public class GgeneratorConfigurationTest {
public static void main(String[] args) throws Exception {
try {
List warnings = new ArrayList();
boolean overwrite = true;
//获取resources 下的插件配置文件流
InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("SQL.xml");
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = cp.parseConfiguration(is);
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
myBatisGenerator.generate(null);
System.out.println(warnings);
}catch (Exception r){
r.printStackTrace();
System.out.println(r.getMessage());
}
}
}
2、插件配置文件的详细内容<?xml version="1.0" encoding="UTF-8"?>
generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
connectionURL="jdbc:mysql://10.104.121.248:3306/shop?characterEncoding=utf8&useSSL=false"
userId="mysql"
password="mysql">
3、执行GgeneratorConfigurationTest 类的结果
TOrderMapper:就是mybatis插件根据表名自动生成的curd接口
TOrder:就是mybatis插件根据表名自动生成的JAVA实体
TOrderExample:就是mybatis插件根据表名自动生成的JAVA实体样例,中间包含了对sql操作条件的封装
TOrderMapper.xml:就是mybatis插件根据表名自动生成的SQL.xml文件
三、CURD代码的使用
1、添加订单/**
* 插入数据
* @param order
* @return
*/
public Boolean createOrder(TOrder order){
order.setCreateTime(new Date());
return orderMapper.insert(order)>0;
}
执行结果
2、删除订单/**
* 删除根据主键订单
* @return
*/
public void deleteOrder(Long id){
//根据主键删除订单
orderMapper.deleteByPrimaryKey(id);
/*
根据条件(id和 name)删除
TOrderExample example=new TOrderExample();
example.createCriteria().andIdEqualTo(id).andNameEqualTo("订单名字删除");
orderMapper.selectByExample(example);
*/
}
3、根据主键ID查询/**
* 根据主键查询
* @param id
* @return
*/
public TOrder getOrderById(Long id){
return orderMapper.selectByPrimaryKey(id);
}
4、模糊和分页查询/**
*分页查询
* @param name
* @param pageIndex 当前页
* @param pageSize 每页几条
* @return
*/
public PageInfo getOrderPageByName(String name,int pageIndex,int pageSize){
//设置分页信息,分别是当前页数和每页显示的页数,必须在mapper接口中的方法执行之前设置该分页信息
PageHelper.startPage(pageIndex, pageSize);
//构造查询条件
TOrderExample example=new TOrderExample();
example.createCriteria().andNameLike("%"+name+"%");
Listorders=orderMapper.selectByExample(example);
//pagehelper中内值的分页的信息类
PageInfo info=new PageInfo(orders);
return info;
}
5、根据订单ID修改订单/**
* 修改数据
* @param id
* @param name
*/
public void updateOrder(Long id,String name){
TOrder order=new TOrder();
order.setId(id);
order.setName(name);
//根据主键修改
int num=orderMapper.updateByPrimaryKey(order);
if(num<=0){
throw new RuntimeException("订单修改失败");
}
}
四、TOrderExample类介绍
每个数据库表Mybatis都会对应生成一个这样的类,该类设置了大量常用的查询条件,基本可以满足我们的单表查询的所有要求public Criteria andIdIsNull() {
addCriterion("id is null");
return (Criteria) this;
}
public Criteria andIdIsNotNull() {
addCriterion("id is not null");
return (Criteria) this;
}
public Criteria andIdEqualTo(Long value) {
addCriterion("id =", value, "id");
return (Criteria) this;
}
public Criteria andIdNotEqualTo(Long value) {
addCriterion("id <>", value, "id");
return (Criteria) this;
}
public Criteria andIdGreaterThan(Long value) {
addCriterion("id >", value, "id");
return (Criteria) this;
}
public Criteria andIdGreaterThanOrEqualTo(Long value) {
addCriterion("id >=", value, "id");
return (Criteria) this;
}
public Criteria andIdLessThan(Long value) {
addCriterion("id
return (Criteria) this;
}
public Criteria andIdLessThanOrEqualTo(Long value) {
addCriterion("id <=", value, "id");
return (Criteria) this;
}
public Criteria andIdIn(List values) {
addCriterion("id in", values, "id");
return (Criteria) this;
}
public Criteria andIdNotIn(List values) {
addCriterion("id not in", values, "id");
return (Criteria) this;
}
public Criteria andIdBetween(Long value1, Long value2) {
addCriterion("id between", value1, value2, "id");
return (Criteria) this;
}
public Criteria andIdNotBetween(Long value1, Long value2) {
addCriterion("id not between", value1, value2, "id");
return (Criteria) this;
}
这是其中的一段代码,相信大家都可以看得懂,你们涵盖了我们常用的所有条件 大于、小于、等于、不等于、in、not in 、between and 等等,希望大家在使用的过程中多多查看代码
五、结束语
希望这个demo可以帮到你,当然也可以作为快速开启新项目的基本模板。如果使用中有问题也欢迎大家随时联系,我们共学习。
QQ:365753392
您的支持是我限创造的无动力。
-
idea自动生成mysql代码_idea自动生成代码神器EasyCode,让你如虎添翼
2021-01-20 03:54:56在基于Mybatis的项目中,我们可以通过Mybatis的插件从数据库表结构进行业务代码的生成。今天给大家介绍一款Idea的插件,不仅可以达到Mybatis反向生成的效果,而且还可以更加灵活的使用。插件安装通常Idea插件的安装...在基于Mybatis的项目中,我们可以通过Mybatis的插件从数据库表结构进行业务代码的生成。今天给大家介绍一款Idea的插件,不仅可以达到Mybatis反向生成的效果,而且还可以更加灵活的使用。
插件安装
通常Idea插件的安装有两种形式。
方式一:直接在Idea中找到Plugins配置,然后搜索“Easy Code”,点击“install”进行安装,重启Idea便完成安装。如下图:
方式二:访问Idea插件的官网:https://plugins.jetbrains.com/,然后搜索“EasyCode”,会展示如下结果:
点击“Install to Idea”进行下载安装。此时会检查本机的Idea,并进行插件安装,如果已经安装会显示如下内容:
这种方式适合在Plugins中没有搜到Easy Code的场景。
数据库配置
在数据库中创建一张表,这里以tb_order为例:
CREATE TABLE `tb_order` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`amount` int(11) NOT NULL DEFAULT '1',
`order_no` varchar(64) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
然后在Idea中添加配置数据源:
这里选择使用Mysql数据库并进行配置。
如果之前未配置过相应的数据库,还需要下载一下对应的驱动程序。
连接成功,效果如下:
反向生成代码
右击要生成代码的表,选择easycode,Generate Code。
在弹出页面选择包路径以及要生成类:
我这里已经实现创建好了一个Spring Boot的项目。一路点击“yes”之后,生成了以下包及类:
当然,还有resources目录下的mybatis的xml文件。在这些生成的类中提供了一些默认的增删改查的方法。
为了程序不报错,还需要添加mybatis的依赖,以下为整个项目的整体依赖内容:
org.springframework.bootspring-boot-starter-weborg.mybatis.spring.bootmybatis-spring-boot-starter1.3.2org.projectlomboklomboktrueorg.springframework.bootspring-boot-starter-testtestorg.junit.vintagejunit-vintage-engine
通过上述一些列的操作,我们便可以轻松通过插件生成代码,再也不用每次都一层层的手动创建各层的类了。
截止现在,上面的项目并不能正常运行,因为并没有配置扫描Mapper接口的地方。此时可在TbOrderDao类上添加@Mapper注解,也可以在启动类里面加上@MapperScan("com.secbro2.easycode.biz.dao")注解进行扫描。
最后,在application.properties或application.yml中配置对应的数据库连接即可。
插件扩展
如果嫌弃手写麻烦,或者想生成其他的类型的类或文件,则可以在配置中对其扩展或修改。比如将自动生成的dao.java模板类上自动添加上@Mapper,或将entity.java改用Lombok的形式进行生成都是可以进行修改的。
通过该插件的一系列操作,写代码是不是变成一件非常容易的事了?最起码能在基础的类生成等工作上节省90%的工作量。赶紧用起来吧。
-
SpringBoot 使用OpenApi-generator插件,自动生成代码,简便开发,专注业务代码
2020-11-11 14:40:32SpringBoot 使用OpenApi-generator插件,自动生成代码,简便开发,专注业务代码 在目前的项目一种使用到了 openapi-generator-maven-plugin 这个插件,于是就将这块剥离出来,尝试整合,挺成功的。接下来进入正文 ... -
Java自动生成增删查改的业务代码
2018-06-14 18:25:26前言: 新业务的开发总是少不了相应的增删查改,而这些功能与其他业务的增删查改又是大径相同,所以为了解决这种纯粹的体力劳动,提高开发效率,开发一个增删查改的代码自动生成是非常有必要的。技术:freemarker... -
java中SpringBoot项目使用mybatis-plus逆向自动生成全套代码,解放双手,专注于业务!
2021-01-08 20:04:35java程序小白也能学会的mybatis-plus逆向自动生成全套代码 1.在你的SpringBoot项目下新建子模块项目 ps:名称随意,最好带上generator 来辨别这是代码自动生成模块 2.在此模块下新建一个包与一个java类 类名: Code... -
idea自动生成mysql代码_自研了一款idea快速生成代码插件
2021-02-06 20:33:17快速生成controller,service,serviceimpl 代码为什么要开发这款插件市面上有很多基于数据库生成代码的工具,但是我自己的工作流,是只用数据库生成代码工具生成pojo,mapper,mapper.xml,至于控制层,业务层的代码,... -
BLL-自动生成业务逻辑层代码
2010-04-09 21:49:00Name:Author: Description: --%>using System;using System.Data.Common;using System.Collections.Generic;using System.Text;using Model;using DAL;namespace BLL{ public class BLL { private DAL DAL = new -
CodeSmith自动生成业务实体类的模板代码
2008-04-08 19:57:00大家都知道用三层架构做网站优点很多,但是要写很多实体业务代码。于是也就产生了帮助我们写这些代码的工具,CodeSmith便是其中优秀的一员。又因为CodeSmith具有模板定制的功能,使用灵活度高深受大家喜爱。下面是我... -
一个不需要写代码,自动生成测试代码的UI自动化测试工具
2019-08-15 14:09:39该工具不要写代码,通过画业务流程图代替代码,然后元素自动定位,一键自动生成测试代码和测试报告,适合测APP/WEB,适用于WINDOWS,安卓,IOS,微信小程序,H5,支持JAVA、Python语言,欢迎大家免费注册使用,... -
自动产生fsm代码的工具_代码自动生成工具
2021-01-17 14:57:52构建支持多种数据库类型的代码自动生成工具背景:一般的业务代码中写来写去,无外乎是先建好model,然后针对这个model做些CRUD的操作。(主要针对单表的业务操作)针对于数据库dao、mapper等的代码自动生成已经有了... -
云共享自动生成源代码工具-MoliCode介绍
2019-08-04 12:29:42MoliCode是一个基于云共享代码模板,可定制化生成各种业务代码的代码工具。并且是开源,可定制开发的基于Java的自动代码工具。 作为一个Java开发人员,或者前端开发人员,我们常常需要生成重复的代码。如最常见的... -
eladmin代码自动生成_idea自动生成代码神器EasyCode,让你如虎添翼
2020-11-29 13:33:15在基于Mybatis的项目中,我们可以通过Mybatis的插件从数据库表结构进行业务代码的生成。今天给大家介绍一款Idea的插件,不仅可以达到Mybatis反向生成的效果,而且还可以更加灵活的使用。插件安装通常Idea插件的安装... -
Powerdesigner 导出excel, 并且自动生成对应的简单的业务代码
2018-12-18 17:12:05近期在使用这个工具做设计, 表比较多, 需要常见各种的vo , service, dao , 许多许多, 想怎么可以加快开发的进度, 就想到使用excel导出, 读取excel表格的信息来自动生成代码, 这样就好了。 在网上找到的... -
自动生成代码freemarker实现,教你java手写自动代码生成器,自动生成controller,service,mapper,等相关...
2020-07-08 17:52:16自己闲着没事就是这些了些自动代码生成器,根据实体类,利用反射自动生成controller,service,mapper,等相关文件。下面是具体代码 如何使用可以参照我github上的项目 https://github.com/kongGe55/mapper_test 这... -
代码自动生成工具
2019-06-20 17:46:00一般的业务代码中写来写去,无外乎是先建好model,然后针对这个model做些CRUD的操作。(主要针对单表的业务操作)针对于数据库dao、mapper等的代码自动生成已经有了mybatisGenerator这种工具,但是针对于controller... -
使用Freemarker模板自动生成代码
2020-12-30 14:52:52业务代码存在大量的增删改查功能,只是针对不同的表数据而已。这时候就如果能生成固定的模板代码,那么将大大的解放生产力。本文我们将使用Freemarker模板来生成业务模板代码。 FreeMarker FreeMarker是一款模板引擎... -
SSM代码自动生成
2018-08-14 17:45:21支持 MySql,SqlServer,DB2 数据库...mybatis.xml,spring-mvc.xml,db.properties与日志文件,另外web.xml也自动配置好,并生成实体相应的Controller控制器,包括基本的接口与业务实现,测试完成后即可在tomcat中运行
-
Linux基础入门系列课程
-
机器视觉光源种类(环形光,条光,背光源,同轴光,线光,点光,穹顶光,开孔面光源等)
-
MySQL 性能优化(思路拓展及实操)
-
靶形与离子发射
-
光电反馈主动锁模
-
Windows系统管理
-
持续集成与单元测试xmzy.pdf
-
iptables 企业级防火墙配置(四表五链)
-
2月第3周小红书视频、图文、直播排行榜
-
vue的Promise.all用法
-
物联网基础篇:快速玩转MQTT
-
程控直流电源的效率如何才能提高?
-
【owt-server】梳理安装脚本及过程 3 webrtcM79
-
第一型错误与第二型错误( I 型错误 II 型错误)
-
C++代码规范和Doxygen根据注释自动生成手册
-
项目管理工具与方法
-
Unity Gif Play Plugin.unitypackage
-
html2canvas 与 jspdf 相结合生成 pdf 内容被截断问题.txt
-
Jsplumb从入门到实战
-
自定义MyNotNull注解