`
ruvuoai
  • 浏览: 96580 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Hibernate自定义表单完全解决方案(无需重置SessionFactory)

阅读更多
转自:http://ssuupv.blog.163.com/blog/static/146156722009816478603/


最近开发的一个系统,需要在不更改代码和重启系统的情况下提供对用户自动建表的支持,由于系统应用了hibernate,所以在建表同时也要建立持久化对象以及对这些对象注册,人渣我首先想倒的是 baidu和google,哪知一番搜索下来,发现都不尽入人意,于是乎,造轮子之路开始了
数据库我是采用的oracle9i,目前在比如数据库类型支持,还有对象关系支持上都很简单,不过在现有基础上进行扩展,都是可以实现的
实现步骤如下
建立class->生成hbm.xml->在Hibernate'config里面注册持久化类->通知SessionFactory持久化类的新增
1 准备
首先准备基础数据,我建立了几个类来对生成的表和属性做描述 这些描述都将作为传输传递给class生成方法和hbm.xml的生成方法
RenderClass 描述要生成的实体类 属性如下

className 类名 
tableName 对应表名 
properties 属性集合


RenderProperty 就是properties集合的内容 属性如下
name 属性名称 
type java类型 
field 字段名 
primary 是否主键 
sequence 对应ID生成的sequence 
length 对应长度


2 生成class
采用ASM 生成
Java代码
/**  
 * 根据传入参数创建CLASS文件  
 *  
 * @param 类名  
 * @param 保存路径  
 * @param 属性描述  
 * @return Class  
 */   
public  Class build(String clsname,String savepath,Collection properties)   
{   
    Class cls = null;   
    try   
    {   
        String classname = BuildUtil.transferClassName(clsname);   
        ClassWriter cw = new ClassWriter(false);      
        //建立构造函数   
        cw.visit(V1_1, ACC_PUBLIC, classname, null, "java/lang/Object", null);      
        MethodVisitor mw = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);      
        mw.visitVarInsn(ALOAD, 0);      
        mw.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V");      
        mw.visitInsn(RETURN);      
        mw.visitMaxs(1, 1);      
        mw.visitEnd();   
           
        BuildProperty property = null;   
        String propertytype = null;   
        String propertyname = null;;   
        //建立属性   
        Iterator iterator = properties.iterator();   
        while (iterator.hasNext())   
        {   
            //建立属性对应的类变量   
            property = (BuildProperty)iterator.next();   
            propertytype = BuildUtil.transferClassName(property.getType());   
            propertyname = WordUtils.capitalize(property.getName());   
            cw.visitField(ACC_PRIVATE, property.getName(), "L"+propertytype+";", null, null).visitEnd();   
            //建立get方法   
            mw = cw.visitMethod(ACC_PUBLIC, "get"+propertyname, "()L"+propertytype+";", null,    
            null);    
            mw.visitCode();    
            mw.visitVarInsn(ALOAD, 0);    
            mw    
            .visitFieldInsn(GETFIELD, classname, property.getName(),    
            "L"+propertytype+";");    
            mw.visitInsn(ARETURN);    
            mw.visitMaxs(1, 1);    
            mw.visitEnd();    
            //建立set方法   
            mw = cw.visitMethod(ACC_PUBLIC, "set"+propertyname, "(L"+propertytype+";)V",    
                    null, null);    
            mw.visitCode();    
            mw.visitVarInsn(ALOAD, 0);    
            mw.visitVarInsn(ALOAD, 1);    
            mw    
            .visitFieldInsn(PUTFIELD, classname, property.getName(),    
            "L"+propertytype+";");    
            mw.visitMaxs(2, 2);    
            mw.visitInsn(RETURN);    
            mw.visitEnd();    
        }   
           
        cw.visitEnd();   
   
        byte[] code = cw.toByteArray();    
        if (savepath!=null)   
        {     
            Assistant.createNewFile(savepath);   
            FileOutputStream fos = new FileOutputStream(savepath);      
            fos.write(code);      
            fos.close();      
        }   
        cls = this.defineClass(clsname, code, 0, code.length);   
        return cls;   
    }   
    catch (Throwable e)   
    {   
        e.printStackTrace();   
    }   
    return cls;   
}  

3 生成hbm.xml
生成这种事情,当然是交给模板了,我这里用的是Freemarker,在这里,我要感谢freemarker的开发组,感谢webwork 感谢XXCMS系统对freemarker以及其他模板语言的大力推广,,感谢。。。。(省略100字)
模板嘛,肯定不仅仅是应用在web环境的,看看源代码下的freemarker.cache包,恩,不错,freemarker团队确实是有一定“野心”的 首先是渲染的实现
Java代码
package com.mit.cooperate.core.asm.render;   
   
import java.io.File;   
import java.io.FileOutputStream;   
import java.io.PrintWriter;   
import java.io.StringWriter;   
   
import javax.servlet.ServletContext;   
   
import com.mit.cooperate.core.util.Assistant;   
   
import freemarker.cache.ClassTemplateLoader;   
import freemarker.template.Configuration;   
import freemarker.template.ObjectWrapper;   
import freemarker.template.SimpleHash;   
import freemarker.template.Template;   
import freemarker.template.TemplateExceptionHandler;   
/**  
 * freeMarker模板渲染  
 * @author courser.tijichen  
 */   
public class FreemarkerRender implements Render{   
       
    private Configuration templateconfig;   
       
    public  FreemarkerRender()   
    {   
        this.initialize();   
    }   
    /**  
     * 初始化freemarker配置  
     *  
     */   
    public void initialize()   
    {   
        try   
        {   
            if (templateconfig==null)   
            {   
                templateconfig = new Configuration();   
                templateconfig.setTemplateExceptionHandler(TemplateExceptionHandler.HTML_DEBUG_HANDLER);   
                templateconfig.setObjectWrapper(ObjectWrapper.DEFAULT_WRAPPER);   
                templateconfig.setTemplateLoader(new ClassTemplateLoader(this.getClass(),"/"));   
                templateconfig.setTemplateUpdateDelay(1200);   
                templateconfig.setDefaultEncoding("gb2312");   
                templateconfig.setLocale(new java.util.Locale("zh_CN"));   
                templateconfig.setNumberFormat("0.##########");   
            }   
        }   
        catch (Exception e)   
        {}   
    }   
    /**  
     * 渲染  
     *  
     */   
    public void render(RenderClass target,String template,String outpath)   
    {   
        try   
        {   
            StringWriter writer = new StringWriter();   
            Template tl = templateconfig.getTemplate(   
                    template,   
                    templateconfig.getLocale());   
            SimpleHash root = new SimpleHash();   
            root.put("entity", target);   
            tl.process(root, writer);   
            Assistant.createNewFile(outpath);   
            FileOutputStream fos = new FileOutputStream(outpath);   
            PrintWriter pwriter = new PrintWriter(fos);   
            pwriter.write(writer.toString());   
            pwriter.close();   
            fos.close();      
        }   
        catch (Exception ex)   
        {   
            ex.printStackTrace();   
        }   
    }   
} 

然后就是准备模板了,首先声明,我这个模板写得简单粗陋之极,不过粗陋简单不正是人渣偶的终极处世之道么,何况只实现几个简单功能,仅仅是针对测试而已嘛,何必搞得那么正规严肃了,嘿嘿
Html代码
<?xml version="1.0" encoding="utf-8"?>   
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"   
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">   
<hibernate-mapping>   
    <class name="${entity.className}" table="${entity.tableName}">   
        <#if entity.properties?exists>   
            <#list entity.properties as property>   
                <#if property.primary>   
                    <id name="${property.name}" type="${property.type}">   
                <#else>   
                    <property name="${property.name}" type="${property.type}">   
                </#if>   
                <#if property.type=="java.lang.String">   
                    <column name="${property.field?upper_case}" <#if property.length?exists>length="${property.length}"</#if>></column>   
                <#elseif property.type=="java.util.Date">   
                        <column name="${property.field?upper_case}" length=7></column>   
                <#elseif property.type=="java.lang.Long" || property.type=="java.lang.Integer"   
                    || property.type=="java.lang.Short">   
                        <column name="${property.field?upper_case}" <#if property.length?exists>precision="${property.length}"</#if> scale="0"></column>   
                </#if>   
                <#if property.primary==true>   
                    <#if property.sequence?exists>   
                        <generator class="sequence">   
                            <param name="sequence">${property.sequence}</param>   
                        </generator>   
                    </#if>   
                    </id>   
                <#else>   
                    </property>   
                </#if>   
            </#list>   
        </#if>   
    </class>   
</hibernate-mapping> 

4 注册
首先是对生成的hbm.xml的注册,比如,我获取倒Hibernate的一个config以后
Java代码
URL  
url = this.getClass().getResource("/com/mit/test/person.hbm.xml");   
config.addURL(url);  

然后就是要通知sessionFactory,新增了持久类,目前很多方法都是重启sessionfactory,就是关闭当前 sessionFactory ,然后根据config build一个新的sessionFactory出来,但是,这种情况感觉总不那么完美,虽然这个过程持续不到多长时间,但用户每增一个表就close然后build一个,单说用户体验,人家正在提交数据了,你把这个给close了....
但目前hibernate包的 sessionFactory 确实没提供这种对持久类的add支持,XX伟人说过:没有条件 创造条件也要上,于是乎,拿起你的键盘,启动 editplus,向hibernate3的源码砍去。。

其实,改动地方也不大。
Java代码
一是,改动Configuration,三句话  
   
public Mapping getMapping()   
    {   
        return this.mapping;   
    } 


然后是SessionFactoryImpl 我们要让他知道,这个世界上还存在很多未知的来客,需要你去主动了解。。。。
增加代码如下
Java代码
public void addPersistentClass(PersistentClass model,Mapping mapping)   
{   
    if ( !model.isInherited() ) {   
        IdentifierGenerator generator = model.getIdentifier().createIdentifierGenerator(   
                settings.getDialect(),   
                settings.getDefaultCatalogName(),   
                settings.getDefaultSchemaName(),   
                (RootClass) model   
        );   
        if (!identifierGenerators.containsKey(model.getEntityName()))   
            identifierGenerators.put( model.getEntityName(), generator );   
    }   
       
    model.prepareTemporaryTables( mapping, settings.getDialect() );   
    String cacheRegion = model.getRootClass().getCacheRegionName();   
   
    CacheConcurrencyStrategy cache = CacheFactory.createCache(   
                model.getCacheConcurrencyStrategy(),   
                cacheRegion,   
                model.isMutable(),   
                settings,   
                properties   
            );   
    if (cache!=null)   
        allCacheRegions.put( cache.getRegionName(), cache.getCache() );   
           
       
    EntityPersister cp = PersisterFactory.createClassPersister(model, cache, this, mapping);   
    if ( cache != null && cache.getCache() instanceof OptimisticCache ) {   
        ( ( OptimisticCache ) cache.getCache() ).setSource( cp );   
    }   
    entityPersisters.put( model.getEntityName(), cp );   
}  

最后遗留的是hbm.xml在cfg.xml的注册,以保证系统重启后可以顺利加载新增的持久化配置
Java代码
/**  
 * 把hbm.xml的路径加入到cfg.xml的mapping结点  
 *  
 * @param cfg.xml的路径  
 * @param hbm.xml的路径  
 */   
public static void updateHbmCfg(URL url,String hbm)   
{   
    try   
    {   
        SAXReader reader = new SAXReader();   
        Document doc = reader.read(url);   
        Element element = (Element)doc.getRootElement()   
        .selectSingleNode("session-factory");   
           
        Element hbmnode = element.addElement("mapping");   
        hbmnode.addAttribute("resource", hbm);   
        String filepath = url.getFile();   
        if (filepath.charAt(0)=='/')   
            filepath = filepath.substring(1);   
        FileOutputStream outputstream = new FileOutputStream(filepath);   
        XMLWriter writer = new XMLWriter(outputstream);   
        writer.write(doc);   
        outputstream.close();   
    }   
    catch (Exception e)   
    {   
        e.printStackTrace();   
    }   
}  

Java代码
大功告成 ,先运行一个小周天 

最后是总结测试,写个junit 搞定 代码如下:
Java代码
package com.mit.cooperate.core.hibernate;   
   
import junit.framework.TestCase;   
   
import java.net.URL;   
import java.util.ArrayList;   
   
import org.apache.commons.beanutils.PropertyUtils;   
   
import org.hibernate.Session;   
import org.hibernate.cfg.Configuration;   
import org.hibernate.SessionFactory;   
import org.hibernate.tool.hbm2ddl.SchemaExport;   
import org.hibernate.impl.SessionFactoryImpl;   
import org.hibernate.mapping.PersistentClass;   
import org.hibernate.Transaction;   
   
import com.mit.cooperate.core.asm.*;   
import com.mit.cooperate.core.asm.render.*;   
   
public class HibernateTest extends TestCase {   
       
    private Configuration config;   
    private SessionFactory factory;   
       
    public void setUp()   
    {   
        URL  url = this.getClass().getResource("/com/mit/cooperate/core/hibernate/hibernate.cfg.xml");   
        config = new Configuration().configure(url);   
        factory = config.buildSessionFactory();   
    }   
       
    public void testBuild() throws Exception   
    {   
        //持久类对象描述   
        RenderClass rc = new RenderClass();   
        ArrayList list = new ArrayList();   
           
        RenderProperty property = new RenderProperty();   
        //添加主键   
        property.setName("oid");   
        property.setField("oid");   
        property.setLength(new Integer(15));   
        property.setPrimary(true);   
        property.setType(Long.class.getName());   
        property.setSequence("SEQ_PERSON");   
           
        list.add(property);   
        //添加一个name字段   
        property = new RenderProperty();   
        property.setName("name");   
        property.setType(String.class.getName());   
        property.setField("name");   
        property.setLength(new Integer(20));   
           
        list.add(property);   
           
        rc.setProperties(list);   
        //类名   
        rc.setClassName("com.mit.test.Person");   
        rc.setTableName("person");   
        //开始生成class   
        POBuildUtil util = new POBuildUtil();   
        util.build(rc.getClassName(),"E:\\cpc\\source\\cooperateCore\\com\\mit\\test\\Person.class",list);   
        //实例化一个person   
        Object person = Class.forName("com.mit.test.Person").newInstance();//hbmcls.newInstance();   
           
        //开始生成hbm.xml   
        FreemarkerRender render = new FreemarkerRender();   
        render.render(rc, Templates.TEMPLATE_HIBERNATE3, "E:\\cpc\\source\\cooperateCore\\com\\mit\\test\\person.hbm.xml");   
        URL  url = this.getClass().getResource("/com/mit/test/person.hbm.xml");   
        config.addURL(url);   
        //更新hibernate.cfg.xml   
        HibernateUtil.updateHbmCfg( this.getClass().getResource("/com/mit/cooperate/core/hibernate/hibernate.cfg.xml"), "com/mit/test/person.hbm.xml");   
           
        PersistentClass model = config.getClassMapping("com.mit.test.Person");   
        //sessionFactory哪下子,快接纳person爷爷进去   
        ((SessionFactoryImpl)factory).addPersistentClass(model, config.getMapping());   
        //生成数据库   
        SchemaExport export = new SchemaExport(config,((SessionFactoryImpl)factory).getSettings());   
        export.execute(true, true,false,true);   
        //测试一下,随便给个名字什么的   
        PropertyUtils.setProperty(person, "name", "chenzhi");   
        Session session = factory.openSession();   
        Transaction tran = session.beginTransaction();   
        try   
        {   
            //保存   
            session.save(person);   
            tran.commit();   
        }   
        catch (Exception e)   
        {   
            e.printStackTrace();   
            tran.rollback();   
        }   
        finally   
        {   
            session.close();   
        }   
    }   
       
    public void tearDown()   
    {   
        factory.close();   
    }   
       
       
}  
分享到:
评论

相关推荐

    用SSH2实现简单的用户登录注册删除功能.docx

    `&lt;s:textfield&gt;`和`s:password`标签用于创建表单字段,`&lt;s:submit&gt;`和&lt;s:reset&gt;`定义了提交和重置按钮。`&lt;s:actionerror&gt;`和`s:actionmessage`用于显示Action类中设置的错误和消息,这对于用户交互和验证非常重要。 ...

    spring+struts+Hibernate面试题

    - **利用 Struts 提供的工具类**:例如使用 `ActionForm` 的 `reset()` 方法来重置表单数据,确保每个请求都有干净的数据。 - **结论**:在 Struts 1 中,由于 Action 是单例模式的,所以默认情况下它是不线程安全...

    SSH框架面试题.pdf

    这些方法分别用于重置表单数据和验证表单数据的有效性。 4. **在Struts中,Action类的常用方法有哪些?** - `execute()`: 这是在Struts 1中Action类的主要方法,用于处理用户的请求。 - `executeAction()`: 在...

    MATLAB实现基于LSTM-AdaBoost长短期记忆网络结合AdaBoost时间序列预测(含模型描述及示例代码)

    内容概要:本文档详细介绍了基于 MATLAB 实现的 LSTM-AdaBoost 时间序列预测模型,涵盖项目背景、目标、挑战、特点、应用领域以及模型架构和代码示例。随着大数据和AI的发展,时间序列预测变得至关重要。传统方法如 ARIMA 在复杂非线性序列中表现欠佳,因此引入了 LSTM 来捕捉长期依赖性。但 LSTM 存在易陷局部最优、对噪声鲁棒性差的问题,故加入 AdaBoost 提高模型准确性和鲁棒性。两者结合能更好应对非线性和长期依赖的数据,提供更稳定的预测。项目还展示了如何在 MATLAB 中具体实现模型的各个环节。 适用人群:对时间序列预测感兴趣的开发者、研究人员及学生,特别是有一定 MATLAB 编程经验和熟悉深度学习或机器学习基础知识的人群。 使用场景及目标:①适用于金融市场价格预测、气象预报、工业生产故障检测等多种需要时间序列分析的场合;②帮助使用者理解并掌握将LSTM与AdaBoost结合的实现细节及其在提高预测精度和抗噪方面的优势。 其他说明:尽管该模型有诸多优点,但仍存在训练时间长、计算成本高等挑战。文中提及通过优化数据预处理、调整超参数等方式改进性能。同时给出了完整的MATLAB代码实现,便于学习与复现。

    palkert_3ck_01_0918.pdf

    palkert_3ck_01_0918

    pepeljugoski_01_1106.pdf

    pepeljugoski_01_1106

    tatah_01_1107.pdf

    tatah_01_1107

    [AB PLC例程源码][MMS_046393]Motor Speed Reference.zip

    AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!

    基于51的步进电机控制系统20250302

    题目:基于单片机的步进电机控制系统 模块: 主控:AT89C52RC 步进电机(ULN2003驱动) 按键(3个) 蓝牙(虚拟终端模拟) 功能: 1、可以通过蓝牙远程控制步进电机转动 2、可以通过按键实现手动与自动控制模式切换。 3、自动模式下,步进电机正转一圈,反转一圈,循环 4、手动模式下可以通过按键控制步进电机转动(顺时针和逆时针)

    [AB PLC例程源码][MMS_041234]Logix Fault Handler.zip

    AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!

    [AB PLC例程源码][MMS_042348]Using an Ultra3000 as an Indexer on DeviceNet with a CompactLogix.zip

    AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!

    智慧校园平台建设全流程详解:从需求到持续优化

    内容概要:本文详细介绍了建设智慧校园平台所需的六个关键步骤。首先通过需求分析深入了解并确定校方和使用者的具体需求;其次是规划设计阶段,依据所得需求制定全面的建设方案。再者是对现有系统的整合——系统集成,确保新旧平台之间的互操作性和数据一致性。培训支持帮助全校教职工和学生快速熟悉新平台,提高效率。实施试点确保系统逐步稳定部署。最后,强调持续改进的重要性,以适应技术和环境变化。通过这一系列有序的工作,可以使智慧校园建设更为科学高效,减少失败风险。 适用人群:教育领域的决策者和技术人员,包括负责信息化建设和运维的团队成员。 使用场景及目标:用于指导高校和其他各级各类学校规划和发展自身的数字校园生态链;目的是建立更加便捷高效的现代化管理模式和服务机制。 其他说明:智慧校园不仅仅是简单的IT设施升级或软件安装,它涉及到全校范围内的流程再造和创新改革。

    AI淘金实战手册:100+高收益变现案例解析

    该文档系统梳理了人工智能技术在商业场景中的落地路径,聚焦内容生产、电商运营、智能客服、数据分析等12个高潜力领域,提炼出100个可操作性变现模型。内容涵盖AI工具开发、API服务收费、垂直场景解决方案、数据增值服务等多元商业模式,每个思路均配备应用场景拆解、技术实现路径及收益测算框架。重点呈现低代码工具应用、现有平台流量复用、细分领域自动化改造三类轻量化启动方案,为创业者提供从技术选型到盈利闭环的全流程参考。

    palkert_3ck_02_0719.pdf

    palkert_3ck_02_0719

    2006-2023年 地级市-克鲁格曼专业化指数.zip

    克鲁格曼专业化指数,最初是由Krugman于1991年提出,用于反映地区间产业结构的差异,也被用来衡量两个地区间的专业化水平,因而又称地区间专业化指数。该指数的计算公式及其含义可以因应用背景和具体需求的不同而有所调整,但核心都是衡量地区间的产业结构差异或专业化程度。 指标 年份、城市、第一产业人数(first_industry1)、第二产业人数(second_industry1)、第三产业人数(third_industry1)、专业化指数(ksi)。

    [AB PLC例程源码][MMS_046305]R2FX.zip

    AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!

    精品推荐-通信技术LTE干货资料合集(19份).zip

    精品推荐,通信技术LTE干货资料合集,19份。 LTE PCI网络规划工具.xlsx LTE-S1切换占比专题优化分析报告.docx LTE_TDD问题定位指导书-吞吐量篇.docx LTE三大常见指标优化指导书.xlsx LTE互操作邻区配置核查原则.docx LTE信令流程详解指导书.docx LTE切换问题定位指导一(定位思路和问题现象).docx LTE劣化小区优化指导手册.docx LTE容量优化高负荷小区优化指导书.docx LTE小区搜索过程学习.docx LTE小区级与邻区级切换参数说明.docx LTE差小区处理思路和步骤.docx LTE干扰日常分析介绍.docx LTE异频同频切换.docx LTE弱覆盖问题分析与优化.docx LTE网优电话面试问题-应答技巧.docx LTE网络切换优化.docx LTE高负荷小区容量优化指导书.docx LTE高铁优化之多频组网优化提升“用户感知,网络价值”.docx

    matlab程序代码项目案例:matlab程序代码项目案例matlab中Toolbox中带有的模型预测工具箱.zip

    matlab程序代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!

    pepeljugoski_01_0508.pdf

    pepeljugoski_01_0508

    szczepanek_01_0308.pdf

    szczepanek_01_0308

Global site tag (gtag.js) - Google Analytics