• 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这个异常。

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

  • 相关阅读:
    sqlite数据库的char,varchar,text,nchar,nvarchar,ntext的区别(转)
    DELPHI XE5-8 弹出列表框供选择
    delphi弹出选择对话框选择目录|SelectDirectory 函数(转)
    php 与java安卓客户端的查询交互
    sql查询语句的拼接小技巧(高手勿喷)
    高德地图应用——与云图后台交互
    Inno Setup 通用脚本及简要说明( 一般情况够用了)
    不用SQL给打印记录编号
    DELPHI XE5/6/7 android 无线真机调试
    超级简单的例子说明JAVA PACKET CLASS 和变量之间的关系
  • 原文地址:https://www.cnblogs.com/studyCenter/p/6734294.html
Copyright © 2020-2023  润新知