天天看點

mybatis檢測mysql表是否存在

1、優先使用information_schema來檢查,如果沒有查詢這個的權限則使用show tables來檢查。

mapper:

import java.util.Map;

import org.apache.ibatis.annotations.Param;

/**
 * 通用的mapper
 * @author yangzl
 * @data 2019年4月8日
 *
 */
public interface CommonMapper {
    /**
     * 使用information_schema檢查表是否存在
     * @param tableSchema
     * @param tableName
     * @return
     */
    Integer checkTableExistsWithSchema(@Param("tableSchema")String tableSchema, @Param("tableName")String tableName);
    
    /**
     * 使用show tables檢查表是否存在
     * @param tableName
     * @return
     */
    Map<String, String> checkTableExistsWithShow(@Param("tableName")String tableName);
}      

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.yangzhilong.mapper.CommonMapper">
    <select id="checkTableExistsWithSchema"
        resultType="java.lang.Integer">
        SELECT COUNT(1) FROM information_schema.tables WHERE
        table_schema=#{tableSchema} AND table_name = #{tableName}
    </select>

    <select id="checkTableExistsWithShow"
        resultType="java.util.Map">
        show tables like #{tableName}
    </select>
</mapper>      

通用service:

package com.yangzhilong.service;

import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import com.yangzhilong.mapper.CommonMapper;

import lombok.extern.slf4j.Slf4j;

@Service
@Slf4j
public class CommonService {
    private static final String TABLE_SCHEMA = "ad_engine";
    @Autowired
    private CommonMapper commonMapper;
    
    /**
     * 檢查表是否存在
     * @param tableName
     * @return
     */
    public boolean checkTableExists(String tableName) {
        try {
            Integer count = commonMapper.checkTableExistsWithSchema(TABLE_SCHEMA, tableName);
            return count == 1;
        } catch (Exception e) {
            log.error("使用information_schema檢測表失敗", e);
            Map<String, String> list = commonMapper.checkTableExistsWithShow(tableName);
            if(!CollectionUtils.isEmpty(list)) {
                return true;
            }
        }
        
        return false;
    }
}