千家信息网

microdao开源框架的实例分析

发表于:2025-02-07 作者:千家信息网编辑
千家信息网最后更新 2025年02月07日,microdao开源框架的实例分析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。MicroDao中式DaoMicroDa
千家信息网最后更新 2025年02月07日microdao开源框架的实例分析

microdao开源框架的实例分析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

MicroDao中式Dao
MicroDao为了解决mybatis固有缺陷,进行全新封装的dao框架,功能覆盖mybatis,且比mybatis更灵活。
MicroDao同时支持mysql和oracle
代码开源地址:https://github.com/jeffreyning/MicroDao

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注解说明对应的表名称
br/>使用@MicroTableName注解说明对应的表名称

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进行管理

                                                                                                                                    default                                                                                                                                            default                                        mysql                                                                                                                                                                                                                                                                                                                                                                                          

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);    }}

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注行业资讯频道,感谢您对的支持。

接口 实体 脚本 支持 数据 查询 注解 配置 方法 模式 实例 功能 名称 数据源 段落 框架 参数 字段 对象 插件 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 网络安全生产年度工作总结 重庆万盛食堂配送软件开发 青岛辅德网络技术有限公司 战地1不用等待进去就开的服务器 一个可以上传图片的服务器多少钱 敦化市热力站自动化控制软件开发 成都软件开发真心青岗科技 网络道德与网络安全的教学设计 软件开发师的晋升 啤酒工艺软件开发 下载 期货软件开发你要多少费啊 招嫖软件开发 驾驶指纹被录入数据库 世界能源数据库 数据库 提高cpu使用率 齐鲁网络安全专业本硕连读 网络技术资源共享什么意思 安卓软件开发常见问题 北京第八空间网络技术 并购融资的数据库 国外服务器一年多少钱 软件开发要做哪些准备 银行数据库面试题目 北京惠普服务器虚拟化价格 分子生态网络技术 数据库技术与应用主要学什么 有网络为什么无法连接到服务器 平板电脑服务器超时 linux文件和数据库交互 武汉三里桥服务器
0