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项目管理工具

猜你喜欢

转载自blog.csdn.net/qq_44861675/article/details/107890409