中式Dao开源框架(micro-dao)
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,编写实体beanbr/>使用@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<T>实现对实体bean(在泛型中设置)的标准增删改查功能
接口的方法名如updateInfoByNhs会映射为sql脚本中段落名称
接口参数个数和类型均无限制
关于结果映射:
查询单条记录是,如果接口设置的返回值为实体bean则,则自动进行映射。
接口返回值如果是list,可以用@ListInnerClass注解设置list中实体类,不设置则按照list<Map>返回
关于分页:
分页的页数每页的记录数,查询出总记录数,均通过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<MicroTest> { 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)
设置段落<%! <sql id="xxxx"> %> xxxxxxxx <%! </sql> %>
段落id需与接口方法名相同。
段落不区分select还是update,统一用sql标识。
逻辑判断部分类似jsp用<% some script %>表示
与mybatis一样参数值使用#{} ${}两种方式引用
应用时必须以paramArray开始,paramArray是一个数组与接口参数数据对应。
set字符拼接时,首个逗号会在框架内部自动删除,不需要做额外处理。
/* 查询 */ <%! <sql id="queryInfoByUserName"> %> 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]}%' <% } %> <%! </sql> %> <%! <sql id="queryInfoByUserAge"> %> 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} <% } %> <%! </sql> %> /* 插入 */ <%! <sql id="insertInfoByNhs"> %> insert into micro_test(id,meta_key) values( #{paramArray[0].id},#{paramArray[0].meta_key} ) <%! </sql> %> /* 更新 */ <%! <sql id="updateInfoByNhs"> %> 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()} <%! </sql> %>
4,在spring中配置扫描sql脚本和接口
配置NhsInitUtil用来加载sql脚本,其中rulePath是脚本根目录路径。
配置BeanScannerConfigurer用来加载mapper接口,其中scanPath是接口根目录路径.
MicroDao内部需要使用jdbctemplate。
配置microDbHolder是MicroDao内部用来设置并在读写分离时切换多个数据源(jdbctemplate)的机制,至少配置一个default数据源。
其中dbTypeMap属性用来配置数据源类型可填写mysql或oracle
关于事务:
仍使用spring事务机制TransactionManager进行管理
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close"> <property name="url" value="jdbc:mysql://localhost:3306/test" /> <property name="username" value="root" /> <property name="password" value="root" /> </bean> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name = "dataSource" ref="dataSource"/> </bean> <bean id="microDbHolder" class="com.nh.micro.db.MicroDbHolder" lazy-init="false"> <property name="dbHolder"> <map> <entry> <key> <value>default</value> </key> <ref bean="jdbcTemplate"></ref></entry> </map> </property> <property name="dbTypeMap"> <map> <entry> <key> <value>default</value> </key> <value>mysql</value> </entry> </map> </property> </bean> <bean class="com.nh.micro.nhs.NhsInitUtil" init-method="initGroovyAndThread" lazy-init="false"> <property name="fileList"> <list> <bean class="com.nh.micro.rule.engine.core.GFileBean"> <property name="ruleStamp" value="true"></property> <property name="jarFileFlag" value="true"></property> <property name="dirFlag" value="true"></property> <property name="rulePath" value="/groovy/"></property> </bean> </list> </property> </bean> <bean class="com.nh.micro.dao.mapper.scan.BeanScannerConfigurer"> <property name="scanPath" value="com.github.jeffreyning.test.dao"></property> </bean> <!-- 配置platform transaction manager--> <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <!-- 声明式事物管理,配置事物管理advice--> <tx:advice id="txAdvice" transaction-manager="txManager"> <tx:attributes> <!-- method starts with 'get' are read-only--> <tx:method name="get*" read-only="true"/> <!-- method starts with 'insert/update' use required propagation --> <tx:method name="add*" propagation="REQUIRED"/> <tx:method name="insert*" propagation="REQUIRED"/> <tx:method name="update*" propagation="REQUIRED"/> <!-- other method use default transaction setting--> <tx:method name="*"/> </tx:attributes> </tx:advice> <!-- 配置事物管理advice作用范围与作用条件--> <aop:config> <aop:pointcut id="serviceLayerTransaction" expression="execution( * com.github.jeffreyning.test.dao.*..*(..))"/> <aop:advisor pointcut-ref="serviceLayerTransaction" advice-ref="txAdvice"/> </aop:config>
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<T>实现针对实体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<MicroTest> { public MicroTest getInfo(String id) throws Exception { return getInfoByIdMapper(id); } }

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
一次垃圾邮件的分析
上周一(12月4号),朋友给我转发了一封垃圾邮件,邮件里面附带一个word文档,我们俩都是搞信安,自然察觉一丝危险的气味,之前也没有分析过word附件,因而有了今天的分析。 环境:ubuntu 16.04 office软件: LibreOffice writer 1. FBI Warning 分析有风险,请在虚拟机上运行;且在分析之前要禁止word的宏自动运行 2. 邮件截图 3. 邮件分析 可以看到邮件的正文内容,是由一张图片和一个附件组成,其中我们要重点关注的就是。 doc附件有密码,且密码为1115 4. 附件分析 一般分析方法 4.1 一般来说,非打开方式去分析一个word附件,我们一般会选择oletools,但是这是在word文档非加密的情况下,加了密码后无法通过oletools来提取word文档中的宏。 4.2 olevba 提取宏展示 olevba -c xxx.doc -c: 只显示word中的宏代码 -a: 自动分析word是否可疑 加了密码后,就不能用一般的分析方法 4.3 尝试是用olevba来提取文档的vba代码 4.4 关闭宏自动运行的前提下,打开word附件...
- 下一篇
轻松学DDD之一:模型驱动设计
轻松学DDD之一:模型驱动设计 我是2012年开始接触到DDD(领域驱动设计)的, 后续陆陆续续研读过几遍Eric的大作《领域驱动设计:软件核心复杂性应对之道》,也使用DDD重构过一个项目。总的感受是DDD的一些概念比较晦涩难懂,很难掌握,因此想写个系列短文,希望能用通俗易懂的语言帮助大家更轻松更深入地理解DDD。文章很多都是我个人体会和理解,难免有错误,希望大家能及时指正,共同提高。本文是系列短文第一篇,介绍DDD的起始概念模型驱动设计。 1. 软件开发方法回顾 软件开发可以看做是一个把用户需求转换为可正确运行的程序的过程,其中最关键部分是把用户需求转换成代码。我们要学习的DDD实际上就是一种软件开发方法,它相比之前的软件开发方法,能更好地应对软件的核心复杂度。为了能更好的理解它,我们先回顾下之前的软件开发方法及其存在问题。在上世纪60年代,由于需求简单,软件开发以作坊式开发为主。但是随着硬件的飞速发展,软件复杂度也迅速激增,终于在70年引发了软件危机。为了应对危机,业界借鉴成熟生产制造管理方法,发展出以“过程为中心”的瀑布式开发方法。 1.1 瀑布式开发 瀑布式开发把整个软件开发过...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- CentOS6,CentOS7官方镜像安装Oracle11G
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS7设置SWAP分区,小内存服务器的救世主
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS关闭SELinux安全模块
- SpringBoot2整合Thymeleaf,官方推荐html解决方案