SpringBoot集成TkMybatis插件


 

前提:

基於SpringBoot項目,正常集成Mybatis后,為了簡化sql語句的編寫,甚至達到無mapper.xml文件。 在本篇總結教程,不在進行SpringBoot集成Mybatis的概述。 

如有需要,請查看我另一篇文章 SpringBoot集成MyBatis,這里不再贅述。

一. 實現步驟

1. 引入TkMybatis的Maven依賴 2. 實體類的相關配置,@Id,@Table 3. Mapper繼承tkMabatis的Mapper接口 4. 啟動類Application或自定義Mybatis配置類上使用@MapperScan注解掃描Mapper接口 5. 在application.properties配置文件中,配置mapper.xml文件指定的位置[可選] 6. 使用TkMybatis提供的sql執行方法 PS : 1. TkMybatis默認使用繼承Mapper接口中傳入的實體類對象去數據庫尋找對應的表,因此如果表名與實體類名不滿足對應規則時,會報錯,這時使用@Table為實體類指定表。(這種對應規則為駝峰命名規則) 2. 使用TkMybatis可以無xml文件實現數據庫操作,只需要繼承tkMybatis的Mapper接口即可。 3. 如果有自定義特殊的需求,可以添加mapper.xml進行自定義sql書寫,但路徑必須與步驟4對應。 6. 如有需要,實現mapper.xml自定義sql語句 

二. 實現細節

2.1 引入TkMybatisMaven依賴
        <!-- https://mvnrepository.com/artifact/tk.mybatis/mapper -->
        <dependency>
            <groupId>tk.mybatis</groupId>
            <artifactId>mapper</artifactId>
            <version>4.0.3</version> </dependency> <!-- https://mvnrepository.com/artifact/tk.mybatis/mapper-spring-boot-starter --> <dependency> <groupId>tk.mybatis</groupId> <artifactId>mapper-spring-boot-starter</artifactId> <version>2.0.3</version> </dependency> 
2.2 實體類的配置
TkMybatis默認使用繼承Mapper接口中傳入的實體類對象去數據庫尋找對應的表,因此如果表名與實體類名不滿足對應規則時,會報錯,這時使用@Table為實體類指定表。(這種對應規則為駝峰命名規則)
下面以一個實體類Custoemr為例:

package cn.invengo.middleware.base.model;

import java.util.Date;

import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

// @Table指定該實體類對應的表名,如表名為base_customer,類名為BaseCustomer可以不需要此注解
@Table(name = "t_base_customer") public class Customer { // @Id表示該字段對應數據庫表的主鍵id // @GeneratedValue中strategy表示使用數據庫自帶的主鍵生成策略. // @GeneratedValue中generator配置為"JDBC",在數據插入完畢之后,會自動將主鍵id填充到實體類中.類似普通mapper.xml中配置的selectKey標簽 @Id @GeneratedValue(strategy = GenerationType.IDENTITY,generator = "JDBC") private Long id; private String name; private String code; private String status; private String linkman; private String linkmanPhone; private String remark; private String attr01; private String attr02; private String attr03; private Date createDate; private Date lastUpdate; private Long creater; private Long lastUpdateMan; getter(),setter()方法省略... } 
2.3 Mapper繼承tkMabatisMapper接口
import cn.base.model.Customer;
import tk.mybatis.mapper.common.Mapper;

/**   
 * @ClassName:  CustomerMapper   
 * @Description:TODO(Customer數據庫操作層)   
 * @author: wwj
 * @date:   2018年8月31日 上午10:12:20 */ public interface CustomerMapper extends Mapper<Customer> { } 
 
01.png
2.4 啟動類Application或自定義Mybatis配置類上使用@MapperScan注解掃描Mapper接口
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.context.web.SpringBootServletInitializer; import tk.mybatis.spring.annotation.MapperScan; @SuppressWarnings("deprecation") @SpringBootApplication @MapperScan("cn.base.mapper") public class MiddlewareApplication extends SpringBootServletInitializer { private static Logger logger = LoggerFactory.getLogger(MiddlewareApplication.class); public static void main(String[] args) { SpringApplication.run(MiddlewareApplication.class, args); logger.info("Application Start Success!"); } // 當SpringBoot項目打成war包發布時,需要繼承SpringBootServletInitializer接口實現該方法 @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { return builder.sources(Application.class); } } 
2.5 application.properties配置mapper.xml配置文件的掃描路徑
mybatis.mapperLocations=classpath*:cn/base/mapper/*.xml
2.6 使用TkMybatis提供的sql執行方法
import java.util.List;
import java.util.Objects;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import cn.invengo.middleware.base.mapper.CustomerMapper;
import cn.invengo.middleware.base.model.Customer;
import cn.invengo.middleware.base.service.BaseCustomerService;
import tk.mybatis.mapper.entity.Example;
import tk.mybatis.mapper.entity.Example.Criteria;

@Service
@Transactional
public class BaseCustomerServiceImpl implements BaseCustomerService {

    @Autowired
    private CustomerMapper customerMapper;

    @Override
    public List<Customer> selectByEntity(Customer customer) {
        if(Objects.isNull(customer)) {
            customer = new Customer();
        }
        Example example = new Example(Customer.class);
        Criteria criteria = example.createCriteria();
        criteria.andEqualTo(customer);
        return customerMapper.selectByExample(example);
    }

    @Override
    public int insertSelective(Customer customer) {
        return customerMapper.insertSelective(customer);
    }

    @Override
    public int updateSelectiveById(Customer record) {
        return customerMapper.updateByPrimaryKeySelective(record);
    }
}
 
02.png
2.7 如有需要,自定義mapper.xml配置文件,完成自定義sql編寫
ps:
1. 大多數復雜的需求,都能通過TkMyBatis的組合完成操作。這里以聯表查詢為例,自定義mapper.xml的sql編寫。 2. 該mapper.xml與以往普通方式的mapper.xml文件不同之處在於,這里不需要使用resultMap進行字段的映射。當然如果想在返回的Map中新增返回字段映射直接添加新的字段即可。 使用tkmybatis,在數據模型修改之后,修改代碼也較為簡便,只需要修改對應實體類中的字段即可。 eg: ContainerMapper.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="cn.invengo.middleware.base.mapper.ContainerMapper"> <select id="selectCodeByDeviceId" parameterType="java.lang.Long" resultType="java.lang.String"> SELECT c.`code` FROM `t_base_container` c LEFT OUTER JOIN t_base_device d ON c.id = d.container_id WHERE d.id = #{deviceId,jdbcType=BIGINT}; </select> </mapper> ps:這里需要注意的是,不要自己在mapper.xml中在書寫tkMybatis已經有的一些基礎方法了,否則會報錯提示方法重復。 

本篇總結到此結束。



作者:明天你好向前奔跑
鏈接:https://www.jianshu.com/p/50449dde7f2b
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權並注明出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM