幽兰生空谷
--绝世独自开

在工具类(非controlled、service)静态static方法中使用JdbcTemplate

场景:

在工具类中使用下面这种注解注入,是不能用static方法调用的,

@Autowired
@Qualifier("ncJdbcTemplate")
private JdbcTemplate jdbcTemplate;

@Autowired 注解不能注入使用static修饰的实例。

解决方案:

使用手工装配,并在resources目录下配置url.properties文件,写入数据源信息

package com.yonyou.occ.b2b.sync.nc;

import com.alibaba.druid.pool.DruidDataSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;

import java.io.InputStream;
import java.util.Properties;

/**
 * 静态方法调用 JdbcTemplateStaticUtils ,使用手工配置,自动配置对 static 不生效
 */
@Component
public class JdbcTemplateStaticUtils {

    private static final Logger logger = LoggerFactory.getLogger(JdbcTemplateStaticUtils.class);

    private static Properties props = loadProperties();

    private static Properties loadProperties() {
        Properties properties = new Properties();
        try (InputStream in = JdbcTemplateStaticUtils.class.getClassLoader().getResourceAsStream("url.properties")) {
            if (in == null) {
                logger.error("url.properties not found.");
                throw new IllegalStateException("url.properties not found.");
            }
            properties.load(in);
        } catch (Exception e) {
            logger.error("Failed to load properties.", e);
            throw new IllegalStateException("Failed to initialize properties.", e);
        }
        return properties;
    }

    /**
     * 手工配置数据源
     * @return 数据源
     */
    public static DruidDataSource ncDataSource() {
        String driverClassName = props.getProperty("spring.datasource.nc.driver");
        String url = props.getProperty("spring.datasource.nc.url");
        String username = props.getProperty("spring.datasource.nc.username");
        String password = props.getProperty("spring.datasource.nc.password");

        DruidDataSource druidDataSource = new DruidDataSource();
        druidDataSource.setDriverClassName(driverClassName);
        druidDataSource.setUrl(url);
        druidDataSource.setUsername(username);
        druidDataSource.setPassword(password);

        return druidDataSource;
    }

    /**
     * 根据处理ID,查询转换前仓库ID
     * @param handleId
     * @return
     */
    public static String getCbodyWarehouseIdByHandleId(String handleId) {
        DruidDataSource druidDataSource = ncDataSource();
        JdbcTemplate jdbcTemplate = new JdbcTemplate(druidDataSource);

        String sql = "SELECT DISTINCT c.cbodywarehouseid FROM ic_transform_b c WHERE c.dr = 0 AND NVL(c.vbdef5, '~') <> '~' AND c.vbdef5 = ?";
        try {
            return jdbcTemplate.queryForObject(sql, new Object[]{handleId}, String.class);
        } catch (Exception e) {
            logger.error("Failed to query warehouse ID by handle ID.", e);
            return null;
        }
    }

    /**
     * 测试调用接口
     * @param args
     */
    public static void main(String[] args) {
        String handleId = "a9e72f2f-0819-48dc-9097-0d69ad708039";
        String cbodyWarehouseIdByHandleId = getCbodyWarehouseIdByHandleId(handleId);
        System.out.println("cbodyWarehouseIdByHandleId: " + cbodyWarehouseIdByHandleId);
    }
}

tip:网上还提供了下面这种方法,不知为何我用了却不生效,放这里参考一下

    @Autowired
    private NcDataQueryService ncDataQueryService;

    public static JdbcTemplateStaticUtils jdbcTemplateStaticUtils;

    @PostConstruct
    public void init() {
        jdbcTemplateStaticUtils = this;
        jdbcTemplateStaticUtils.ncDataQueryService = ncDataQueryService;
    }
public static void main(String[] args) {
        Integer i = jdbcTemplateStaticUtils.ncDataQueryService.queryDaysFormNc();
        System.out.println(i);
    }
赞(1) 打赏
版权声明:本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
文章名称:《在工具类(非controlled、service)静态static方法中使用JdbcTemplate》
文章链接:http://www.itheibai.com/archives/1538
免责声明:根据《计算机软件保护条例》第十七条规定“为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。”您需知晓本站所有内容资源均来源于网络,仅供用户交流学习与研究使用,版权归属原版权方所有,版权争议与本站无关,用户本人下载后不能用作商业或非法用途,需在24个小时之内从您的电脑中彻底删除上述内容,否则后果均由用户承担责任;如果您访问和下载此文件,表示您同意只将此文件用于参考、学习而非其他用途,否则一切后果请您自行承担,如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
本站是非经营性个人站点,所有软件信息均来自网络,所有资源仅供学习参考研究目的,并不贩卖软件,不存在任何商业目的及用途,网站会员捐赠是您喜欢本站而产生的赞助支持行为,仅为维持服务器的开支与维护,全凭自愿无任何强求。

评论 抢沙发

评论前必须登录!

 

养成“打赏”的好习惯,从我做起!

非常感谢你的打赏,我们将继续给力更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫

微信扫一扫

登录

找回密码

注册