写点什么

Mybatis in Springboot

作者:Kevin_913
  • 2023-10-08
    广东
  • 本文字数:1977 字

    阅读完需:约 6 分钟

目前 springboot 里面用的很广的一个 ORM 框架就是 mybatis,没有采用 mybatis-plugin,因为有些复杂的 SQL 还是自己写会更合适,更倾向于使用一个模板例如用 golang 的 template 生成基础语言,例如 domain,controller,service,mapper 等等,不过这个是题外话了,这篇文章是记录在使用 mybatis 过程中,关于一些常用功能的 tips,这样可以在 springboot3.x 里面更好的使用 mybatis。


1、引入 mybatis。

        <dependency>            <groupId>org.mybatis.spring.boot</groupId>            <artifactId>mybatis-spring-boot-starter</artifactId>            <version>${mybatis.version}</version>        </dependency>
复制代码


2、关于配置,目前网络上各种教程,还是要以官方文档,避免走弯路,https://mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure/,以下是一个常见配置

mybatis:  type-handlers-package: com.kevin.dailytimer.mapper.handler  configuration:    map-underscore-to-camel-case: true
logging: level: com.kevin.dailytimer.mapper: debug
复制代码
  • map-underscore-to-camel-case:在数据库中通常用"_"来作为单词分隔符,而代码中通常采用驼峰规则,这个配置用来将"_"字段映射到驼峰规则,减少 resultmap 的配置。

  • type-handlers-package:用来处理一些代码中特殊的字段,例如枚举,对象等。

  • logging.level.mapperpackage: 设置日志规则,debug 将会输出 SQL 语句。


3、关于 TypeHandler,下面是一个将 object 存到 PG 的 jsonb 字段的 handler,你可以使用你自己的 json 转换插件转换对象。

@MappedTypes(value = {ReportData.class})public class JsonTypeHandler<T> extends BaseTypeHandler<T> {    private final Class<T> clazz;    public JsonTypeHandler(Class<T> clazz) {        this.clazz = clazz;    }    @Override    public void setNonNullParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException {        ObjectMapper mapper = new ObjectMapper();        try {            ps.setObject(i, mapper.writeValueAsString(parameter));        } catch (JsonProcessingException e) {            throw new RuntimeException(e);        }
} @Override public T getNullableResult(ResultSet rs, String columnName) throws SQLException { return convertStringToObject(rs.getString(columnName)); } @Override public T getNullableResult(ResultSet rs, int columnIndex) throws SQLException { return convertStringToObject(rs.getString(columnIndex)); } @Override public T getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { return convertStringToObject(cs.getString(columnIndex)); } public T convertStringToObject(String rts) { ObjectMapper mapper = new ObjectMapper(); try { if (rts == null) { return null; } return mapper.readValue(rts, clazz); } catch (JsonProcessingException e) { throw new RuntimeException(e); } }}
复制代码
  • MappedTypes: 指定哪些对象需要使用这个 mapperhandler。


4、在 springboot 中基本采用注解方式来使用 mybatis,下面是一些常用的功能 tips:

  • 返回数据库自增 ID,这里以 PG 为例,使用 @Select 代替 @Insert,添加一个 @Options 的注解,设置 id 匹配规则,示例:

    @Select("insert into report(user_id,report_data,created_date) " +            "values(#{domain.userId}, #{domain.reportData}::jsonb,#{domain.createdDate}) returning id")    @Options(useGeneratedKeys=true, keyProperty="id", keyColumn="id")
复制代码
  • 在注解中使用 foreach,if 等 xml 中配置关键字,需要用<script>包住 SQL 语句,以及对于一些特殊符号进行转义,例如<,>等,示例:

    @Select("<script>" +            "select r.user_id as userId, name, count from (" +            "select user_id, count(1) as count from completed_task " +            "where completed_date &gt;=#{startDate} and completed_date &lt;=#{endDate} " +            "and category in " +            "<foreach item='ctg' collection='categories' open='(' separator=',' close=')'>#{ctg}</foreach> " +            "group by user_id order by count desc, max(completed_date) desc " +            ") as r " +            "left join user_info ui on r.user_id=ui.user_id " +            "order by count desc" +            "</script>")
复制代码


发布于: 刚刚阅读数: 6
用户头像

Kevin_913

关注

纸上得来终觉浅,绝知此事要躬行。 2019-02-25 加入

专注于代码和设计15+年。 主要涉及Java,Golang,云平台。

评论

发布
暂无评论
Mybatis in Springboot_Java_Kevin_913_InfoQ写作社区