文档章节

ccmapper 一个可以自定义通用sqlmapper小框架

天地的星空
 天地的星空
发布于 2017/02/15 15:36
字数 746
阅读 29
收藏 0

ccmapper讲解(使用mybatis)

主要解决问题

  • 单表的简单sql重复编码或者重复生成xml代码
  • 单表重复java的sqlApi接口代码

cmaper的使用表现形式


@Autowired
private CustomAnnoMapper<OrgAnno> orgAnnoCustomAnnoMapper;

@Autowired
private CustomAnnoMapper<UserAnno> userAnnoCustomAnnoMapper;

UserAnno userAnno = userAnnoCustomAnnoMapper.getId(xx)
OrgAnno orgAnno = orgAnnoCustomAnnoMapper.getId(xx)

原理篇

需要解决的问题

  • 数据库表和bean的映射问题
  • 通用接口和具体接口的映射问题
  • sql生成映射到具体接口上的问题

解决办法

  • 第一个问题通过有多种解决方法
  • persistence标准注解
  • 属性名和字段名一致
  • 希望任意定制这种映射关系
  • 第二个问题

可以通过接口继承来实现

  • 第三个问题

通过泛型和mybatis的xxxProvider注解来实现

ccmapper原理

  • 自己写的通用mapper
	public interface SimpleCommonMapper<T> {

	@SelectProvider(type = SimpleMapperSqlProvider.class, method = "getById")
		public T getById(Object key);

	}

  • ccmapper会在项目启动时通过javassist动态生成一个具体泛型接口如下,并将这个mapper注入到Spring中
public interface SimpleCommonMapper<User> {

	@SelectProvider(type = SimpleMapperSqlProvider.class, method = "getById")
		public User getById(Object key);

	}
  • 然后看看 MapperSqlProvider如何定义
public abstract class AbstractSqlProvider {
	protected Class<?> beanClazz;
	public AbstractSqlProvider(String className){
		。。。
	}
}

只要你继承上面这个这个类会动态的将SimpleCommonMapper上面的泛型User类或者其他的类似传递到这里

ccmapper的使用

当然我们使用ccmapper的并不需要每一步自己去写。ccmapper已经内置了2套SQLAPi

下面我们介绍下内置的注解api的使用

首先我们介绍下CustomCommonSqlProvider

这个类内置了一些通用的单表增删改查sql拼接

public class CustomCommonSqlProvider extends AbstractSqlProvider {

	protected Map<String, String> propertyAndColumnMap = new HashMap<String, String>();
	protected String tableName;
	protected String primaryKey;

	public CustomCommonSqlProvider(String className) {
		super(className);
	}

	public String insert(Object o) {
		BEGIN();
		INSERT_INTO(tableName);
		for (String propertyName : propertyAndColumnMap.keySet()) {
			VALUES(propertyAndColumnMap.get(propertyName), "#{" + propertyName + "}");
		}
		return SQL();
	}

	....

我们注解sqlAPI依托上面这个类来写更加方便,我们需要做的就是注解SqlProvider继承上面这个类,然后通过注解规则映射出上面的3个属性就可以使用上面那个类里面的sql生成方法了,当然你也可以自己写。取决于个人爱好

public class CustomAnnoDynamicMapperSqlProvider extends CustomCommonSqlProvider {
....具体代码看ccmapper的com.ccmapper.customanno.CustomAnnoDynamicMapperSqlProvider这个类

现在我们写一下通用mapper

public interface CustomAnnoMapper<T> {

	@InsertProvider(type = CustomAnnoDynamicMapperSqlProvider.class, method = "insert")
	public void insert(T t);

	@UpdateProvider(type = CustomAnnoDynamicMapperSqlProvider.class, method = "updateNotNullByPrimaryKey")
	public void updateNotNull(T t);

	@SelectProvider(type = CustomAnnoDynamicMapperSqlProvider.class, method = "selectListByExample")
	public List<T> getListByExample(Example example);
	
