文档章节

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

天地的星空
 天地的星空
发布于 2017/02/15 15:36
字数 746
阅读 25
收藏 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
5.7K
8
Mybatis 通用 Mapper 2.2.0 发布

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

Liuzh_533
2015/03/11
2.1K
7
MyBatis直接执行SQL的工具SqlMapper

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

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

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

Liuzh_533
2015/04/13
4.9K
13

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Ubuntu18.04 显卡GF-940MX安装NVIDIA-390.77

解决办法: 下面就给大家一个正确的姿势在Ubuntu上安装Nvidia驱动: (a)首先去N卡官网下载自己显卡对应的驱动:www.geforce.cn/drivers (b)下载后好放在英文路径的目录下,怎么简单怎么来...

AI_SKI
今天
1
0
深夜胡思乱想

魔兽世界 最近魔兽世界出了新版本, 周末两天升到了满级,比之前的版本体验好很多,做任务不用抢怪了,不用组队打怪也是共享拾取的。技能简化了很多,哪个亮按哪个。 运维 服务器 产品 之间的...

Firxiao
今天
1
0
MySQL 8 在 Windows 下安装及使用

MySQL 8 带来了全新的体验,比如支持 NoSQL、JSON 等,拥有比 MySQL 5.7 两倍以上的性能提升。本文讲解如何在 Windows 下安装 MySQL 8,以及基本的 MySQL 用法。 下载 下载地址 https://dev....

waylau
今天
0
0
微信第三方平台 access_token is invalid or not latest

微信第三方开发平台code换session_key说的特别容易,但是我一使用就带来无穷无尽的烦恼,搞了一整天也无济于事. 现在记录一下解决问题的过程,方便后来人参考. 我遇到的这个问题搜索了整个网络也...

自由的开源
今天
3
0
openJDK之sun.misc.Unsafe类CAS底层实现

注:这篇文章参考了https://www.cnblogs.com/snowater/p/8303698.html 1.sun.misc.Unsafe中CAS方法 在sun.misc.Unsafe中CAS方法如下: compareAndSwapObject(java.lang.Object arg0, long a......

汉斯-冯-拉特
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部