一、常见错误
废话不多逼逼,先看java操作数据库常见错误:
-
:表名用了MySQL关键字
如下可知用了dec关键字(但表里的列名用关键字不影响,不信自己试哈) -
:SQL语句有错(自己不扎实,怪谁呢!!哈哈哈)
这里的常常犯的错误又有:
- from写成form (我上面的错误就是这个错误)
- where前面好端端加个逗号 (反正这个我老师没教过哟!! 哈哈哈哈)
但是请你往下看,我犯的错误上面都找不到,你找找看咯!!!
二、吐血经历
前世:
- 为了避免SQL注入问题,我选择用preparedStatement接口来处理数据库的数据
- 因为想要节约资源和用户访问高效,我采用了阿里巴巴的数据库连接池Druid
- 测试插入数据是否成功
今生:
测试一开始,它就一直报错,错误如下:
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?' at line 1
查了很久也没发现自己的错误在哪?我服了
不信我把代码放上,你也来找找看(工具类没有问题),找到错误可以留言哈哈哈
献上代码:
JdbcUtils工具类
package utils;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
import javax.sql.DataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;
/**
* 使用阿里巴巴提供的数据库连接池(Druid)来连接数据库
* @author 放牛娃学编程
*
*/
public class JdbcUtils {
private static DataSource ds;
static {
//加载配置文件(druid的配置文件是键值对形式的)
Properties pro = new Properties();
//获取配置文件的输入流
InputStream is = JdbcUtils.class.getClassLoader().getResourceAsStream("druid.properties");
try {
pro.load(is);
//获取数据库连接池对象
ds = DruidDataSourceFactory.createDataSource(pro);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//获取connection连接的方法
public static Connection getConnection() throws SQLException
{
return ds.getConnection();
}
//获取数据库连接池的方法
public static DataSource getDatasource()
{
return ds;
}
/**
* 释放资源
*/
public static void close(Statement stmt,Connection conn){
/* if(stmt != null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn != null){
try {
conn.close();//归还连接
} catch (SQLException e) {
e.printStackTrace();
}
}*/
close(null,stmt,conn);
}
public static void close(ResultSet rs , Statement stmt, Connection conn){
if(rs != null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(stmt != null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn != null){
try {
conn.close();//归还连接,归还给数据库连接池
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
DruidTest测试类
package druid_study;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
import utils.JdbcUtils;
/**
* 1. 使用Druid数据库连接池操作数据库
* 2. 将常用操作封装为JdbcUtils类
*
* 目标:向test删除一条记录
* @author 放牛娃学编程
*
*/
public class DruidTest {
public static void main(String[] args) {
Connection con = null;
PreparedStatement pstm = null;
try
{
//1.获取连接
con = JdbcUtils.getConnection();
//2.定义sql语句
String sql = "delete form test where id=?";
//3.获取PreparedStatement语句对象
pstm = con.prepareStatement(sql);
//4.为?设置参数
pstm.setInt(1, 6);
//5.执行sql语句,并获取对象
int count = pstm.executeUpdate(sql);
//6.处理结果
if(count > 0)
{
System.out.println("成功删除一条记录");
}
else
{
System.out.println("删除失败");
}
}
catch(SQLException e)
{
e.printStackTrace();
}
finally
{
//7.释放资源
JdbcUtils.close(pstm, con);
}
}
}
三、错误原因
小伙伴们有没有找到呢!!!
这里我要公布答案了:
上面的测试代码有两处致命错误,如果你单纯去网上找博客文章排错,那是不太可能揪出来的。错误如下:
- SQL语句有错。单词from写成form(这个错误我上面有提到过)
- 执行SQL语句的方式是带有占位符的,但是执行删除操作的时候却用了executeUpdate(sql),正确应该执行executeUpdate() (这个错一定要记在心里呀呀呀)
四、分享交流
最后有兴趣一起交流的,可以关注我的公众号:这里你能够学到很实用的技巧,不是常用的我不说,公众号回复提取码即可获取以下学习资料啦啦啦啦,喜欢就拿去吧!!
(链接时常会失效,若出现此类情况,可以加我微信:17722328325(加时请备注:学习资料))
-
Java web从入门到精通电子书
-
Python机器学习电子书
-
Python400集(北京尚学堂)
-
JavaScript项目案例、经典面试题
-
Java300集(入门、精通)
-
Java后端培训机构录集(同事培训内部提供)
-
java重要知识pdf文档(价值连城呀呀,不收藏你会后悔的)