check …MySQL server…… use near '?' at line 1?(这些问题,你看后绝对会收藏)

一、常见错误

废话不多逼逼,先看java操作数据库常见错误:

  1. :表名用了MySQL关键字
    在这里插入图片描述
    如下可知用了dec关键字(但表里的列名用关键字不影响,不信自己试哈)

  2. :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);
		}		
	}
}

三、错误原因

小伙伴们有没有找到呢!!!

这里我要公布答案了:
上面的测试代码有两处致命错误,如果你单纯去网上找博客文章排错,那是不太可能揪出来的。错误如下:

  1. SQL语句有错。单词from写成form(这个错误我上面有提到过)
  2. 执行SQL语句的方式是带有占位符的,但是执行删除操作的时候却用了executeUpdate(sql),正确应该执行executeUpdate() (这个错一定要记在心里呀呀呀)

四、分享交流

最后有兴趣一起交流的,可以关注我的公众号:这里你能够学到很实用的技巧,不是常用的我不说,公众号回复提取码即可获取以下学习资料啦啦啦啦,喜欢就拿去吧!!

(链接时常会失效,若出现此类情况,可以加我微信:17722328325(加时请备注:学习资料))

  1. Java web从入门到精通电子书

  2. Python机器学习电子书

  3. Python400集(北京尚学堂)

  4. JavaScript项目案例、经典面试题

  5. Java300集(入门、精通)

  6. Java后端培训机构录集(同事培训内部提供)

  7. java重要知识pdf文档(价值连城呀呀,不收藏你会后悔的)

在这里插入图片描述

发布了39 篇原创文章 · 获赞 13 · 访问量 4834

猜你喜欢

转载自blog.csdn.net/qiukui111/article/details/104678549