ccmapper 一个可以自定义通用sqlmapper小框架
ccmapper 一个可以自定义通用sqlmapper小框架
天地的星空 发表于10个月前
ccmapper 一个可以自定义通用sqlmapper小框架
  • 发表于 10个月前
  • 阅读 19
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

摘要: mybatis 单表

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>
共有 人打赏支持
粉丝 2
博文 4
码字总数 1925
×
天地的星空
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: