zoukankan      html  css  js  c++  java
  • SpringBoot与jdbcTemplate结合遇到的一些问题

    问题设计的关键类及方法:

    如下
    
    @Repository(value = "bardao")//value的作用在于给该Bean(BarDao)命名
    public class BarDao {
    
    public static final Log LOGGER = LogFactory.getLog(Application.class);
    
    @Autowired
    private JdbcTemplate jdbcTemplate;
    //如下方法是首先先数据库里面插入一条记录
    
    public Bar add(Bar bar) {
    String sql = "insert into bar(Id, Age, Address) values(?, ?, ?)";
    LOGGER.info(
    "bar.gerId() is " + bar.getId());
    //jdbcTemplate
    = new JdbcTemplate();//这样做的目的是问了解决jdbcTemplate无法注入而使得jdbcTemplate=null临时采用的一种办法,详见问题1
    System.
    out.println("jdbcTemplate:"+jdbcTemplate);//通过应用程序上下文的方式,在获取bardao这个bean的时候则可以实现自动注入,通过@Autowire这个注解使得jdbcTemplate自动注入
    Integer num = jdbcTemplate.update(sql, bar.getId(), bar.getAge(), bar.getAddress()); System.out.println("num:"+num); return bar; } }

    问题1:使用@Autowired标注时,jdbcTemlate==null;

    原因:经过自己的测试之后发现,不在注解@Autowired本身,而在于包含该JdbcTemlate的Bean(BarDao)生成实例的方式。

      1.如果采用new 方式来生成实例,则会出现null的情况。new方式:BarDao bd = new BarDao();、

    public void test(){
    Bar bar = new Bar(1, 34, "天堂岛");
    BarDao bd = new BarDao();
    bd.add(bar);
    }

    对应add方法

    public Bar add(Bar bar) {
    String sql = "insert into bar(Id, Age, Address) values(?, ?, ?)";
    LOGGER.info("bar.gerId() is " + bar.getId());
    jdbcTemplate = new JdbcTemplate();//不这样做jdbcTemplate==null
    System.out.println("jdbcTemplate:"+jdbcTemplate);//通过应用程序上下文的方式获取bardao这个bean的时候则可以实现自动注入
    Integer num = jdbcTemplate.update(sql, bar.getId(), bar.getAge(), bar.getAddress()); System.out.println("num:"+num); return bar; } }

    解决:如果采用应用程序上下文获取bean的方式,则不会出现null的情况。通过应用程序上下文获取bean的方式:  

    public void test(){
    Bar bar = new Bar(1, 34, "天堂岛");
    BarDao bd = (BarDao) SpringContextUtil.getBean("bardao");
    bd.add(bar);
    }

           注:点击查看SpringContextUtil工具类代码  

    对应add方法

    public Bar add(Bar bar) {
    String sql = "insert into bar(Id, Age, Address) values(?, ?, ?)";
    LOGGER.info("bar.gerId() is " + bar.getId());
    System.out.println("jdbcTemplate:"+jdbcTemplate);//jdbcTemplate实现了自动注入,所以jdbcTemplate != null
    Integer num = jdbcTemplate.update(sql, bar.getId(), bar.getAge(), bar.getAddress()); System.out.println("num:"+num); return bar; } }

    问题2:出现 java.lang.IllegalArgumentException: No DataSource specified

    原因:是基于上一个问题而出现的。大概是这样,使用了new方式来生成实例,导致jdbcTemplate无法注入使得JdbcTemplate=null。这时我便急中生智,既然等于空,那我就同样new一个jdbcTemplate不就行了。其实在这样做的时候,我也在想一个问题,我在jdbcTemplate上标注的那个@Autowired注解有何用?但没办法,此时我没有其他更好的办法了,于是我就这样试了一试。我抱着一丝的残念,祈祷上苍,结果就是出现了No dataSource specified这个异常。

    解决:方式就是第一个问题的解决方式。

  • 相关阅读:
    postman调试参数格式
    Dapper.Contrib.Extensions扩展
    kafka dashborad 安装流程(kafka_exporter + prometheus + grafana)
    Kafka学习入门(windows环境下)
    Windows环境下载安装Kafka
    Windows环境下Zookeeper的安装及启动
    hdu4087(概率dp)
    poj3162(树形dp+线段树)
    Gym
    牛客小白月赛13 小A的柱状图(单调栈)
  • 原文地址:https://www.cnblogs.com/studyCenter/p/6734294.html
Copyright © 2011-2022 走看看