Skip to content

DaoSupport 使用

DaoSupport 概述

  • daosupport 是在 mybaits 的基础上进一步做了封装,使用更便捷。共用 dao 实现,不需要为每个实体类写一个各自的 dao,封装单表的增删改查功能。

  • 对于每个表的 statement 映射分为标准 statement 映射(Mapper.xml)和扩展 statement 映射(Mapper_ext.xml ),每个表都有对应的两个 statement 映射文件,放在 classpath 资源文件的 mapper 文件下,由 comet-mybatis-generator 生成,标准映射文件(Mapper.xml)不允许手动修改,如果要添加文件中不存在的 sql 映射,可以在扩展文件(Mapper_ext.xml)中添加。

  • 对数据库操作结果可以实现框架级别的缓冲,可以选择的是否需要对表的数据库操作进行缓冲,这里在表所对应的实体类(Po )上面添加注解 @TableType(name="", value=TableTypeEnum.PARAM) 来表明该表进行缓冲处理。

  • 对 mybaits 的分页查询进行修改,mybaits 实现的分页查询是逻辑上的分页查询,效率不高。这里通过拦截器的形式实现了物理上的分页查询,增加了分页查询的效率。

  • 对数据库中数据的行锁定进行了封装。

  • sql 映射的文件中所有的 sql 都是基本的增删改语句,对于分页、排序等操作会通过拦截器进行拼装;可以选择了不同的数据库类型的拦截器(目前有 mysql、db2、oracle),减少了业务代码与数据源的耦合性。

注解介绍

@TableType

该注解用在数据库表对应的实体类(po)上,它有两个参数:

  • name(String) 表名,表示该实体类所对应的表;
  • value(String) 表类型,表示该表的类型。目前有分为三种类型:
    • TableTypeEnum.LEVEL 表示该表是水平分库表, 会根据分库算法以及分库键进行分库操作。
    • TableTypeEnum.PARAM 表示该表是参数表,使用 sharding 多数据源的时候,操作该表走的是默认数据库,而且该表的数据操作会放入缓存中来增加效率。
    • TableTypeEnum.UPRIGHT 表示该表是垂直分库表,使用 sharding 多数据源的时候,操作该表走的是默认数据库。

注意

如果在使用 sharidng 多数据源时候,表所对应的实体类 po 没有使用该注解,那么在对该表进行单表操作的时候,数据库操作的时候走的数据库是默认数据库,但是进行多表关联查询时,分开就会有问题,因此默认所有 po 都设置该注解。

例如:

java
@TableType(name = "CIF_SIGNATORY", value = TableTypeEnum.LEVEL)
public class CifSignatoryPo extends BaseCifPo {

}

表示 CIF_SIGNATORY 表所对应的实体类,该表是水平表,操作该表的时候会根据分库算法和分库键进行分库路由。

@TablePk

该注解用在数据库表对应的实体类(po)的字段上,表示该字段对应表中的字段是主键。该注解有一个参数:

  • index(int) 主键的顺序,在对参数表(注解 @TableType(value=TableTypeEnum.PARAM))的数据进行操作的时候,会将数据放入缓冲,而缓存键值对的 key 就是根据 @TablePk 中主键的 index 顺序组合而成。

例如:

在实体 po 类中的某个字段:

java
@TablePk(index=1)
private String clientNo;

表示 clientNo 所对应的列是表的主键。

基本用法

引入依赖

在联机处理和批处理模块中,在代码类中通过 spring 容器自动注入 DaoSupport 的依赖。

java
@Autowired private 
DaoSupport daoSupport;

保存数据

java
CifClientBlockPo cifClientBlockPo = new CifClientBlockPo();
cifClientBlockPo.setClientNo(clientNo);
daoSupport.insert(cifClientBlockPo);
//会将cifClientBlockPo中的数据插入到相应的数据库标中。

单条查询

  • DaoSupport 会根据传入的映射对象 po,选择并执行其对应的 sql 映射语句 例如单条查询:
java
CifClientBlockPo cifClientBlockPo = new CifClientBlockPo();
cifClientBlockPo.setClientNo(clientNo);
daoSupport.selectOne(cifClientBlockPo);

daoSupport.selectOne 会根据传入的 po 对象 cifClientBlockPo 中不为 null 的字段作为 sql 查询条件进行查询 clientBlockPo;返回的结果为符合条件的数据。

多条查询

java
CifClientBlockPo cifClientBlockPo = new CifClientBlockPo();
cifClientBlockPo.setClientNo(clientNo);
daoSupport.selectList(cifClientBlockPo);

daoSupport.selectList 会根据传入的 po 对象 cifClientBlockPo 中不为 null 的字段作为 sql 查询条件进行查询,返回的结果为符合条件的数据。

简单删除操作

java
CifClientBlockPo cifClientBlockPo = new CifClientBlockPo();
cifClientBlockPo.setClientNo(clientNo);
daoSupport.delete(cifClientBlockPo);

daoSupport.delete 会根据传入的 po 对象 cifClientBlockPo 中不为 null 的字段作为 sql 条件进行删除,返回的结果为删除的条数。

简单更新操作

java
CifClientBlockPo where = new CifClientBlockPo();
cifClientBlockPo.setClientNo(“333”);
CifClientBlockPo value = new CifClientBlockPo();
cifClientBlockPo.setClientNo(“123”);
daoSupport.update(value,where);

daoSupport.update 会将 where 中不为 null 的字段作为更新条件,value 中不为 null 的字段作为更新后的数据,返回的结果为更新的条数。

自定义 sql

DaoSupport 中的基本方法会调用通过 comet 的映射工具生成的 sql 映射文件执行相应的 sql 语句,此外还可以自定义 sql 语句进行扩展,自定义的 sql 语句要定义在相应实体类的映射文件中,例如 BatchContextPo 实体对应两个 sql 映射文件 BatchContextMapper.xml(标准 sql 文件,由工具类生成,不允许修改)、BatchContextMapper_ext.xml(自定义扩展 sql 文件,扩展的 sql 语句可定义在该文件中)。

例如在 BatchContextMapper_ext.xml 中增加了一条扩展 select sql 语句:

xml
<select id="selectTest"  resultMap="BaseResultMap">
	...........
</select>

可以通过 daoSupport.selectList(BatchContextMapper.class.getClassname() + "selectTest", param) 会调用 selectTest 对应的 sql 语句,第二个参数为执行 sql 的入参。