MicroDao 正在参加 2021 年度 OSC 中国开源项目评选,请投票支持!
MicroDao 在 2021 年度 OSC 中国开源项目评选 中已获得 {{ projectVoteCount }} 票,请投票支持!
2021 年度 OSC 中国开源项目评选 正在火热进行中,快来投票支持你喜欢的开源项目!
2021 年度 OSC 中国开源项目评选 >>> 中场回顾
MicroDao 获得 2021 年度 OSC 中国开源项目评选「最佳人气项目」 !
授权协议 Apache
开发语言 Java
操作系统 跨平台
软件类型 开源软件
开源组织
地区 国产
投 递 者 杰睿宁
适用人群 未知
收录时间 2017-12-26

软件简介

micro-dao中式dao和orm框架

MicroDao为了解决mybatis固有缺陷,进行全新封装的dao框架,功能覆盖mybatis,且比mybatis更灵活。

MicroDao同时支持mysql和oracle

MicroDao相对mybatis的优点:

1,sql脚本支持修改后热部署实时生效。

2,bean与数据库字段映射关系,通过注解设置到bean中,不必在sql脚本中体现。

3,sql脚本支持类似jsp的写法,且不必区分select、update使用不同标签,更加灵活。

4,不需要使用插件,内置支持物理分页。

5,不需要使用插件,内置支持针对bean的标准增删改查功能。

6,不需要使用插件,内置支持读写分离,分库分表。

7,针对mysql5.7支持动态字段。

支持mapper、template、非orm三种模式支撑业务系统

1,mapper指,通过扫描接口,运行时自动生成dao实例;

2,template指,通过继承template标准父类,生成dao子类;

3,非orm指,直接使用microDao实例,可以执行非orm更灵活的数据库操作。

mapper模式技术说明

1,编写实体bean

使用@MicroTableName注解说明对应的表名称

使用@MicroMappingAnno注解说明对应的字段名称
 

package com.github.jeffreyning.test.dto;
import com.nh.micro.orm.MicroMappingAnno;
import com.nh.micro.orm.MicroTableName;

@MicroTableName(name="micro_test")
public class MicroTest {
    @MicroMappingAnno(name="id")
    private String id;
    
    @MicroMappingAnno(name="meta_key")
    private String metaKey;
    
    @MicroMappingAnno(name="meta_name")
    private String metaName;
    
    @MicroMappingAnno(name="meta_type")
    private String metaType;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getMetaKey() {
        return metaKey;
    }

    public void setMetaKey(String metaKey) {
        this.metaKey = metaKey;
    }

    public String getMetaName() {
        return metaName;
    }

    public void setMetaName(String metaName) {
        this.metaName = metaName;
    }

    public String getMetaType() {
        return metaType;
    }

    public void setMetaType(String metaType) {
        this.metaType = metaType;
    }
}

2,编写dao层接口

通过继承MicroCommonMapper实现对实体bean(在泛型中设置)的标准增删改查功能

接口的方法名如updateInfoByNhs会映射为sql脚本中段落名称

接口参数个数和类型均无限制


关于结果映射:

查询单条记录是,如果接口设置的返回值为实体bean则,则自动进行映射。

接口返回值如果是list,可以用@ListInnerClass注解设置list中实体类,不设置则按照list返回


关于分页:

分页的页数每页的记录数,查询出总记录数,均通过DefaultPageInfo对象带入带出。

使用mapper模式时接口方法中带有DefaultPageInfo对象时自动进行分页处理。


关于插入时自增id返回:

使用MicroCommonMapper通用插入方法时,通过实体bean带回自增id。

使用sql时,通过IdHolder对象带出自增id。使用mapper模式时接口方法中传入IdHolder按照自增id处理。


关于读写分离:

通过在接口中设置@MicroDbName注解,决定底层切换哪个数据源进行操作。可以用此功能实现读写分离。

package com.github.jeffreyning.test.dao;
import java.util.List;
import java.util.Map;
import com.github.jeffreyning.test.dto.MicroTest;
import com.nh.micro.dao.mapper.ListInnerClass;
import com.nh.micro.dao.mapper.MicroCommonMapper;
import com.nh.micro.orm.MicroDbName;
import com.nh.micro.template.IdHolder;

