microdao开源框架的实例分析
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/" rel="nofollow">br/>使用@MicroTableName注解说明对应的表名称<br/使用@MicroMappingAnno注解说明对应的字段名称
packagecom.github.jeffreyning.test.dto;importcom.nh.micro.orm.MicroMappingAnno;importcom.nh.micro.orm.MicroTableName;@MicroTableName(name="micro_test")publicclassMicroTest{@MicroMappingAnno(name="id")privateStringid;@MicroMappingAnno(name="meta_key")privateStringmetaKey;@MicroMappingAnno(name="meta_name")privateStringmetaName;@MicroMappingAnno(name="meta_type")privateStringmetaType;publicStringgetId(){returnid;}publicvoidsetId(Stringid){this.id=id;}publicStringgetMetaKey(){returnmetaKey;}publicvoidsetMetaKey(StringmetaKey){this.metaKey=metaKey;}publicStringgetMetaName(){returnmetaName;}publicvoidsetMetaName(StringmetaName){this.metaName=metaName;}publicStringgetMetaType(){returnmetaType;}publicvoidsetMetaType(StringmetaType){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注解,决定底层切换哪个数据源进行操作。可以用此功能实现读写分离。
packagecom.github.jeffreyning.test.dao;importjava.util.List;importjava.util.Map;importcom.github.jeffreyning.test.dto.MicroTest;importcom.nh.micro.dao.mapper.ListInnerClass;importcom.nh.micro.dao.mapper.MicroCommonMapper;importcom.nh.micro.orm.MicroDbName;importcom.nh.micro.template.IdHolder;@MicroDbName(name="default")publicinterfaceTestRepextendsMicroCommonMapper<MicroTest>{publicintupdateInfoByNhs(MicroTestmicroTest);publicintinsertInfoByNhs(MapparamMap,IdHolderidHolder);@ListInnerClass(name=MicroTest.class)publicListqueryInfoByUserName(Stringname);publicListqueryInfoByUserAge(MapparamMap);}
3,编写sql脚本
脚本文件为txt格式但必须以.nhs作为文件名后缀(如:TestRep.nhs)
设置段落<%! <sql id="xxxx"> %> xxxxxxxx <%! </sql> %>
段落id需与接口方法名相同。
段落不区分select还是update,统一用sql标识。
逻辑判断部分类似jsp用<% some script %>表示
与mybatis一样参数值使用#{} ${}两种方式引用
应用时必须以paramArray开始,paramArray是一个数组与接口参数数据对应。
set字符拼接时,首个逗号会在框架内部自动删除,不需要做额外处理。
/*查询*/<%!<sqlid="queryInfoByUserName">%>select*frommicro_testtleftjoinmicro_useruont.user_id=u.user_idwhere1=1<%if(paramArray[0]!=null){%>andu.user_namelike'%${paramArray[0]}%'<%}%><%!</sql>%><%!<sqlid="queryInfoByUserAge">%>select*frommicro_testtleftjoinmicro_useruont.user_id=u.user_idwhere1=1<%if(paramArray[0].get("user_age")!=null){%>andu.user_age>=#{paramArray[0].user_age}<%}%><%!</sql>%>/*插入*/<%!<sqlid="insertInfoByNhs">%>insertintomicro_test(id,meta_key)values(#{paramArray[0].id},#{paramArray[0].meta_key})<%!</sql>%>/*更新*/<%!<sqlid="updateInfoByNhs">%>updatemicro_testset<%if(paramArray[0].metaKey!=null){%>,meta_key=#{paramArray[0].metaKey}<%}%><%if(paramArray[0].metaName!=null){%>,meta_name=#{paramArray[0].metaName}<%}%>whereid=#{paramArray[0].getId()}<%!</sql>%>
4,在spring中配置扫描sql脚本和接口
配置NhsInitUtil用来加载sql脚本,其中rulePath是脚本根目录路径。
配置BeanScannerConfigurer用来加载mapper接口,其中scanPath是接口根目录路径.
MicroDao内部需要使用jdbctemplate。
配置microDbHolder是MicroDao内部用来设置并在读写分离时切换多个数据源(jdbctemplate)的机制,至少配置一个default数据源。
其中dbTypeMap属性用来配置数据源类型可填写mysql或oracle
关于事务:
仍使用spring事务机制TransactionManager进行管理
<beanid="dataSource"class="com.alibaba.druid.pool.DruidDataSource"destroy-method="close"><propertyname="url"value="jdbc:mysql://localhost:3306/test"/><propertyname="username"value="root"/><propertyname="password"value="root"/></bean><beanid="jdbcTemplate"class="org.springframework.jdbc.core.JdbcTemplate"><propertyname="dataSource"ref="dataSource"/></bean><beanid="microDbHolder"class="com.nh.micro.db.MicroDbHolder"lazy-init="false"><propertyname="dbHolder"><map><entry><key><value>default</value></key><refbean="jdbcTemplate"></ref></entry></map></property><propertyname="dbTypeMap"><map><entry><key><value>default</value></key><value>mysql</value></entry></map></property></bean><beanclass="com.nh.micro.nhs.NhsInitUtil"init-method="initGroovyAndThread"lazy-init="false"><propertyname="fileList"><list><beanclass="com.nh.micro.rule.engine.core.GFileBean"><propertyname="ruleStamp"value="true"></property><propertyname="jarFileFlag"value="true"></property><propertyname="dirFlag"value="true"></property><propertyname="rulePath"value="/groovy/"></property></bean></list></property></bean><beanclass="com.nh.micro.dao.mapper.scan.BeanScannerConfigurer"><propertyname="scanPath"value="com.github.jeffreyning.test.dao"></property></bean><!--配置platformtransactionmanager--><beanid="txManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><propertyname="dataSource"ref="dataSource"/></bean><!--声明式事物管理,配置事物管理advice--><tx:adviceid="txAdvice"transaction-manager="txManager"><tx:attributes><!--methodstartswith'get'areread-only--><tx:methodname="get*"read-only="true"/><!--methodstartswith'insert/update'userequiredpropagation--><tx:methodname="add*"propagation="REQUIRED"/><tx:methodname="insert*"propagation="REQUIRED"/><tx:methodname="update*"propagation="REQUIRED"/><!--othermethodusedefaulttransactionsetting--><tx:methodname="*"/></tx:attributes></tx:advice><!--配置事物管理advice作用范围与作用条件--><aop:config><aop:pointcutid="serviceLayerTransaction"expression="execution(*com.github.jeffreyning.test.dao.*..*(..))"/><aop:advisorpointcut-ref="serviceLayerTransaction"advice-ref="txAdvice"/></aop:config>
5,使用mapper出的dao实例操作数据库
packagecom.github.jeffreyning.test;importjava.util.HashMap;importjava.util.List;importjava.util.Map;importorg.springframework.context.ApplicationContext;importorg.springframework.context.support.ClassPathXmlApplicationContext;importcom.github.jeffreyning.test.dao.TestRep;importcom.github.jeffreyning.test.dto.MicroTest;importcom.nh.micro.dao.mapper.DefaultPageInfo;importcom.nh.micro.dao.mapper.MicroPageInfo;importcom.nh.micro.template.IdHolder;publicclassTestMicroDao{/***@paramargs*@throwsException*/publicstaticvoidmain(String[]args)throwsException{ApplicationContextac=newClassPathXmlApplicationContext("applicationContext.xml");TestReptestRep=(TestRep)ac.getBean("testRep");/*根据实体bean创建*/MicroTestmicroTest=newMicroTest();microTest.setMetaKey("t1");microTest.setMetaName("test1");testRep.createInfoMapper(microTest);Stringid=microTest.getId();/*根据实体bean的example分页查询*/DefaultPageInfopageInfo=newDefaultPageInfo();Listlist=testRep.getInfoList4PageMapper(null,pageInfo);Longtotal=pageInfo.getTotal();System.out.println(list.toString());System.out.println("total="+total);/*根据实体bean的example查询*/Listalllist=testRep.getInfoListAllMapper(null,"");System.out.println(alllist.toString());/*根据实体bean的Id查询*/MicroTesttempBean=testRep.getInfoByIdMapper(id);System.out.println(tempBean.toString());/*根据实体bean更新记录*/tempBean.setMetaName("test12");testRep.updateInfoMapper(tempBean);/*根据实体bean的id删除记录*/testRep.delInfoByIdMapper(id);/*根据sql插入*/MapparamMap=newHashMap();paramMap.put("meta_key","test123");paramMap.put("meta_name","123");IdHolderidHolder=newIdHolder();testRep.insertInfoByNhs(paramMap,idHolder);ObjectidObj=idHolder.getIdVal();System.out.println("id="+idObj.toString());/*根据sql更新*/MicroTestbean1=newMicroTest();bean1.setId(idObj.toString());bean1.setMetaName("newname");testRep.updateInfoByNhs(bean1);/*根据sql联合查询*/Stringname="tom";Listlist2=testRep.queryInfoByUserName(name);System.out.println(list2.toString());/*根据sql联合查询*/MappMap=newHashMap();pMap.put("user_age",20);Listlist3=testRep.queryInfoByUserAge(pMap);System.out.println(list3.toString());}}
template模式技术说明
通过继承MicroMapperTemplate<T>实现针对实体bean的增删改查操作和sql操作
packagecom.github.jeffreyning.test.temp;importcom.github.jeffreyning.test.dto.MicroTest;importcom.nh.micro.dao.mapper.MicroMapperTemplate;publicclassdemoDaoextendsMicroMapperTemplate<MicroTest>{publicMicroTestgetInfo(Stringid)throwsException{returngetInfoByIdMapper(id);}}
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。
推荐阅读
-
polyfills怎么按需加载
polyfills怎么按需加载本篇内容主要讲解“polyfills...
-
C#数据类型怎么实现背包、队列和栈
-
C#怎么实现冒泡排序和插入排序算法
C#怎么实现冒泡排序和插入排序算法这篇文章主要讲解了“C#怎么实现...
-
C#如何实现希尔排序
-
C#如何实现归并排序
-
C#怎么使用符号表实现查找算法
-
C#类的静态成员怎么用
C#类的静态成员怎么用这篇“C#类的静态成员怎么用”文章的知识点大...
-
C#的静态函数怎么用
C#的静态函数怎么用这篇文章主要讲解了“C#的静态函数怎么用”,文...
-
C#中的析构函数怎么用
C#中的析构函数怎么用这篇文章主要讲解了“C#中的析构函数怎么用”...
-
怎么用CZGL.ProcessMetrics监控.NET应用