文档章节

开源中式dao(micro-dao)

杰睿宁
 杰睿宁
发布于 2017/12/19 17:46
字数 1470
阅读 25
收藏 2

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

开源地址

https://github.com/jeffreyning/MicroDao

MicroDao相对mybatis的优点:

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

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<T>实现对实体bean(在泛型中设置)的标准增删改查功能

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

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

关于结果映射:

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

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

关于分页:

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

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

关于插入时自增id返回: 使用MicroCommonMapper通用插入方法时,通过实体bean带回自增id。 使用sql时,通过IdHolder对象带出自增id。使用mapper模式时接口方法中传入IdHolder按照自增id处理。

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;

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数据源。

    <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>
    </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>          

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

© 著作权归作者所有

杰睿宁

杰睿宁

粉丝 9
博文 21
码字总数 15442
作品 10
东城
私信 提问
中式 dao 和 orm 框架 - MicroDao

micro-dao中式dao和orm框架 MicroDao为了解决mybatis固有缺陷,进行全新封装的dao框架,功能覆盖mybatis,且比mybatis更灵活。 MicroDao同时支持mysql和oracle MicroDao相对mybatis的优点: ...

杰睿宁
2017/12/26
711
0
脚本化微服务开源框架 - NHMicro

MVC 框架的缺点: 系统按照Controller、Service、Dao层次划分,虽然在建设初期技术结构清晰。但每个业务逻辑代码都分散到不同代码框,业务结构不直观,不利于后期业务重构。 业务代码与MVC技...

杰睿宁
2017/06/23
3K
5
NHMicro 1.1.7 发布,支持 MVC 各层代码热部署

NHMicro 1.1.7 已发布,该版本添加了 micro-mvc 模块。 micro-mvc框架,借助 nhmicro 框架和 groovy 技术使所有的 controller、servicebean、dao 和 sql 脚本都支持动态热部署和调试。 详见:...

杰睿宁
2018/01/12
922
4
使用nhmicro提供的micro-datasource嵌入式的解决微服务架构中分布式事务问题

应用原理:使用micro-datasource数据源使事务与线程解耦,通过groupid在其他线程进行事务提交或回滚。多个系统需要统一提交时,通过activemq发送提交消息(含有groupid),各系统收到消息后进...

杰睿宁
2017/10/31
108
3
micro-mvc技术说明

micro-mvc框架,借助nhmicro框架和groovy技术使所有的controller、servicebean、dao和sql脚本都支持动态热部署和调试。 Controller层Controller层groovy中使用注解MicroUrlMapping设置url地址...

杰睿宁
2018/01/12
229
0

没有更多内容

加载失败,请刷新页面

加载更多

58. 静态工厂方法

参考:https://www.jianshu.com/p/ceb5ec8f1174 https://www.jianshu.com/p/fa15f63d399a 1.定义 用一个静态方法来对外提供自身实例的方法,即为我们所说的静态工厂方法(Static factory met...

20190513
9分钟前
4
0
Mybatis之StatementHandler

mybatis-3.4.6.release. 图1 StatementHandler是对CallableStatement、PreparedStatement、Statement的统一封装,在JDK中CallableStatement继承PreparedStatement,PreparedStatement继承Sta......

克虏伯
28分钟前
5
0
遇到API安全问题怎么办?F5 API加固解决方案怎么样?

  在各种APP泛滥的现在,背后都有同样泛滥的API接口在支撑,其中鱼龙混杂,直接裸奔的WEB API大量存在,安全性令人堪优在以前都采用自已定义的接口和结构,对于公开访问的接口,专业点的都会做...

梅丽莎好
51分钟前
10
0
迁Aliyun Redis踩坑之路 - 实践总结

背景: 从自建 redis(CacheCloud)到迁移到 aliyun redis 1. 踩“坑”一 问题: 平常小伙伴们在项目中可能用到redis key expire nofity的场景(比如:处理延时任务等),但是发现迁移后 ke...

少年与海
今天
3
0
干货:Kibana 可视化ElasticSearch数据展示分析

当你把数据存入ES中后,怎么更方面的查看这些数据,还想用不同的维度去看这些数据,是不是纠结,不能再专门搞个后台显示把。这里有神器 Kibana 专门干这个事情的,可以帮你把ES中的数据,通过...

枕邊書
今天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部