@MicroDbName(name="default")
public interface TestRep extends MicroCommonMapper  {
    
    public int updateInfoByNhs(MicroTest microTest);
    
    public int insertInfoByNhs(Map paramMap, IdHolder idHolder);
    
    @ListInnerClass(name=MicroTest.class)
    public List queryInfoByUserName(String name);    

    public List queryInfoByUserAge(Map paramMap);
}


 

3,编写sql脚本

脚本文件为txt格式但必须以.nhs作为文件名后缀(如:TestRep.nhs)

设置段落<%! %> xxxxxxxx <%! %>

段落id需与接口方法名相同。

段落不区分select还是update,统一用sql标识。

逻辑判断部分类似jsp用<% some script %>表示

与mybatis一样参数值使用#{} ${}两种方式引用

应用时必须以paramArray开始,paramArray是一个数组与接口参数数据对应。

set字符拼接时,首个逗号会在框架内部自动删除,不需要做额外处理。


/* 查询 */
<%! %>
select * from micro_test t left join micro_user u on  t.user_id=u.user_id where 1=1
<% if(paramArray[0]!=null){ %>        
    and u.user_name like '%${paramArray[0]}%'             
<%     } %>
<%! %>

<%! %>
select * from micro_test t left join micro_user u on  t.user_id=u.user_id where 1=1
<% if(paramArray[0].get("user_age")!=null){ %>        
    and u.user_age >= #{paramArray[0].user_age}             
<%     } %>
<%! %>

/* 插入 */
<%! %>
insert into micro_test(id,meta_key) values(
#{paramArray[0].id},#{paramArray[0].meta_key}
    )
<%! %>
 
 
/* 更新 */
<%! %>
update micro_test set  
            
<% if(paramArray[0].metaKey!=null){%>
,meta_key=#{paramArray[0].metaKey}    
<% } %>    
<% if(paramArray[0].metaName!=null){%>
,meta_name=#{paramArray[0].metaName}    
<% } %>    

where id=#{paramArray[0].getId()}
<%! %>
 

4,在spring中配置扫描sql脚本和接口

配置NhsInitUtil用来加载sql脚本,其中rulePath是脚本根目录路径。

配置BeanScannerConfigurer用来加载mapper接口,其中scanPath是接口根目录路径.路径为多个时用逗号分隔。

MicroDao内部需要使用jdbctemplate。

配置microDbHolder是MicroDao内部用来设置并在读写分离时切换多个数据源(jdbctemplate)的机制,至少配置一个default数据源。

其中dbTypeMap属性用来配置数据源类型可填写mysql或oracle

关于事务:

仍使用spring事务机制TransactionManager进行管理

 

5,使用mapper出的dao实例操作数据库

 

package com.github.jeffreyning.test;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.github.jeffreyning.test.dao.TestRep;
import com.github.jeffreyning.test.dto.MicroTest;
import com.nh.micro.dao.mapper.DefaultPageInfo;
import com.nh.micro.dao.mapper.MicroPageInfo;
import com.nh.micro.template.IdHolder;

public class TestMicroDao {

    /**
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        TestRep testRep=(TestRep) ac.getBean("testRep");

        /*根据实体bean 创建*/
        MicroTest microTest=new MicroTest();
        microTest.setMetaKey("t1");
        microTest.setMetaName("test1");
        testRep.createInfoMapper(microTest);
        String id=microTest.getId();
        
        /*根据实体bean的example 分页查询*/
        DefaultPageInfo pageInfo=new DefaultPageInfo();
        List list=testRep.getInfoList4PageMapper(null, pageInfo);
        Long total=pageInfo.getTotal();
        System.out.println(list.toString());
        System.out.println("total="+total);
        
        /*根据实体bean的example 查询*/
        List alllist=testRep.getInfoListAllMapper(null, "");
        System.out.println(alllist.toString());        
        
        /*根据实体bean的Id 查询*/
        MicroTest tempBean=testRep.getInfoByIdMapper(id);
        System.out.println(tempBean.toString());
        
        /*根据实体bean 更新记录*/
        tempBean.setMetaName("test12");
        testRep.updateInfoMapper(tempBean);
        
        /*根据实体bean的id 删除记录*/
        testRep.delInfoByIdMapper(id);
        
