microdao開源框架的實例分析,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
成都創(chuàng)新互聯(lián)主要從事網(wǎng)站建設(shè)、網(wǎng)站制作、網(wǎng)頁設(shè)計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)永年,十余年網(wǎng)站建設(shè)經(jīng)驗,價格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):18980820575
MicroDao中式Dao
MicroDao為了解決mybatis固有缺陷,進行全新封裝的dao框架,功能覆蓋mybatis,且比mybatis更靈活。
MicroDao同時支持MySQL和oracle
代碼開源地址:https://github.com/jeffreyning/MicroDao
MicroDao相對mybatis的優(yōu)點:
1,sql腳本支持修改后熱部署實時生效。
2,bean與數(shù)據(jù)庫字段映射關(guān)系,通過注解設(shè)置到bean中,不必在sql腳本中體現(xiàn)。
3,sql腳本支持類似jsp的寫法,且不必區(qū)分select、update使用不同標簽,更加靈活。
4,不需要使用插件,內(nèi)置支持物理分頁。
5,不需要使用插件,內(nèi)置支持針對bean的標準增刪改查功能。
6,不需要使用插件,內(nèi)置支持讀寫分離,分庫分表。
7,針對mysql5.7支持動態(tài)字段。
支持mapper、template、非orm三種模式支撐業(yè)務(wù)系統(tǒng)
1,mapper指,通過掃描接口,運行時自動生成dao實例;
2,template指,通過繼承template標準父類,生成dao子類;
3,非orm指,直接使用microDao實例,可以執(zhí)行非orm更靈活的數(shù)據(jù)庫操作。
mapper模式技術(shù)說明
1,編寫實體bean使用@MicroTableName注解說明對應(yīng)的表名稱<br/" rel="nofollow">br/>使用@MicroTableName注解說明對應(yīng)的表名稱<br/使用@MicroMappingAnno注解說明對應(yīng)的字段名稱
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>實現(xiàn)對實體bean(在泛型中設(shè)置)的標準增刪改查功能
接口的方法名如updateInfoByNhs會映射為sql腳本中段落名稱
接口參數(shù)個數(shù)和類型均無限制
關(guān)于結(jié)果映射:
查詢單條記錄是,如果接口設(shè)置的返回值為實體bean則,則自動進行映射。
接口返回值如果是list,可以用@ListInnerClass注解設(shè)置list中實體類,不設(shè)置則按照list<Map>返回
關(guān)于分頁:
分頁的頁數(shù)每頁的記錄數(shù),查詢出總記錄數(shù),均通過DefaultPageInfo對象帶入帶出。
使用mapper模式時接口方法中帶有DefaultPageInfo對象時自動進行分頁處理。
關(guān)于插入時自增id返回:
使用MicroCommonMapper通用插入方法時,通過實體bean帶回自增id。
使用sql時,通過IdHolder對象帶出自增id。使用mapper模式時接口方法中傳入IdHolder按照自增id處理。
關(guān)于讀寫分離:
通過在接口中設(shè)置@MicroDbName注解,決定底層切換哪個數(shù)據(jù)源進行操作。可以用此功能實現(xiàn)讀寫分離。
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)
設(shè)置段落<%! <sql id="xxxx"> %> xxxxxxxx <%! </sql> %>
段落id需與接口方法名相同。
段落不區(qū)分select還是update,統(tǒng)一用sql標識。
邏輯判斷部分類似jsp用<% some script %>表示
與mybatis一樣參數(shù)值使用#{} ${}兩種方式引用
應(yīng)用時必須以paramArray開始,paramArray是一個數(shù)組與接口參數(shù)數(shù)據(jù)對應(yīng)。
set字符拼接時,首個逗號會在框架內(nèi)部自動刪除,不需要做額外處理。
/* 查詢 */ <%! <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內(nèi)部需要使用jdbctemplate。
配置microDbHolder是MicroDao內(nèi)部用來設(shè)置并在讀寫分離時切換多個數(shù)據(jù)源(jdbctemplate)的機制,至少配置一個default數(shù)據(jù)源。
其中dbTypeMap屬性用來配置數(shù)據(jù)源類型可填寫mysql或oracle
關(guān)于事務(wù):
仍使用spring事務(wù)機制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實例操作數(shù)據(jù)庫
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"); /*根據(jù)實體bean 創(chuàng)建*/ MicroTest microTest=new MicroTest(); microTest.setMetaKey("t1"); microTest.setMetaName("test1"); testRep.createInfoMapper(microTest); String id=microTest.getId(); /*根據(jù)實體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); /*根據(jù)實體bean的example 查詢*/ List alllist=testRep.getInfoListAllMapper(null, ""); System.out.println(alllist.toString()); /*根據(jù)實體bean的Id 查詢*/ MicroTest tempBean=testRep.getInfoByIdMapper(id); System.out.println(tempBean.toString()); /*根據(jù)實體bean 更新記錄*/ tempBean.setMetaName("test12"); testRep.updateInfoMapper(tempBean); /*根據(jù)實體bean的id 刪除記錄*/ testRep.delInfoByIdMapper(id); /*根據(jù)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()); /*根據(jù)sql 更新*/ MicroTest bean1=new MicroTest(); bean1.setId(idObj.toString()); bean1.setMetaName("new name"); testRep.updateInfoByNhs(bean1); /*根據(jù)sql 聯(lián)合查詢*/ String name="tom"; List list2=testRep.queryInfoByUserName(name); System.out.println(list2.toString()); /*根據(jù)sql 聯(lián)合查詢*/ Map pMap=new HashMap(); pMap.put("user_age", 20); List list3=testRep.queryInfoByUserAge(pMap); System.out.println(list3.toString()); } }
template模式技術(shù)說明
通過繼承MicroMapperTemplate<T>實現(xiàn)針對實體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); } }
看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進一步的了解或閱讀更多相關(guān)文章,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對創(chuàng)新互聯(lián)的支持。
標題名稱:microdao開源框架的實例分析
網(wǎng)頁地址:http://aaarwkj.com/article42/ispdhc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導航、搜索引擎優(yōu)化、網(wǎng)頁設(shè)計公司、微信公眾號、網(wǎng)站營銷、電子商務(wù)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)