Skip to content

Mybatis

用于增强手写 SQL 灵活性,基于 mybatis-mapper 封装。

TIP

目前为本地插件,稳定后考虑单独发布包。

安装

bash
pnpm install --save @vivy-common/mybatis

开始

示例应用

导入模块

ts
// app.module.ts
import { Module } from '@nestjs/common'
import { MybatisModule } from '@vivy-common/mybatis'

@Module({
  imports: [
    MybatisModule.forRoot({
      cwd: __dirname,
      globs: ['**/*.mapper.xml'],
    }),
  ],
})
export class AppModule {}
json
// nest-cli.json
{
  "$schema": "https://json.schemastore.org/nest-cli",
  "collection": "@nestjs/schematics",
  "sourceRoot": "src",
  "compilerOptions": {
    "assets": ["**/*.mapper.xml"],
    "watchAssets": true
  }
}

使用

以上导入的配置将会加载所有的 *.mapper.xml 文件,使用 namespaceid 属性区分语句。更多语法参考 mybatis-mapper 文档。

xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="fruit">
  <select id="basic">
    SELECT
      name,
      category,
      price
    FROM
      fruits
    WHERE
      category = #{category}
  </select>
</mapper>

我们可以创建一个 mapper 层,用于处理SQL语句和结果便于在 service 层使用。

ts
import { Injectable } from '@nestjs/common'
import { InjectDataSource } from '@nestjs/typeorm'
import { MybatisService } from '@vivy-common/mybatis'
import { DataSource } from 'typeorm'

@Injectable()
export class GenMapper {
  constructor(
    @InjectDataSource()
    private dataSource: DataSource,
    private mybatisService: MybatisService
  ) {}

  async basic(category: string): Promise<any[]> {
    const sql = this.mybatisService.getSql('fruit', 'basic', {
      category,
    })
    const result = this.dataSource.query(sql)
    return result
  }
}

API

Config API