`

ibatis源码学习1_整体设计和核心流程

 
阅读更多

转自http://www.iteye.com/topic/1121467

 

本文主要从ibatis框架的基本代码骨架进行切入,理解ibatis框架的整体设计思路,各组件的实现细节将在后文进行分析。

背景
介绍ibatis实现之前,先来看一段jdbc代码:

Java代码  收藏代码
  1. Class.forName( "com.mysql.jdbc.Driver" );  
  2. String url = "jdbc:mysql://localhost:3306/learnworld" ;  
  3. Connection con = DriverManager.getConnection(url, "root" , "learnworld" );           
  4. String sql = "select * from test" ;  
  5. PreparedStatement ps = con.prepareStatement(sql);             
  6. ResultSet rs = ps.executeQuery();  
  7. while (rs.next()){  
  8.     System.out.println("id="  + rs.getInt( 1 )+ ". score="  + rs.getInt( 2 ));  
  9. }  


上面这段代码大家比较熟悉,这是一个典型的jdbc方式处理流程: 建立连接->传递参数->sql执行->处理结果->关闭连接。

问题
上面的代码中包含了很多不稳定的因素,可能会经常发生修改:
1. 数据源和事务管理等
2. sql语句
3. 入参和结果处理
如果这些发生变化,我们需要直接修改代码,重新编译、打包、发布等。

DIY
下面从我们自己DIY的视角来考虑如何设计框架,应对这些问题。框架的核心思想是抽取共性,封装可能出现的变化。
如何处理数据源变化?
将数据源连接等过程固定,将数据源中易变的信息封装在一起(如driverClassName, url等),放在配置文件中。

如何处理sql语句的变化?
将sql语句统一放在配置文件中,为每条sql语句设置标识,在代码中使用标识进行调用。

如何应对入参和结果处理的变化?
将参数传递,结果映射到java bean等统一封装在配置文件中。

结论: 将不变的流程固化到代码中,将变化的信息封装在配置文件中。


核心接口
ibatis抽取了以下几个重要接口:

1. SqlMapExecutor
该接口是对SQL操作行为的抽象,提供了SQL单条执行和批处理涉及的所有操作方法。



2. SqlMapTransactionManager
该接口是对事务行为的抽象,提供了事务执行过程中的涉及的所有方法。


3. SqlMapClient
该接口定位是SQL执行客户端,是线程安全的,用于处理多个线程的sql执行。它继承了上面两个接口,这意味着该接口具有SQL执行、批处理和事 务处理的能力,如果你拥有该接口的实现类,意味着执行任何SQL语句对你来说是小菜一碟。该接口的核心实现类是SqlMapClientImpl。

4. SqlMapSession
该接口在继承关系上和SqlMapClient一致,但它的定位是保存单线程sql执行过程的session信息。该接口的核心实现类是SqlMapSessionImpl。

5. MappedStatement
该接口定位是单条SQL执行时的上下文环境信息,如SQL标识、SQL、参数信息、返回结果、操作行为等。

6. ParameterMap/ResultMap
该接口用于在SQL执行的前后提供参数准备和执行结果集的处理。

以上接口的类图关系如下(部分):


这里必须要强调SqlMapExecutorDelegate这个类,他是一个执行代理类,在ibatis框架中地位非常重要,因为他耦合了用户端的操作行为和执行环境,他持有执行操作的所需要的所有数据,同时管理着执行操作依赖的环境。

初始化过程
1. 读取和解析sqlmap配置文件。
2. 注册Statement对象。
3. 创建SqlMapClientImpl对象。

下面是一个Spring中sqlMapClient的bean配置:

Java代码  收藏代码
  1. <bean id= "sqlMapClient"   class = "org.springframework.orm.ibatis.SqlMapClientFactoryBean" >  
  2.     <property name="dataSource"  ref= "dataSource"  />  
  3.     <property name="configLocation"  value= "classpath/sqlmap/sqlmap-ibatis.xml"  />  
  4. </bean>  


下面看一下SqlMapClientFactoryBean的初始化方法afterPropertiesSet(),用于构建sqlMapClient对象:

Java代码  收藏代码
  1. public   void  afterPropertiesSet()  throws  Exception {  
  2.     ...  
  3.   
  4.     this .sqlMapClient = buildSqlMapClient( this .configLocations,  this .mappingLocations,  this .sqlMapClientProperties);    //初始化核心方法,构建sqlMapClient对象   
  5.   
  6.     ...  
  7. }  


看一下buildSqlMapClient()的实现:

Java代码  收藏代码
  1. protected  SqlMapClient buildSqlMapClient(  
  2.         Resource[] configLocations, Resource[] mappingLocations, Properties properties)  
  3.         throws  IOException {  
  4.                ...  
  5.     SqlMapClient client = null ;  
  6.     SqlMapConfigParser configParser = new  SqlMapConfigParser();  
  7.     for  ( int  i =  0 ; i < configLocations.length; i++) {  
  8.         InputStream is = configLocations[i].getInputStream();  
  9.         try  {  
  10.             client = configParser.parse(is, properties); //通过SqlMapConfigParser解析配置文件,生成SQLMapClientImpl对象   
  11.         }  
  12.         catch  (RuntimeException ex) {  
  13.             throw   new  NestedIOException( "Failed to parse config resource: "  + configLocations[i], ex.getCause());  
  14.         }  
  15.     }  
  16.     ...  
  17.     return  client;  
  18. }  


初始化的核心是通过配置文件构建SQLMapClientImpl对象和其内部的各个属性,这里就不详述了,详细构建过程将另文分析。

SQL执行过程
下面以一个select语句的执行过程,分析一下以上各ibatis核心接口相互如何配合。
1. dao调用SqlMapClientTemplate的query()方法:

Java代码  收藏代码
  1. public  Object queryForObject( final  String statementName,  final  Object parameterObject)  
  2.         throws  DataAccessException {  
  3.   
  4.     return  execute( new  SqlMapClientCallback() {  
  5.         public  Object doInSqlMapClient(SqlMapExecutor executor)  throws  SQLException {  
  6.             return  executor.queryForObject(statementName, parameterObject);  
  7.         }  
  8.     });  
  9. }  



2. execute()方法中展示了执行过程中的核心逻辑:获取session -> 获取connection -> 执行sql ->释放connection -> 关闭session。
部分源码如下:

Java代码  收藏代码
  1. public  Object execute(SqlMapClientCallback action)  throws  DataAccessException {  
  2.                 ...  
  3.         SqlMapSession session = this .sqlMapClient.openSession();  //获取session信息   
  4.           
  5.         Connection ibatisCon = null ;      //获取Connection   
  6.   
  7.         try  {  
  8.             Connection springCon = null ;  
  9.             DataSource dataSource = getDataSource();  
  10.             boolean  transactionAware = (dataSource  instanceof  TransactionAwareDataSourceProxy);  
  11.   
  12.             try  {  
  13.                 ibatisCon = session.getCurrentConnection();  
  14.                 if  (ibatisCon ==  null ) {  
  15.                     springCon = (transactionAware ?  
  16.                             dataSource.getConnection() : DataSourceUtils.doGetConnection(dataSource));  
  17.                     session.setUserConnection(springCon);  
  18.                 ...  
  19.                 }  
  20.             }  
  21.             ...  
  22.   
  23.             // Execute given callback...   
  24.             try  {  
  25.                 return  action.doInSqlMapClient(session);  //执行SQL   
  26.             }  
  27.             ...  
  28.             finally  {  
  29.                         // 关闭Connection   
  30.                 try  {  
  31.                     if  (springCon !=  null ) {  
  32.                         if  (transactionAware) {  
  33.                             springCon.close();   
  34.                         }  
  35.                         else  {  
  36.                             DataSourceUtils.doReleaseConnection(springCon, dataSource);  
  37.                         }  
  38.                     }  
  39.                 }  
  40.                   
  41.             if  (ibatisCon ==  null ) {  
  42.                 session.close(); //关闭session   
  43.             }  
  44.         }  



3. action.doInSqlMapClient(session)调用SqlMapSessionImpl().queryForObject()方法。
注意: 这里调用对象主体为SqlMapSessionImpl,表示在线程session中执行sql(session是ThreadLocal的),而不在负责整体协调的SqlMapClientImpl中执行sql语句。

源码如下:

Java代码  收藏代码
  1. public  Object queryForObject( final  String statementName,  final  Object parameterObject)  
  2.         throws  DataAccessException {  
  3.   
  4.     return  execute( new  SqlMapClientCallback() {  
  5.        //这里的SqlMapExecutor对象类型为SqlMapSessionImpl   
  6.         public  Object doInSqlMapClient(SqlMapExecutor executor)  throws  SQLException {  
  7.             return  executor.queryForObject(statementName, parameterObject);  
  8.         }  
  9.     });  
  10. }  



4. SqlMapSessionImpl().queryForObject()的方法很简单,直接交给代理对象SqlMapExecutorDelegate处理:

Java代码  收藏代码
  1. public  Object queryForObject(String id, Object paramObject)  throws  SQLException {  
  2.   return  delegate.queryForObject(session, id, paramObject);  
  3. }  



5. SqlMapExecutorDelegate的queryForObject()方法代码如下:

Java代码  收藏代码
  1. public  Object queryForObject(SessionScope session, String id, Object paramObject, Object resultObject)  throws  SQLException {  
  2.   Object object = null ;  
  3.   
  4.   MappedStatement ms = getMappedStatement(id); //MappedStatement对象集是上文中提及的初始化方法SqlMapClientFactoryBean.afterPropertiesSet()中,由配置文件构建而成   
  5.   Transaction trans = getTransaction(session); // 用于事务执行   
  6.   boolean  autoStart = trans ==  null ;  
  7.   
  8.   try  {  
  9.     trans = autoStartTransaction(session, autoStart, trans);  
  10.   
  11.     RequestScope request = popRequest(session, ms);  // 从RequestScope池中获取该次sql执行中的上下文环境RequestScope    
  12.     try  {  
  13.       object = ms.executeQueryForObject(request, trans, paramObject, resultObject);   // 执行sql   
  14.     } finally  {  
  15.       pushRequest(request);  //归还RequestScope   
  16.     }  
  17.   
  18.     autoCommitTransaction(session, autoStart);  
  19.   } finally  {  
  20.     autoEndTransaction(session, autoStart);  
  21.   }  
  22.   
  23.   return  object;  
  24. }  



6. MappedStatement携带了SQL语句和执行过程中的相关信息,MappedStatement.executeQueryForObject()方法部分源码如下:

Java代码  收藏代码
  1. public  Object executeQueryForObject(RequestScope request, Transaction trans, Object parameterObject, Object resultObject)  
  2.     throws  SQLException {  
  3.   try  {  
  4.     Object object = null ;  
  5.   
  6.     DefaultRowHandler rowHandler = new  DefaultRowHandler();  
  7.     executeQueryWithCallback(request, trans.getConnection(), parameterObject, resultObject, rowHandler, SqlExecutor.NO_SKIPPED_RESULTS, SqlExecutor.NO_MAXIMUM_RESULTS); //执行sql语句   
  8.       
  9.     //结果处理,返回结果   
  10.     List list = rowHandler.getList();   
  11.     if  (list.size() >  1 ) {  
  12.       throw   new  SQLException( "Error: executeQueryForObject returned too many results." );  
  13.     } else   if  (list.size() >  0 ) {  
  14.       object = list.get(0 );  
  15.     }  
  16.   
  17.     return  object;  
  18.   }   
  19.   ....  
  20. }  



7. MappedStatement.executeQueryWithCallback()方法包含了参数值映射、sql准备和sql执行等关键过程,部分源码如下:

Java代码  收藏代码
  1. protected   void  executeQueryWithCallback(RequestScope request, Connection conn, Object parameterObject, Object resultObject, RowHandler rowHandler,  int  skipResults,  int  maxResults)  
  2.     throws  SQLException {  
  3.     ...  
  4.   try  {  
  5.     parameterObject = validateParameter(parameterObject);  //验证入参   
  6.   
  7.     Sql sql = getSql();  //获取SQL对象   
  8.   
  9.     errorContext.setMoreInfo("Check the parameter map." );  
  10.     ParameterMap parameterMap = sql.getParameterMap(request, parameterObject);// 入参映射   
  11.   
  12.     errorContext.setMoreInfo("Check the result map." );  
  13.     ResultMap resultMap = sql.getResultMap(request, parameterObject); //结果映射   
  14.   
  15.     request.setResultMap(resultMap);  
  16.     request.setParameterMap(parameterMap);  
  17.   
  18.     errorContext.setMoreInfo("Check the parameter map." );  
  19.     Object[] parameters = parameterMap.getParameterObjectValues(request, parameterObject);  //获取参数值   
  20.   
  21.     errorContext.setMoreInfo("Check the SQL statement." );  
  22.     String sqlString = sql.getSql(request, parameterObject);  //获取拼装后的sql语句   
  23.   
  24.     errorContext.setActivity("executing mapped statement" );  
  25.     errorContext.setMoreInfo("Check the SQL statement or the result map." );  
  26.     RowHandlerCallback callback = new  RowHandlerCallback(resultMap, resultObject, rowHandler);  
  27.     sqlExecuteQuery(request, conn, sqlString, parameters, skipResults, maxResults, callback);  //sql执行   
  28.   
  29.     errorContext.setMoreInfo("Check the output parameters." );  
  30.     if  (parameterObject !=  null ) {  
  31.       postProcessParameterObject(request, parameterObject, parameters);  
  32.     }  
  33.   
  34.     errorContext.reset();  
  35.     sql.cleanup(request);  
  36.     notifyListeners();  
  37.     ....  
  38. }  



8. 到了执行中最核心的一步,也是最后一步: MappedStatement.sqlExecuteQuery()方法,它负责sql的最后执行,内部调用了SqlExecutor.executeQuery()方法,部分源码如下:

Java代码  收藏代码
  1. public   void  executeQuery(RequestScope request, Connection conn, String sql, Object[] parameters,  int  skipResults,  int  maxResults, RowHandlerCallback callback)  throws  SQLException {  
  2.   ...  
  3.   PreparedStatement ps = null ;  
  4.   ResultSet rs = null ;  
  5.   setupResultObjectFactory(request);  
  6.   try  {  
  7.     errorContext.setMoreInfo("Check the SQL Statement (preparation failed)." );  
  8.     Integer rsType = request.getStatement().getResultSetType();  
  9.     //初始化PreparedStatement,设置sql、参数值等   
  10.     if  (rsType !=  null ) {  
  11.       ps = prepareStatement(request.getSession(), conn, sql, rsType);  
  12.     } else  {  
  13.       ps = prepareStatement(request.getSession(), conn, sql);  
  14.     }  
  15.     setStatementTimeout(request.getStatement(), ps);  
  16.     Integer fetchSize = request.getStatement().getFetchSize();  
  17.     if  (fetchSize !=  null ) {  
  18.       ps.setFetchSize(fetchSize.intValue());  
  19.     }  
  20.     errorContext.setMoreInfo("Check the parameters (set parameters failed)." );  
  21.     request.getParameterMap().setParameters(request, ps, parameters);  
  22.     errorContext.setMoreInfo("Check the statement (query failed)." );  
  23.     ps.execute(); //执行   
  24.     errorContext.setMoreInfo("Check the results (failed to retrieve results)." );  
  25.   
  26.     // ResultSet处理   
  27.     rs = handleMultipleResults(ps, request, skipResults, maxResults, callback);  
  28.   } finally  {  
  29.     try  {  
  30.       closeResultSet(rs);  
  31.     } finally  {  
  32.       closeStatement(request.getSession(), ps);  
  33.     }  
  34.   }  
  35.   
  36. }  


上面这段代码大家会非常熟悉,和本文开始处的代码很相似,ibatis归根到底,是对JDBC操作一定程度上的封装而已。

下面在总体上概括sql的一般执行过程:
SqlMapClientImpl接到请求后,创建SqlMapSessionImpl对象(ThreadLocal,保证线程安 全),SqlMapSessionImpl交由内部的代理类SqlMapExecutorDelegate执行,代理类获取相应的 MappedStatement,交由MappedStatement对象执行,MappedStatement交由SqlExecutor执行,最终使 用JDBC方式执行sql。

小结
ibatis源码规模较小,整体设计思路清晰,阅读ibatis源码可以按以下思路进行:
1. 了解ibatis框架的整体目标,用于解决哪些问题。
2. ibatis如何解决这些问题,带着问题去学习。
3. 了解ibatis框架的核心接口和整体设计思路。
4. 抓住ibatis核心流程: 初始化和请求处理流程。
5. 详细ibatis框架的关键细节实现,如ibatis中的配置文件解析,参数和结果映射等。

分享到:
评论

相关推荐

    基于ssm的网络教学平台(有报告)。Javaee项目,ssm项目。

    重点:所有项目均附赠详尽的SQL文件,这一细节的处理,让我们的项目相比其他博主的作品,严谨性提升了不止一个量级!更重要的是,所有项目源码均经过我亲自的严格测试与验证,确保能够无障碍地正常运行。 1.项目适用场景:本项目特别适用于计算机领域的毕业设计课题、课程作业等场合。对于计算机科学与技术等相关专业的学生而言,这些项目无疑是一个绝佳的选择,既能满足学术要求,又能锻炼实际操作能力。 2.超值福利:所有定价为9.9元的项目,均包含完整的SQL文件。如需远程部署可随时联系我,我将竭诚为您提供满意的服务。在此,也想对一直以来支持我的朋友们表示由衷的感谢,你们的支持是我不断前行的动力! 3.求关注:如果觉得我的项目对你有帮助,请别忘了点个关注哦!你的支持对我意义重大,也是我持续分享优质资源的动力源泉。再次感谢大家的支持与厚爱! 4.资源详情:https://blog.csdn.net/2301_78888169/article/details/144929660 更多关于项目的详细信息与精彩内容,请访问我的CSDN博客!

    2024年AI代码平台及产品发展简报-V11.pdf

    2024年AI代码平台及产品发展简报-V11

    蓝桥杯JAVA代码.zip

    蓝桥杯算法学习冲刺(主要以题目为主)

    QPSK调制解调技术研究与FPGA实现:详细实验文档的探索与实践,基于FPGA实现的QPSK调制解调技术:实验文档详细解读与验证,QPSK调制解调 FPGA设计,有详细实验文档 ,QPSK调制解调;

    QPSK调制解调技术研究与FPGA实现:详细实验文档的探索与实践,基于FPGA实现的QPSK调制解调技术:实验文档详细解读与验证,QPSK调制解调 FPGA设计,有详细实验文档 ,QPSK调制解调; FPGA设计; 详细实验文档,基于QPSK调制的FPGA设计与实验文档

    PID、ADRC和MPC轨迹跟踪控制器在Matlab 2018与Carsim 8中的Simulink仿真研究,PID、ADRC与MPC轨迹跟踪控制器在Matlab 2018与Carsim 8中的仿真研

    PID、ADRC和MPC轨迹跟踪控制器在Matlab 2018与Carsim 8中的Simulink仿真研究,PID、ADRC与MPC轨迹跟踪控制器在Matlab 2018与Carsim 8中的仿真研究,PID, ADRC和MPC轨迹跟踪控制器Simulink仿真模型。 MPC用于跟踪轨迹 ADRC用于跟踪理想横摆角 PID用于跟踪轨迹 轨迹工况有双移线,避障轨迹,正弦轨迹多种 matlab版本为2018,carsim版本为8 ,PID; ADRC; MPC; 轨迹跟踪控制器; Simulink仿真模型; 双移线; 避障轨迹; 正弦轨迹; MATLAB 2018; CarSim 8,基于Simulink的PID、ADRC与MPC轨迹跟踪控制器仿真模型研究

    基于Springboot的个性化图书推荐系统。Javaee项目,springboot项目。

    重点:所有项目均附赠详尽的SQL文件,这一细节的处理,让我们的项目相比其他博主的作品,严谨性提升了不止一个量级!更重要的是,所有项目源码均经过我亲自的严格测试与验证,确保能够无障碍地正常运行。 1.项目适用场景:本项目特别适用于计算机领域的毕业设计课题、课程作业等场合。对于计算机科学与技术等相关专业的学生而言,这些项目无疑是一个绝佳的选择,既能满足学术要求,又能锻炼实际操作能力。 2.超值福利:所有定价为9.9元的项目,均包含完整的SQL文件。如需远程部署可随时联系我,我将竭诚为您提供满意的服务。在此,也想对一直以来支持我的朋友们表示由衷的感谢,你们的支持是我不断前行的动力! 3.求关注:如果觉得我的项目对你有帮助,请别忘了点个关注哦!你的支持对我意义重大,也是我持续分享优质资源的动力源泉。再次感谢大家的支持与厚爱! 4.资源详情:https://blog.csdn.net/2301_78888169/article/details/144486173 更多关于项目的详细信息与精彩内容,请访问我的CSDN博客!

    Matlab实现Transformer-Adaboost时间序列预测的详细项目实例(含完整的程序,GUI设计和代码详解)

    内容概要:本文档详细介绍了一个利用Matlab实现Transformer-Adaboost结合的时间序列预测项目实例。项目涵盖Transformer架构的时间序列特征提取与建模,Adaboost集成方法用于增强预测性能,以及详细的模型设计思路、训练、评估过程和最终的GUI可视化。整个项目强调数据预处理、窗口化操作、模型训练及其优化(包括正则化、早停等手段)、模型融合策略和技术部署,如GPU加速等,并展示了通过多个评估指标衡量预测效果。此外,还提出了未来的改进建议和发展方向,涵盖了多层次集成学习、智能决策支持、自动化超参数调整等多个方面。最后部分阐述了在金融预测、销售数据预测等领域中的广泛应用可能性。 适合人群:具有一定编程经验的研发人员,尤其对时间序列预测感兴趣的研究者和技术从业者。 使用场景及目标:该项目适用于需要进行高质量时间序列预测的企业或机构,比如金融机构、能源供应商和服务商、电子商务公司。目标包括但不限于金融市场的波动性预测、电力负荷预估和库存管理。该系统可以部署到各类平台,如Linux服务器集群或云计算环境,为用户提供实时准确的预测服务,并支持扩展以满足更高频率的数据吞吐量需求。 其他说明:此文档不仅包含了丰富的理论分析,还有大量实用的操作指南,从项目构思到具体的代码片段都有详细记录,使用户能够轻松复制并改进这一时间序列预测方案。文中提供的完整代码和详细的注释有助于加速学习进程,并激发更多创新想法。

    液滴穿越障碍:从文献到案例的复现研究,液滴破裂与障碍物穿越:文献复现案例研究,液滴生成并通过障碍物破裂 该案例是文献复现,文献与案例一起 ,液滴生成; 障碍物破裂; 文献复现; 案例研究,液滴破

    液滴穿越障碍:从文献到案例的复现研究,液滴破裂与障碍物穿越:文献复现案例研究,液滴生成并通过障碍物破裂。 该案例是文献复现,文献与案例一起。 ,液滴生成; 障碍物破裂; 文献复现; 案例研究,液滴破裂:障碍挑战的文献复现案例

    蓝桥杯练习题_2.zip

    蓝桥杯算法学习冲刺(主要以题目为主)

    蓝桥杯笔记,用于个人学习进步.zip

    蓝桥杯算法学习冲刺(主要以题目为主)

    基于最小递归二乘法的MPC自适应轨迹跟踪控制优化 针对轮胎刚度时变特性提升模型精度与鲁棒性,仿真验证满足车辆低速高精度跟踪与高速稳定性提升 ,基于变预测时域MPC自适应轨迹跟踪控制与轮胎侧偏刚度优化提

    基于最小递归二乘法的MPC自适应轨迹跟踪控制优化 针对轮胎刚度时变特性提升模型精度与鲁棒性,仿真验证满足车辆低速高精度跟踪与高速稳定性提升。,基于变预测时域MPC自适应轨迹跟踪控制与轮胎侧偏刚度优化提升模型精度和鲁棒性,基于变预测时域的MPC自适应轨迹跟踪控制,针对轮胎刚度时变的特点造成控制模型精度降低,基于最小递归二乘法(RLS)估算的轮胎侧偏刚度,提升了模型的控制精度和鲁棒性,通过carsim与simulink联合仿真结果发现,改进后的轨迹跟踪控制器既满足了车辆低速行驶下的轨 迹跟踪精度,也一定程度上克服了高速下车辆容易失去稳定性的问题。 有详细的lunwen分析说明和资料,以及本人的,仿真包运行。 ,基于变预测时域的MPC; 自适应轨迹跟踪控制; 轮胎刚度时变; 控制模型精度降低; 最小递归二乘法(RLS)估算; 模型控制精度和鲁棒性提升; carsim与simulink联合仿真; 轨迹跟踪控制器; 车辆稳定性。,基于变预测时域MPC的轮胎刚度自适应轨迹跟踪控制策略研究

    GMSK调制解调技术研究:基于FPGA设计与实验详解,GMSK调制解调技术详解:基于FPGA设计的实验文档与实践应用,GMSK调制解调 FPGA设计,有详细实验文档 ,GMSK调制解调; FPGA设计

    GMSK调制解调技术研究:基于FPGA设计与实验详解,GMSK调制解调技术详解:基于FPGA设计的实验文档与实践应用,GMSK调制解调 FPGA设计,有详细实验文档 ,GMSK调制解调; FPGA设计; 详细实验文档; 实验结果分析,GMSK调制解调技术:FPGA设计与实验详解

    (源码)基于Arduino和Python的Cansat卫星系统.zip

    # 基于Arduino和Python的Cansat卫星系统 ## 项目简介 本项目是一个Cansat卫星系统,旨在设计和实现一个小型卫星模型,通过火箭发射至1公里高空,并使用地面站接收其传输的数据。项目涉及Arduino编程、Python数据处理和可视化。 ## 主要特性和功能 1. 硬件组件 使用Arduino Nano作为Cansat的微控制器。 搭载BMP 280温度和压力传感器、ATGM336H GPS模块、LoRa通信模块等。 地面站使用Arduino Uno和LoRa通信模块接收数据。 2. 数据处理 使用Python进行数据处理和可视化,包括数据清洗、计算风速、绘制温度、压力、风速和海拔随时间变化的图表等。 3. 通信与控制 通过LoRa模块实现Cansat与地面站之间的数据传输。 提供实时监视和记录数据的脚本。 ## 安装和使用步骤 ### 1. 硬件准备

    LongSung-USB-Drivers-V2.0-for-Windows

    U9300C 龙尚4G模块安装后模块才能正常使用,win7 win10驱动程序,支持USB转接板。

    (源码)基于Arduino平台的物联网温湿度监控系统.zip

    # 基于Arduino平台的物联网温湿度监控系统 ## 项目简介 这是一个基于Arduino平台的物联网温湿度监控项目,旨在通过简单的硬件设备实现环境数据的实时监测与远程管理。该项目适用于智能家居、农业种植等领域。 ## 项目的主要特性和功能 1. 温湿度数据采集通过Arduino板连接温湿度传感器,实时采集环境数据。 2. 数据传输将采集到的数据通过无线网络模块发送到服务器或远程终端。 3. 数据可视化可在电脑或移动设备端展示实时的温湿度数据。 4. 报警功能当温湿度数据超过预设阈值时,自动触发报警通知。 ## 安装使用步骤 前提假设用户已经下载了本项目的源码文件。以下是简单明了的安装使用步骤 1. 环境准备安装Arduino开发环境,配置必要的硬件接口。 2. 硬件连接将Arduino板与温湿度传感器、无线网络模块连接。 3. 代码上传将本项目提供的Arduino代码上传至Arduino板。

    基于需求响应与清洁能源接入的配电网重构优化:综合成本与混合整数凸规划模型分析(matlab实现),基于需求响应与清洁能源接入的配电网重构算法研究:网损与成本优化的仿真分析,高比例清洁能源接入下计及需求

    基于需求响应与清洁能源接入的配电网重构优化:综合成本与混合整数凸规划模型分析(matlab实现),基于需求响应与清洁能源接入的配电网重构算法研究:网损与成本优化的仿真分析,高比例清洁能源接入下计及需求响应的配电网重构(matlab代码) 该程序复现《高比例清洁能源接入下计及需求响应的配电网重构》,以考虑网损成本、弃风弃光成本和开关操作惩罚成本的综合成本最小为目标,针对配电网重构模型的非凸性,引入中间变量并对其进行二阶锥松弛,构建混合整数凸规划模型,采用改进的 IEEE33 节点配电网进行算例仿真,分析了需求响应措施和清洁能源渗透率对配电网重构结果的影响。 该程序复现效果和出图较好(详见程序结果部分),注释清楚,方便学习 ,高比例清洁能源; 需求响应; 配电网重构; 二阶锥松弛; 综合成本最小化; MATLAB代码; IEEE33节点配电网; 复现效果; 出图; 注释清楚。,Matlab代码复现:高比例清洁能源接入下的配电网重构模型与需求响应分析

    (源码)基于C++的RapidJSON库测试项目.zip

    # 基于C++的RapidJSON库测试项目 ## 项目简介 本项目是一个基于C++的RapidJSON库测试项目,主要用于测试RapidJSON库的功能正确性、性能以及稳定性。RapidJSON是一个高效的C++ JSON解析生成库,广泛应用于各种场景。本项目通过编写一系列的单元测试,覆盖了RapidJSON库的主要功能点,包括JSON解析、生成、内存管理、编码转换等,以确保RapidJSON库在各种情况下都能正确、稳定地工作。 ## 项目的主要特性和功能 1. 单元测试框架使用Google Test测试框架进行单元测试,确保测试的可靠性和可扩展性。 2. 全面测试覆盖覆盖了RapidJSON库的主要功能点,包括JSON解析、生成、内存管理、编码转换等,以及针对各种输入数据的测试。 3. 性能测试通过性能基准测试,评估RapidJSON库在处理不同规模和类型的JSON数据时的性能表现。

    蓝桥杯单片机十一届试题.zip

    蓝桥杯算法学习冲刺(主要以题目为主)

    vmware虚拟机安装教程.docx

    内容概要:本文详细介绍如何安装和初步使用 VMware 虚拟机,从下载安装 VMware 到创建和配置新的虚拟机。主要内容包括:软件选择和安装步骤、虚拟机的新建配置、操作系统安装及初始化设置、安装 VMware Tools 提升性能以及一些常用的 VMWare 功能,如虚拟网络的不同连接方式及其应用场景。同时介绍了 VMware 软件在网络连接管理和服务配置方面的一些要点,确保虚拟机正常运行。 适用人群:计算机操作较为熟练、有意搭建不同操作系统测试环境的技术人员,以及想要了解虚拟机基本概念及应用的学生。 使用场景及目标:适合于个人用户进行系统兼容性和安全性的验证;适用于企业或开发者做软件测试、模拟复杂环境下作业,确保不影响宿主机正常工作的前提下完成多种任务;适用于教学培训环境中部署实验平台。此外,还可以用来隔离特定业务流程(比如银行工具)、探索不同类型操作系统的特点。 其他说明:需要注意的是,为了避免安装过程中出现问题,建议暂时关闭杀毒软件和防火墙。安装 VMware 需要接受许可协议,同时可以选择安装路径和安装类型(典型/自定义)。最后,对于网络设置,默认提供的三种模式——桥接模式、仅主机模式和 NAT 模式,可以帮助用户根据不同需求灵活调整网络连接方式。

    java毕业设计之网上校友录设计源码.zip

    java毕业设计源码

Global site tag (gtag.js) - Google Analytics