文档章节

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

天地的星空
 天地的星空
发布于 2017/02/15 15:36
字数 746
阅读 24
收藏 0
点赞 0
评论 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
博文 4
码字总数 1925
作品 0
海淀
程序员
星空倒影/ccmapper

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

星空倒影 ⋅ 2016/06/14 ⋅ 0

Mybatis 通用 Mapper 3.0.0 发布

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

Liuzh_533 ⋅ 2015/06/05 ⋅ 8

MyBatis直接执行SQL的工具SqlMapper

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

Liuzh_533 ⋅ 2015/03/11 ⋅ 14

Mybatis 通用 Mapper 2.2.0 发布

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

Liuzh_533 ⋅ 2015/03/11 ⋅ 7

Mybatis 通用 Mapper 2.3.1 发布

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

Liuzh_533 ⋅ 2015/04/13 ⋅ 13

Mybatis 通用 Mapper 2.3.2 发布

Mybatis通用Mapper 极其方单表的增删改查 2.3.2 解决Example查询中in,notin无效的bug#24 如果你使用Maven,只需要添加如下依赖: com.github.abel533 mapper 2.3.2 如果你想引入Jar包,你可以...

Liuzh_533 ⋅ 2015/04/22 ⋅ 0

Mybatis 通用 Mapper 2.3.0 发布

Mybatis通用Mapper 极其方便的使用Mybatis单表的增删改查 2.3.0 Mapper接口和EntityMapper都增加了selectOne方法,该查询返回值最多只能有一个,存在多个时抛出异常 Mapper接口和EntityMappe...

Liuzh_533 ⋅ 2015/04/07 ⋅ 24

ibatis学习(一)--ibatis介绍以及用例 [转]

介绍 iBATIS是以SQL为中心的持久化层框架。能支持懒加载、关联查询、继承等特性。 iBATIS不同于一般的OR映射框架(eg:hibernate)。OR映射框架,将数据库表、字段等映射到类、属性,那是一种元...

B.H. ⋅ 2012/09/26 ⋅ 0

mybatis直接使用自定义sql查询数据

dao层,增加SqlMapper.java和 对应的SQLMapper.xml 其中,使用 java.util.LinkedHashMap 作为返回类型,可以保持结果集本来的字段顺序。 为了避免出现 :there no getter sql in java.lang....

颖辉小居 ⋅ 2017/09/26 ⋅ 0

Mybatis 分页插件 3.6.3 发布

Mybatis分页插件 - PageHelper 如果你也在用Mybatis,建议尝试该分页插件,这一定是最方便使用的分页插件。 该插件目前支持以下数据库的物理分页: Oracle Mysql MariaDB SQLite Hsqldb Post...

Liuzh_533 ⋅ 2015/03/11 ⋅ 4

没有更多内容

加载失败,请刷新页面

加载更多

下一页

个人博客的运营模式能否学习TMALL天猫质量为上?

心情随笔|个人博客的运营模式能否学习TMALL天猫质量为上? 中国的互联网已经发展了很多年了,记得在十年前,个人博客十分流行,大量的人都在写博客,而且质量还不错,很多高质量的文章都是在...

原创小博客 ⋅ 45分钟前 ⋅ 0

JavaScript零基础入门——(十一)JavaScript的DOM操作

JavaScript零基础入门——(十一)JavaScript的DOM操作 大家好,欢迎回到我们的JavaScript零基础入门。最近有些同学问我说,我讲的的比书上的精简不少。其实呢,我主要讲的是我在开发中经常会...

JandenMa ⋅ 今天 ⋅ 0

volatile和synchronized的区别

volatile和synchronized的区别 在讲这个之前需要先了解下JMM(Java memory Model :java内存模型):并发过程中如何处理可见性、原子性、有序性的问题--建立JMM模型 详情请看:https://baike.b...

MarinJ_Shao ⋅ 今天 ⋅ 0

深入分析Kubernetes Critical Pod(一)

Author: xidianwangtao@gmail.com 摘要:大家在部署Kubernetes集群AddOn组件的时候,经常会看到Annotation scheduler.alpha.kubernetes.io/critical-pod"="",以表示这是一个关键服务,那你知...

WaltonWang ⋅ 今天 ⋅ 0

原子性 - synchronized关键词

原子性概念 原子性提供了程序的互斥操作,同一时刻只能有一个线程能对某块代码进行操作。 原子性的实现方式 在jdk中,原子性的实现方式主要分为: synchronized:关键词,它依赖于JVM,保证了同...

dotleo ⋅ 今天 ⋅ 0

【2018.06.22学习笔记】【linux高级知识 14.4-15.3】

14.4 exportfs命令 14.5 NFS客户端问题 15.1 FTP介绍 15.2/15.3 使用vsftpd搭建ftp

lgsxp ⋅ 今天 ⋅ 0

JeeSite 4.0 功能权限管理基础(Shiro)

Shiro是Apache的一个开源框架,是一个权限管理的框架,实现用户认证、用户授权等。 只要有用户参与一般都要有权限管理,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户...

ThinkGem ⋅ 昨天 ⋅ 0

python f-string 字符串格式化

主要内容 从Python 3.6开始,f-string是格式化字符串的一种很好的新方法。与其他格式化方式相比,它们不仅更易读,更简洁,不易出错,而且速度更快! 在本文的最后,您将了解如何以及为什么今...

阿豪boy ⋅ 昨天 ⋅ 0

Python实现自动登录站点

如果我们想要实现自动登录,那么我们就需要能够驱动浏览器(比如谷歌浏览器)来实现操作,ChromeDriver 刚好能够帮助我们这一点(非谷歌浏览器的驱动有所不同)。 一、确认软件版本 首先我们...

blackfoxya ⋅ 昨天 ⋅ 0

线性回归原理和实现基本认识

一:介绍 定义:线性回归在假设特证满足线性关系,根据给定的训练数据训练一个模型,并用此模型进行预测。为了了解这个定义,我们先举个简单的例子;我们假设一个线性方程 Y=2x+1, x变量为商...

wangxuwei ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部