JdbcTemplate使用遇错误总结(一)

最近学习JDBC的时候,使用到了Spring-Jdbc。遇到了很多的问题。下面总结一下。

1、将普通java项目转化为Maven项目

做法

1、右键项目JDBC-learning,点击Add Framework Support
在这里插入图片描述
往下拉,选择Maven。

2、重要,先换源!

如果你是第一次Maven项目的构建,会下载相关的Maven配置组件。但是默认的下载源为国外,会下载很慢。我们先把IDEA关闭。你要做的是换源!
在安装IDEA的目录下搜索 settings.xml,这个是Maven的配置文件。把下面的镜像内容复制进去

<mirror>  
		<id>alimaven</id>  
	    <mirrorOf>central</mirrorOf>  
	    <name>aliyun maven</name>  
	    <url>http://maven.aliyun.com/nexus/content/repositories/central/</url>  
	</mirror> 

在这里插入图片描述
然后为了保险生效,也可以把它复制到pom.xml文件(非必须步骤)。

3、这个时候重启IDEA,更新Maven(它自己会去下载相关的组件配置)
下载会快很多。
4、导入缺少的相关包
少哪个包就在这里面找,然后将内容复制到pom.xml,Maven会自动下载导入。
Maven repository

缺点
原来的包文件的路径会发生变化,你需要一个一个的改。麻烦。可能我还没探索到如何快速修改。

2、初始化失败。org.springframework.beans.factory.InitializingBean,导致无法初始化jdbcTemplate,无法注册DataSource

原因:缺少spring-beans包。链接:Maven Repository
在这里插入图片描述
将其复制到Maven项目中的pom.xml中。
在这里插入图片描述
然后会出现import changes,你也可以选择自动导入。
在这里插入图片描述

3、因为spring相关架包版本过高导致的原来的写法无法运行

然后在查询代码这一块一直报错:

  public User findUser(String userName) {//查询
        String sql = "select * from bank where name=?";
        Object[] args = new Object[]{userName};
        //我们原本的实现是创建一个结果集处理接口,实现处理方法。JdbcTemplate类似,只不过是利用了结果集参数反射获取属性值。
        /*if(jdbc.queryForObject(sql, args, new BeanPropertyRowMapper<>(User.class))==null){
            System.out.println("/");
        }*/
       User user = (User) jdbc.queryForObject(sql, args,new BeanPropertyRowMapper<User>(User.class));
       if(user!=null)
           return user;
       else throw new NullPointerException("空异常!");
    }

刚开始使用的版本为(都比较高的版本):在这里插入图片描述

报错内容主要有两种:
第一种:spring-core版本太高,导致的异常:new BeanPropertyRowMapper(User.class)产出空指针异常
在这里插入图片描述

第二种:spring-jdbc版本过高,导致的异常:java.lang.NoSuchMethodError: org.springframework.core.convert.support.DefaultConversionService.
在这里插入图片描述

解决办法

  • spring-core改为低点的版本
  • spring-jdbc改为低点的版本
    在这里插入图片描述
    最终查找功能完成
    在这里插入图片描述

4、JDBCTemplate如何获取插入的User的主键id

@Override
    public void addUser(User user) {

        final String sql = "insert into bank(name,money) values(?,?)";
        final Object[] args = new Object[]{user.getName(), user.getMoney()};
        //获取刚插入的主键并返回
        KeyHolder holder = new GeneratedKeyHolder();
        jdbc.update(new PreparedStatementCreator() {
            @Override
            public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
                PreparedStatement ps = connection.prepareStatement(sql, new String[]{"id"});
                for (int i = 0; i < args.length; i++) {
                    ps.setObject(i + 1, args[i]);
                }
                return ps;
            }
        }, holder);
        int id = Objects.requireNonNull(holder.getKey()).intValue();
        user.setId(id);
    }

为什么sql是final类型?final 可以防止外部程序修改sql,避免安全问题

总结

  • 1、sping-jdbc使用的话,需要的包有:
    在这里插入图片描述
  • 2、获取刚插入的主键用到KeyHolderprepareStatementholder.getKey()
  • 3、多使用Maven项目管理工具
JdbcTemplateSpring框架中的一个核心类,用于简化JDBC操作。它提供了方便的方法来执行SQL查询、更新和批处理操作。 在使用JdbcTemplate之前,需要先获取JdbcTemplate对象。根据提供的引用内容,有三种常见的方式可以获取JdbcTemplate对象。 第一种方式是通过在Spring配置文件中定义一个JdbcTemplate的bean,并将其注入到需要使用的类中。在提供的代码示例中,可以看到在Spring配置文件中定义了一个名为"jdbcTemplate"的bean,并将其注入到了UserServiceImpl类中的setJdbcTemplate方法中。这样,UserServiceImpl类就可以通过调用getJdbcTemplate方法来获取JdbcTemplate对象。 第二种方式是直接在需要使用JdbcTemplate的类中定义一个JdbcTemplate的成员变量,并提供相应的setter方法。在提供的代码示例中,可以看到在UserServiceImpl类中定义了一个名为"jdbcTemplate"的成员变量,并提供了setJdbcTemplate方法来注入JdbcTemplate对象。这样,UserServiceImpl类就可以通过调用getJdbcTemplate方法来获取JdbcTemplate对象。 第三种方式是通过编程方式创建JdbcTemplate对象,然后进行相应的配置。这种方式相对较少使用,一般在没有Spring配置文件的情况下使用。通过创建JdbcTemplate对象并手动设置它的数据源,可以实现与数据库的连接。具体代码示例如下: ```java DataSource dataSource = ...; // 创建数据源 JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); // 创建JdbcTemplate对象 ``` 需要注意的是,无论通过哪种方式获取JdbcTemplate对象,都需要先配置好数据源,以便JdbcTemplate能够正确地与数据库进行连接。 总结起来,要使用JdbcTemplate,可以通过在Spring配置文件中定义一个JdbcTemplate的bean并注入到需要使用的类中,或者在需要使用JdbcTemplate的类中直接定义一个JdbcTemplate的成员变量并提供相应的setter方法。另外,还可以通过编程方式创建JdbcTemplate对象并手动设置数据源。无论哪种方式,都需要确保已正确配置数据源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雨夜※繁华

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值