Appearance
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 的入参。