        /*根据sql 插入*/
        Map paramMap=new HashMap();
        paramMap.put("meta_key", "test123");
        paramMap.put("meta_name", "123");
        IdHolder idHolder=new IdHolder();
        testRep.insertInfoByNhs(paramMap,idHolder);
        Object idObj=idHolder.getIdVal();
        System.out.println("id="+idObj.toString());
        
        /*根据sql 更新*/
        MicroTest bean1=new MicroTest();
        bean1.setId(idObj.toString());
        bean1.setMetaName("new name");
        testRep.updateInfoByNhs(bean1);
        
        /*根据sql 联合查询*/
        String name="tom";
        List list2=testRep.queryInfoByUserName(name);
        System.out.println(list2.toString());
        
        /*根据sql 联合查询*/
        Map pMap=new HashMap();
        pMap.put("user_age", 20);
        List list3=testRep.queryInfoByUserAge(pMap);
        System.out.println(list3.toString());    

    }

}

 

template模式技术说明
通过继承MicroMapperTemplate实现针对实体bean的增删改查操作和sql操作


package com.github.jeffreyning.test.temp;

import com.github.jeffreyning.test.dto.MicroTest;
import com.nh.micro.dao.mapper.MicroMapperTemplate;

public class demoDao extends MicroMapperTemplate {
    public MicroTest getInfo(String id) throws Exception {
        return getInfoByIdMapper(id);
    }
}


 

非orm模式技术说明

通过继承MicroServiceTemplateSupport实现针对表的增删改查操作和sql操作。

输入输出均为map,且map的value均为string类型,key对应列名称。
日期类型string按照格式yyyy-MM-dd HH🇲🇲ss填写。

//插入
public Integer createInfoService(Map requestParamMap,String tableName)
//分页查询
public Map getInfoList4PageService(Map requestParamMap,String tableName,Map pageMap)
//不分页查询
public List getInfoListAllService(Map requestParamMap,String tableName,Map sortMap)
//更新
public Integer updateInfoService(Map requestParamMap,String tableName)
//删除
public Integer delInfoService(Map requestParamMap,String tableName)


 

展开阅读全文

代码

评论

点击引领话题📣
发表了资讯
2017/12/28 16:20

MicroDao 中式道(dao) v1.0.2 发布

MicroDao同时支持mysql和oracle MicroDao相对mybatis的优点: sql脚本支持修改后热部署实时生效。 bean与数据库字段映射关系,通过注解设置到bean中,不必在sql脚本中体现。 sql脚本支持类似jsp的写法,且不必区分select、update使用不同标签,更加灵活。 不需要使用插件,内置支持物理分页。 不需要使用插件,内置支持针对bean的标准增删改查功能。 不需要使用插件,内置支持读写分离,分库分表。 针对mysql5.7支持动态字段。 ...

0
8
没有更多内容
加载失败,请刷新页面
点击加载更多
加载中
下一页
发表了博客
{{o.pubDate | formatDate}}

{{formatAllHtml(o.title)}}

{{parseInt(o.replyCount) | bigNumberTransform}}
{{parseInt(o.viewCount) | bigNumberTransform}}
没有更多内容
暂无内容
发表了问答
{{o.pubDate | formatDate}}

{{formatAllHtml(o.title)}}