	....
}

具体api看源代码, 我们可以看到Example example 这个也是一个内置的动态查询api。。模仿(Mapper这个插件Api写的。)

现在我们已经有了SqlProvider和通用Mapper 是时候注入结合Spring了。。ccmapper内置类一个非常好用的扫描和注入Spring的类

<!-- baseBeanPackage和beanClasssList可以配合使用也可以单独使用 2项必填一项 -->
    <bean class="com.ccmapper.core.CommonBeanDefinitionRegistry">
    	<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
        <property name="baseBeanPackage" value="com.demo.annobean"></property>
        <!-- commonMapper和sqlProvider必填 -->
        <property name="commonMapper" value="com.ccmapper.customanno.CustomAnnoMapper"></property>
        <property name="sqlProvider" value="com.ccmapper.customanno.CustomAnnoDynamicMapperSqlProvider"></property>
    </bean>

© 著作权归作者所有

共有 人打赏支持
天地的星空
粉丝 1
博文 6
码字总数 1925
作品 0
海淀
程序员
私信 提问
星空倒影/ccmapper

ccmapper 用来自定义通用mapper的工具集(可以自己定义通用mapper的sql方法) 注: 参考了 mapper插件的API。。。 。。 原理 动态生成泛型子接口,并注入到spring中 核心只有2个类。。。Mappe...

星空倒影
2016/06/14
0
0
Mybatis 通用 Mapper 3.0.0 发布

MyBatis通用Mapper3 极其方便的使用Mybatis单表的各种通用方法 Mapper 3.0.0更新日志: 将EntityMapper和SqlMapper移出,现在是独立项目EntityMapper 将Mapper全部接口方法拆分为独立接口,方...

Liuzh_533
2015/06/05
6.5K
8
MyBatis直接执行SQL的工具SqlMapper

可能有些人也有过类似需求,一般都会选择使用其他的方式如Spring-JDBC等方式解决。 能否通过MyBatis实现这样的功能呢? 为了让通用Mapper更彻底的支持多表操作以及更灵活的操作,在2.2.0版本...

Liuzh_533
2015/03/11
0
14
Mybatis 通用 Mapper 2.2.0 发布

Mybatis通用Mapper 极其方便的使用Mybatis单表的增删改查 2.2.0 新增SqlMapper,可以使用MyBatis直接执行sql,详细文档 2.2.0版本之后,通过SqlMapper可以支持多表的操作,但是需要在代码中直...

Liuzh_533
2015/03/11
2.2K
7
Mybatis 通用 Mapper 2.3.1 发布

Mybatis通用Mapper 极其方单表的增删改查 2.3.1 完善所有和PrimaryKey有关的通用查询 修复Mapper接口中updateByPrimaryKey操作会更新主键的bug 修复Mapper接口中使用Example查询的时候,条件...

Liuzh_533
2015/04/13
4.9K
13

没有更多内容

加载失败,请刷新页面

加载更多

Docker默认的网络模式

Docker默认的网络模式:Bridge模式 该模式会为每个容器分配Network Namespace子系统,会自动给每个容器虚拟出自己的网卡、IP、网关、路由等信息,无需手工添加。 5分钟玩转 Docker Bridge...

吴伟祥
16分钟前
2
0
Docker方式部署Github监控系统Hawkeye

0.系统环境 CentOS Linux release 7.6.1810 (Core)|Python 2.7.5|2018年10月12日版Hawkeye step1:docker安装 见:https://my.oschina.net/guiguketang/blog/1843594 step2:安装mongodb #vim ......

硅谷课堂
24分钟前
1
0
混合模型---logistic模型的混合

专家混合

中国龙-扬科
27分钟前
3
0
自定义参数校验注解 (实现ConstraintValidator方法)

Hibernate Validator常用注解(图网上找的) 2.自定义校验器 a.注解类 @Target({FIELD, METHOD, PARAMETER, ANNOTATION_TYPE})@Retention(RUNTIME)@Documented@Constraint(validatedB......

INSISTQIAO
31分钟前
1
0
Integer 实现

Integer 封装类型,参数传递传的是值,不是引用 内带缓存,-128 到127 -128 到127 直接数值 IntegerCache 如果不在这个范围,才会new Integer () public static Integer valueOf(int ...

Java搬砖工程师
31分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部