SpringBoot项目通常配合TKMybatis或MyBatis-Plus来做数据的持久化。

对于单表的增删改查,TKMybatis优雅简洁,无需像传统mybatis那样在mapper.xml文件里定义sql。

我们目前的项目呢,有一些数据分析的需求,涉及到多表关联、嵌套子查询等复杂的sql。

那么,TKMybatis是不是可以支持手写sql呢?

答案是yes!

我们知道,springboot集成tk-mybatis需添加2个依赖:

<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>2.1.5</version>
</dependency> <dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper</artifactId>
<version>4.1.5</version>
</dependency>

执行dependency:tree时查看依赖关系,可以看到mapper-spring-boot-starter.jar同时依赖了org.mybatis。

[INFO] +- tk.mybatis:mapper-spring-boot-starter:jar:2.1.5:compile
[INFO] | +- org.springframework.boot:spring-boot-starter-jdbc:jar:2.1.7.RELEASE:compile
[INFO] | | +- com.zaxxer:HikariCP:jar:3.2.0:compile
[INFO] | | \- org.springframework:spring-jdbc:jar:5.1.9.RELEASE:compile
[INFO] | +- org.mybatis:mybatis:jar:3.4.6:compile
[INFO] | +- org.mybatis:mybatis-spring:jar:1.3.2:compile
[INFO] | +- tk.mybatis:mapper-core:jar:1.1.5:compile
[INFO] | +- tk.mybatis:mapper-base:jar:1.1.5:compile
[INFO] | +- tk.mybatis:mapper-weekend:jar:1.1.5:compile
[INFO] | +- tk.mybatis:mapper-spring:jar:1.1.5:compile
[INFO] | +- tk.mybatis:mapper-extra:jar:1.1.5:compile
[INFO] | \- tk.mybatis:mapper-spring-boot-autoconfigure:jar:2.1.5:compile

那么,在springboot项目里,如果要实现mybatis那样的在mapper文件里手写sql,如下几步轻松搞定。

1)application.yml里:

mybatis:
mapper-locations: classpath:mapper/*.xml
configuration:
map-underscore-to-camel-case: true
type-aliases-package: com.draft.entity

2)在resources/mapper目录下创建 SpiderDraftsMapper.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="com.draft.dao.SpiderDraftsMapper">
<resultMap id="columnMap" type="com.draft.entity.SpiderDrafts">
<result column="order_id" property="orderId" jdbcType="VARCHAR"/>
<result column="interest_days" property="interestDays"/>
<result column="draft_owner" property="draftOwner"/>
</resultMap>
<select id="getfoo" resultMap="columnMap">
select * from spider_drafts
where order_id in(select order_id from spider_draft)
</select>
<select id="getfoo1" resultType="com.draft.entity.SpiderDrafts">
select interest_days, order_id as orderId,draft_owner from spider_drafts
where order_id in(select order_id from spider_draft)
</select>
</mapper>

3)在com.draft.entity包下,创建pojo实体类 SpiderDrafts.java(可以用代码生成器生成):

package com.draft.entity;

import lombok.Data;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
import java.io.Serializable; @Data
//@Table(name = "spider_drafts")
@Entity
public class SpiderDrafts implements Serializable {
// @Column(name = "interest_days")
private String interestDays;
private String orderId;
private String draftOwner;
}

4)数据访问接口类统一定义在com.draft.dao包下,项目启动程序直接通过@MapperScan("com.draft.dao")来进行扫描。 如下是SpiderDraftsMapper.java:

package com.draft.dao;

import com.draft.entity.SpiderDrafts;
import tk.mybatis.mapper.common.Mapper; import java.util.List; public interface SpiderDraftsMapper extends Mapper<SpiderDrafts> {
List<SpiderDrafts> getfoo(); List<SpiderDrafts> getfoo1();
}

以上几步,完美搞定。单标操作直接用tkmybatis,复杂sql则写在mapper.xml文件里。

注意:getfoo与getfoo1两个方法都是可用的,只是为了测试下划线命名方式的表字段与驼峰式命名的pojo属性的映射(mybatis.configuration.map-underscore-to-camel-case属性),见后文说明。

【几点说明】

1)map-underscore-to-camel-case:
数据库里表的字段是下划线命名,pojo的属性是驼峰命名。打开这个属性可实现这种转换。不用再依靠mybatis那样的resultMap了。
    <resultMap id="columnMap" type="com.draft.entity.SpiderDrafts">
<result column="order_id" property="orderId" jdbcType="VARCHAR"/>
<result column="interest_days" property="interestDays"/>
<result column="draft_owner" property="draftOwner"/>
</resultMap>
数据库里表的字段是下划线命名,pojo的属性是驼峰命名。另外,打开这个属性后,pojo涉及到下划线式字段与驼峰式属性这种对应关系的,就可以去掉@Table和@Column注解。

2)type-aliases-package:

mapper.xml文件中resultMap的type或者parameterType或者resultType会使用程序里定义的pojo,
此时可以用完全限定名来指定这些POJO的引用,例如 <select id="getfoo1" resultType="com.draft.entity.SpiderDrafts">,
又或者你可以通过在 application.yml/application.properties 中指定POJO扫描包来让mybatis自动扫描到POJO,这时mapper.xml里pojo就可以不用带上包名了。

【后记】

这是个新建的工程,在执行dependency:tree查看依赖关系时,maven报错:

[Maven] Project build error: 'packaging' with value 'jar' is invalid. Aggregator projects require 'pom' as packaging.

人家提示了:聚合项目(父级项目)需要用pom作为打包方式。父pom文件得加上配置:

<packaging>pom</packaging>

▄︻┻┳═一参阅:

▄︻┻┳═一SpringBoot项目里,让TKmybatis支持可以手写sql的Mapper.xml文件

▄︻┻┳═一springboot项目集成mybatisplus两部曲

SpringBoot项目里,让TKmybatis支持可以手写sql的Mapper.xml文件的更多相关文章

  1. 闭关修炼180天--手写IOC和AOP(xml篇)

    闭关修炼180天--手写IOC和AOP(xml篇) 帝莘 首先先分享一波思维导图,涵盖了一些Spring的知识点,当然这里并不全面,后期我会持续更新知识点. 在手写实现IOC和AOP之前(也就是打造一 ...

  2. 解决使用intellij idea开发MAVEN项目在target目录下不存在mapper.xml文件

    原 解决使用intellij idea开发MAVEN项目在target目录下不存在mapper.xml文件 原文章链接:https://blog.csdn.net/beauxie/article/de ...

  3. mybatis里的mapper,@Mapper参数,Mapper.xml文件 sql语句Select+where语句

    提示:有不清楚的可以试着看一下我最后的连接,是跟这些内容相关的 Mapper文件,特殊符号: 转义符号 原符号 中文意思 &It; < 小于号 > > 大于号 & & ...

  4. 为什么SpringBoot项目里引入其他依赖不要写版本号

    <dependencies> <dependency> <groupId>org.springframework.boot</groupId> < ...

  5. 从零搭建Spring Boot脚手架(4):手写Mybatis通用Mapper

    1. 前言 今天继续搭建我们的kono Spring Boot脚手架,上一文把国内最流行的ORM框架Mybatis也集成了进去.但是很多时候我们希望有一些开箱即用的通用Mapper来简化我们的开发.我 ...

  6. Hive手写SQL案例

    1-请详细描述将一个有结构的文本文件student.txt导入到一个hive表中的步骤,及其关键字 假设student.txt 有以下几列:id,name,gender三列 1-创建数据库 creat ...

  7. springboot 项目中在普通类中调用dao层的mapper 出现空指针异常

    项目中我遇到同样的问题 特记载一下 有两种方式 一. 该类使用@Component注解 添加一个本类类型的静态字段 创建一个初始化方法,贴上@PostConstruct 标签,用于注入bean 创建方 ...

  8. 一阶段项目 总结 之 两张图片对比 手写 jquery 也可以使用beer slider 插件

    <!DOCTYPE html><html> <head>  <meta charset="utf-8">  <title> ...

  9. 关于项目既要使用ant脚本又要使用maven pom.xml文件的问题

    背景:项目使用的是ant脚本打包,但又需要maven去执行sonar代码扫描.所以项目中既有build.xml又有pom.xml build.xml设置的打包后产物文件夹为target,maven运行 ...

随机推荐

  1. Spring底层源码分析

    Spring 运行原理 Spring 启动时读取应用程序提供的 Bean 配置信息,并在 Spring 容器中生成一份相应的Bean 配置注册表,然后根据这张注册表实例化 Bean,装配好 Bean ...

  2. 大神带你一天了解zabbix(一)

    第15章 Zabbix的搭建 15.1 为什么使用监控服务 对系统实现不间断的监控,实现报警通知(电话,微信,邮件,发短信,手环) 实时反馈系统当前的状态信息 保证服务的可靠安全性 保证业务的稳定运行 ...

  3. Python 入门必学经典知识点笔记【肯定有你不知道的】

    前言本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:实验楼 Python 作为近几年越来越流行的语言,吸引了大量的学员开始学 ...

  4. ubuntu文件权限

    以root身份登录linux. 在某一目录下执行 ls -al,显示类似如下内容: dr-xr-x---. 14 root root 4096 Aug 27 09:38 . dr-xr-xr-x. 2 ...

  5. solr索引基本原理

    solr是一个全局检索引擎,能够快速地从大量的文本数据中选出你所需要的数据,而你只需要提供相应的关键词进行检索.solr的高效率查询靠的是底层强大的索引库,所以solr最关键的技术也是其底层的索引设计 ...

  6. Everspin非易失性MRAM切换技术

    切换MRAM技术 切换MRAM使用1个晶体管,1个MTJ单元来提供简单的高密度存储器.Everspin使用获得专利的Toggle电池设计,可提供高可靠性.数据在温度下20年始终是非易失性的. 在读取期 ...

  7. LeetCode 1290. 二进制链表转整数

    地址 https://www.acwing.com/solution/LeetCode/content/7132/ 题目描述给你一个单链表的引用结点 head.链表中每个结点的值不是 0 就是 1.已 ...

  8. before和after的操作

    before和after,前者是在元素之前插入东西,后者是在元素后面插入东西,但插入的东西不仅仅只是文字而已,还有图标,以及计算器的操作. 由于两者的操作基本一样,这里以before为例 插入文字 & ...

  9. LeetCode刷题总结-树篇(上)

          引子:刷题的过程可能是枯燥的,但程序员们的日常确不乏趣味.分享一则LeetCode上名为<打家劫舍 |||>题目的评论: 如有兴趣可以从此题为起点,去LeetCode开启刷题之 ...

  10. bsoj5988 [Achen模拟赛]期望 题解

    bsoj5988 Description [题目背景] NOI2018 已经过去了许久,2019 届的 BSOIer 们退役的退役,颓废的颓废,计数能力大不如前.曾经的数数之王 xxyj 坦言:&qu ...