{{parseInt(o.replyCount) | bigNumberTransform}}
{{parseInt(o.viewCount) | bigNumberTransform}}
没有更多内容
暂无内容
Vmware Spring Framework存在未明漏洞
输入验证不恰当
Vmware Spring Framework是美国威睿(Vmware)公司的一套开源的Java、JavaEE应用程序框架。该框架可帮助开发人员构建高质量的应用。Vmware Spring Framework存在安全漏洞,攻击者可利用该漏洞通过日志注入绕过Spring框架的访问限制从而修改数据。
CVE-2021-22060 MPS-2021-18854
2022-08-08 20:56
Vmware Spring Framework 安全特征问题漏洞
大小写敏感处理不恰当
Vmware Spring Framework是美国威睿(Vmware)公司的一套开源的Java、JavaEE应用程序框架。 Vmware Spring Framework的disallowedFields 模式区分大小写,这意味着除非字段同时列出字段的第一个字符小写,包括属性路径中所有嵌套字段的第一个字符的大写和小写,否则远程攻击者利用该漏洞可以绕过实施的安全限制。
CVE-2022-22968 MPS-2022-1098
2022-08-08 20:56
Apache Groovy 代码注入漏洞
注入
Apache Groovy是美国阿帕奇(Apache)软件基金会的一种基于Java平台面向对象的编程语言,它结合了Python、Ruby和Smalltalk的许多强大的特性。 Apache Groovy 1.7.0版本至2.4.3版本的runtime/MethodClosure.java文件中的MethodClosure类存在安全漏洞。远程攻击者可借助特制的序列化对象利用该漏洞执行任意代码,或造成拒绝服务。
CVE-2015-3253 MPS-2015-3848
2022-08-08 20:56
Apache Log4j 信任管理问题漏洞
证书验证不恰当
Apache Log4j是美国阿帕奇(Apache)基金会的一款基于Java的开源日志记录工具。 Apache Log4j中存在信任管理问题漏洞,该漏洞源于SmtpAppender没有验证主机名称与SMTPS连接的SSL/TLS证书是否匹配。攻击者可通过实施中间人攻击利用该漏洞拦截SMTPS连接,获取日志消息。
CVE-2020-9488 MPS-2020-6684
2022-08-08 20:56
Apache Log4j 安全漏洞
当攻击者对 Log4j 配置具有写访问权限时,Log4j 1.2 中的 JMSAppender 容易受到不受信任数据的反序列化。攻击者可以提供 TopicBindingName 和 TopicConnectionFactoryBindingName 配置,导致 JMSAppender 执行 JNDI 请求,从而以类似于 CVE-2021-44228 的方式执行远程代码。请注意,此问题仅在专门配置为使用 JMSAppender(不是默认设置)时影响 Log4j 1.2。 Apache Log4j 1.2 已于 2015 年 8 月结束生命周期。用户应升级到 Log4j 2,因为它解决了以前版本中的许多其他问题。
CVE-2021-4104 MPS-2021-38359
2022-08-08 20:56
Apache Log4j SQL注入漏洞
SQL注入
根据设计,Log4j 1.2.x 中的 JDBCAppender 接受 SQL 语句作为配置参数,其中要插入的值是来自 PatternLayout 的转换器。消息转换器 %m 可能总是包含在内。这允许攻击者通过将精心制作的字符串输入到记录的应用程序的输入字段或标题中来操纵 SQL,从而允许执行意外的 SQL 查询。请注意,此问题仅在专门配置为使用 JDBCAppender(不是默认设置)时才会影响 Log4j 1.x。从 2.0-beta8 版本开始,重新引入了 JDBCAppender,适当支持参数化 SQL 查询,并进一步自定义写入日志的列。 Apache Log4j 1.2 已于 2015 年 8 月结束生命周期。用户应升级到 Log4j 2,因为它解决了以前版本中的许多其他问题。
CVE-2022-23305 MPS-2022-1444
2022-08-08 20:56
Oracle MySQL Connectors 输入验证错误漏洞
使用不兼容类型访问资源(类型混淆)
Oracle MySQL是美国甲骨文(Oracle)公司的一套开源的关系数据库管理系统。MySQL Connectors是其中的一个连接使用MySQL的应用程序的驱动程序。 Oracle MySQL中的MySQL Connectors组件8.0.15及之前版本的Connector/J子组件存在安全漏洞。攻击者可利用该漏洞控制组件,影响数据的保密性、完整性和可用性。
CVE-2019-2692 MPS-2019-4430
2022-08-08 20:56
Vmware Spring Framework 注入漏洞
输入验证不恰当
Vmware Spring Framework是美国威睿(Vmware)公司的一套开源的Java、JavaEE应用程序框架。该框架可帮助开发人员构建高质量的应用。 Spring Framework 存在注入漏洞,该漏洞源于通过日志注入绕过 Spring Framework 的访问限制,以更改数据。
CVE-2021-22096 MPS-2021-18890
2022-08-08 20:56
Oracle MySQL Connectors输入验证错误漏洞
授权机制不恰当
Oracle MySQL是美国甲骨文(Oracle)公司的一套开源的关系数据库管理系统。MySQL Connectors是其中的一个连接使用MySQL的应用程序的驱动程序。Oracle MySQL Connectors (组件: Connector/J) 8.0.27及之前版本存在输入验证错误漏洞。攻击者可利用该漏洞通过多种协议进行网络访问,从而破坏Oracle MySQL Connectors,导致Oracle MySQL Connectors被接管。
CVE-2022-21363 MPS-2021-36587
2022-08-08 20:56
Apache Log4j 代码问题漏洞
反序列化
CVE-2020-9493 发现了 Apache Chainsaw 中存在的反序列化问题。在 Chainsaw V2.0 之前,Chainsaw 是 Apache Log4j 1.2.x 的一个组件,存在同样的问题。
CVE-2022-23307 MPS-2022-1445
2022-08-08 20:56
Apache Groovy 远程代码执行漏洞
反序列化
Apache Groovy是美国阿帕奇软件基金会的基于Java平台面向对象的编程语言。 Apache Groovy 2.4.4版本至2.4.7版本和1.7.0版本至2.4.3版本中存在远程代码执行漏洞。 攻击者可利用该漏洞进行远程代码执行。
CVE-2016-6814 MPS-2018-0875
2022-08-08 20:56
Apache Log4j 代码问题漏洞
反序列化
Log4j是美国阿帕奇(Apache)软件基金会的一款基于Java的开源日志记录工具。Log4j 1.2版本中包含一个SocketServer类,在未经验证的情况下,该SocketServe类很容易接受序列化的日志事件并对其进行反序列化,在结合反序列化工具使用时,可以利用该类远程执行任意代码。
CVE-2019-17571 MPS-2019-17271
2022-08-08 20:56
MySQL JDBC XXE漏洞
XXE
Oracle MySQL是美国甲骨文(Oracle)公司的一套开源的关系数据库管理系统。 Oracle MySQL 的 MySQL Connectors 产品中存在XXE漏洞,造成漏洞的原因主要是因为getSource方法未对传入的XML格式数据进行检验。导致攻击者可构造恶意的XML数据引入外部实体,造成XXE攻击。攻击者可能利用该漏洞进行任意文件读取。
CVE-2021-2471 MPS-2020-38350
2022-08-08 20:56
Apache Log4j 代码问题漏洞
反序列化
当攻击者对 Log4j 配置具有写访问权限或配置引用攻击者有权访问的 LDAP 服务时,所有 Log4j 1.x 版本中的 JMSSink 都容易受到不受信任数据的反序列化。攻击者可以提供一个 TopicConnectionFactoryBindingName 配置,使 JMSSink 执行 JNDI 请求,从而以类似于 CVE-2021-4104 的方式执行远程代码。请注意,此问题仅在专门配置为使用 JMSSink(不是默认设置)时影响 Log4j 1.x。 Apache Log4j 1.2 已于 2015 年 8 月结束生命周期。用户应升级到 Log4j 2,因为它解决了以前版本中的许多其他问题。
CVE-2022-23302 MPS-2022-1446
2022-08-08 20:56
spring-beans 远程代码执行漏洞(Spring4Shell)
表达式注入
spring-beans 负责实现 Spring 框架的 IOC 模块。 CVE-2010-1622 中曾出现由于参数自动绑定机制导致的问题, 通过黑名单的方式修复了该漏洞,但是 JDK9之后引入了 Module,使得可以通过 getModule 绕过前者的黑名单限制,导致远程代码执行。 org.springframework:spring-beans的5.3.0 至 5.3.17、5.2.0.RELEASE 至 5.2.19.RELEASE 版本都受到影响。
CVE-2022-22965 MPS-2022-6820
2022-08-08 20:56
Oracle MySQL Connectors访问控制错误漏洞
使用候选路径或通道进行的认证绕过
Oracle MySQL是美国甲骨文(Oracle)公司的一套开源的关系数据库管理系统。该数据库系统具有性能高、成本低、可靠性好等特点。MySQL Connectors是其中的一个连接使用MySQL的应用程序的驱动程序。 Oracle MySQL Connectors存在访问控制错误漏洞。攻击者可利用该漏洞控制组件,影响数据的保密性、完整性和可用性。
CVE-2018-3258 MPS-2018-13771
2022-08-08 20:56
没有更多内容
加载失败,请刷新页面
点击加载更多
加载中
下一页
0 评论
7 收藏
分享
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部