最近学习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、获取刚插入的主键用到
KeyHolder
,prepareStatement
,holder.getKey()
- 3、多使用Maven项目管理工具