Skip to content

单个Mapper模式

什么是单个Mapper模式? 以往我们都是一个实体类对应一个Mapper,这样有的人会反感;现在支持了单个Mapper模式,意味着你可以一个Mapper 到处使用!!!

1.如何使用单个Mapper ?

写一个接口继承BasicMapper

java
public interface MybatisBasicMapper extends BasicMapper {

}

spring 实例化MyBasicMapper

java
@MapperScan(basePackageClasses = MybatisBasicMapper.class, markerInterface = BasicMapper.class)

solon 实例化 MyBasicMapper

yaml
mybatis.master:
  mappers:       #支持包名 或 类名(大写开头 或 *)或 xml(.xml结尾);支持目录 ** 或 * 占位符
    - "xxx.MyBasicMapper"

启动时,设置单Mapper的类

java
XbatisConfig.setSingleMapperClass(MybatisBasicMapper.class);

2.Dao实现类 由DaoImpl 改成 BasicDaoImpl(没有Dao层,这个忽略)

java

@Repository
public class SysRoleDaoImpl extends BasicDaoImpl<SysRole, Integer> implements SysRoleDao {

    @Autowired
    public SysRoleDaoImpl(MybatisBasicMapper mybatisBasicMapper) {
        super(mybatisBasicMapper);
    }

    @Override
    protected MybatisBasicMapper getMapper() {
        return (MybatisBasicMapper) this.mapper;
    }

}

3.开始使用

3.1有dao的和原来没太多区别

@Autowired
private AppVersionDao appVersionDao;

3.2 mapper 使用 看下面

4 mapper 使用

4.1 自动注入

@Autowired
private MybatisBasicMapper mybatisBasicMapper;

4.2 使用

mybatisBasicMapper.save(T);
mybatisBasicMapper.update(T);

部分需要实体类的例如 deleteById getById的

mybatisBasicMapper.deleteById(AppVersion.class,1);
mybatisBasicMapper.getById的(AppVersion.class,1);

4.3 QueryChain怎么使用basicMapper?

不仅仅QueryChain,其他XXChain 也是一样的

QueryChain.of(mybatisBasicMapper, AppVersion .class).eq(AppVersion::getId,1);

4.4 如果sq太复杂 我需要在xml里写,怎么处理

xml

<mapper namespace="xxx.MybatisBasicMapper">
    <select id="xmlTest" resultType="com.xbatis.core.test.DO.SysRole">
        select *
        from sys_role
        where id >= #{id}
          and id &lt;= #{id2}
        order by id asc
    </select>
</mapper>
java
public interface MybatisBasicMapper extends BasicMapper {
    //可以写自己的方法了
    List<SysRole> xmlTest(@Param("id1") Integer id1, @Param("id2") Integer id1);
}

or

//注意 你的xml ID应该为 SysRole:query 参数可以是Map或者对象 都可以
mybatisBasicMapper.withSqlSession(SysRole.class, "query", new HashMap() {{
    put("id", 1);
    put("id2", 2);
}}, (statement, params, sqlSession) -> {
    return sqlSession.selectList(statement, params);
});

然后直接用就可以了 (xml自动分页什么的,其他框架支持的都支持)

5: 代码生成器怎么弄?

mapperConfig 这里 enable 设置为 false 即可;

.mapperConfig(mapperConfig -> {mapperConfig.enable(false).superClass(MybatisBasicMapper.class);})

注意 需要代码生成器 1.0.6 版本 才支持