Bibi's DevLog ๐ค๐
[TIL] JDBC๋ก DB(MySQL) ์ฐ๊ฒฐํด์ ์ฌ์ฉํ๊ธฐ - SELECT, INSERT ์์ / java.sql.SQLException: Column count doesn't match value count at row ์ซ์. ๋ณธ๋ฌธ
[TIL] JDBC๋ก DB(MySQL) ์ฐ๊ฒฐํด์ ์ฌ์ฉํ๊ธฐ - SELECT, INSERT ์์ / java.sql.SQLException: Column count doesn't match value count at row ์ซ์.
๋น๋น bibi 2021. 1. 31. 23:43[210131]
์ค๋ ์ ๋ ์๋ ์ด์ ์ ์ด์ด์ JDBC๋ก MySQL DB ์ฐ๊ฒฐ์ ์ฐ์ตํด ๋ณด์๋ค!
(SELECT ์ INSERT)
TIL
JDBC๋ฅผ ์ด์ฉํ DB(MySQL) ์ฐ๊ฒฐํด ์ฌ์ฉํ๊ธฐ
- SELECT, INSERT๋ฌธ
*๋งํฌ1, ๋งํฌ2๋ฅผ ์ฐธ์กฐํ๋ฉฐ ์ฐ์ตํ ์์ ์
๋๋ค. ๊ฐ์ฌํฉ๋๋ค๐โโ๏ธ
ํนํ ๋งํฌ1 ์ค์ฌ์ผ๋ก ๋ฐ๋ผํ ๊ฒ์ด ๋ง์ ๋์์ด ๋์์ต๋๋ค.
(MySQL connector๊ฐ ์ค๋น๋์ด ์๋ค๋ ์ ์ ํ์ ์คํ๊ฐ๋ฅํ ์์ ์ ๋๋ค)
JDBC๋ก DB(MySQL) ์ฐ๊ฒฐํด ์ฌ์ฉํ๊ธฐ
import java.sql.*;
๋๋ผ์ด๋ฒ ๊ฐ์ ธ์ค๊ธฐ - MySQL Connector
Class.forName("com.mysql.jdbc.Driver");
MySQL์ฐ๊ฒฐ์ ์ํ Connection๊ฐ์ฒด ์์ฑ
String url = "jdbc:mysql://localhost/DB๋ช ";
connection = DriverManager.getConnection(url, "DB์ฌ์ฉ์ID", "DB์ฌ์ฉ์PW");
Statement / PreparedStatement ๊ฐ์ฒด ์์ฑ
(์๋
connection
์ Connection๊ฐ์ฒด)Statement statement = connection.createStatement();
- ์ ์ ์ธ ์ฟผ๋ฆฌ๋ฌธ, ์ฆ ํ๋ผ๋ฏธํฐ๋ฅผ ์ ๋ ฅ๋ฐ์ง ์๋ ์ฟผ๋ฆฌ๋ฌธ์ผ ๋ ์ฌ์ฉ
์ฃผ๋ก
SELECT
์ฟผ๋ฆฌ์ ์ฌ์ฉํจ.PreparedStatement preparedstatement = connection.prepareStatement();
- ๋์ ์ธ ์ฟผ๋ฆฌ๋ฌธ, ์ฆ ํ๋ผ๋ฏธํฐ๋ฅผ ์ ๋ ฅ๋ฐ์ ์ฌ์ฉํ๋ ์ฟผ๋ฆฌ๋ฌธ์ผ ๋ ์ฌ์ฉ
์ฃผ๋ก
INSERT
,UPDATE
,DELETE
์ฟผ๋ฆฌ์ ์ฌ์ฉํจ.(*PreparedStatement : ์ฟผ๋ฆฌ๋ฅผ ์ค๋นํ๋ Statement๋ผ๋ ์๋ฏธ. ์ ๋ ฅ๊ฐ์ ํ์๋ก ํ๋ฏ๋ก.)
SQL์ฟผ๋ฆฌ ์ํ (
execute
)executeQuery(SQL๋ฌธ)
:SELECT
์ฒ๋ผ ๋ฆฌํด๊ฐ์ด ํ์ํ ์ฟผ๋ฆฌ๋ฌธ์ผ ๋ ์ฌ์ฉStatement.executeQuery()
PreparedStatement.executeQuery()
- ๋ฆฌํดํ์
:
ResultSet
๊ฐ์ฒด - ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ก ๋ฆฌํด๋ DB ๋ ์ฝ๋๋ค์ด ๋ด๊ฒจ ์๋ค.ResultSet = statement.executeQuery(sql);
์ ๊ฐ์ด ์ฌ์ฉ.resultSet.next()
: boolean์ ๋ฆฌํดํจ - ๋ค์ ๋ ์ฝ๋๊ฐ ์กด์ฌํ๋ฉด true ๋ฆฌํด.
executeUpdate()
:INSERT
,UPDATE
,DELETE
์ฒ๋ผ ๋ฆฌํด๊ฐ์ด ํ์ ์๋ ์ฟผ๋ฆฌ๋ฌธ์ผ ๋ ์ฌ์ฉStatement.executeUpdate()
PreparedStatement.executeUpdate
- ๋ฆฌํด๊ฐ ์์
๋ฆฌ์์ค ๋ฐ๋ฉ
ํ์ํ ๋๋จธ์ง ๋ก์ง๋ค์ ์ํํ ํ,
finally
๋ธ๋ก์์.close()
๋ก JDBC ์ฐ๊ฒฐ ๊ณผ์ ์ ํ์ํ๋ ๊ฐ์ฒด๋ค์ ๋ฐ๋ฉํจ.
(๊ฐ์ฒด๋ฅผ ์์ฑํ ์ญ์์ผ๋ก ๋ฐ๋ฉํจ)Connection.close()
Statement.close()
PreparedStatement.close()
ResultSet.close()
SELECT๋ฌธ ์์
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class SelectMySQL {
public static void main(String[] args) {
Connection connection = null;
Statement statement = null;
ResultSet resultSet = null;
try {
// 1. connector (๋๋ผ์ด๋ฒ) ๋ก๋ฉ
// ClassNotFoundException ๋ฐ์ ๊ฐ๋ฅ - try-catch ๋ก ์์ธ์ฒ๋ฆฌ ํ์.
Class.forName("com.mysql.jdbc.Driver");
// 2. DB(MySQL)์ ์ฐ๊ฒฐ
// SQLException ๋ฐ์ ๊ฐ๋ฅ - try-catch ๋ก ์์ธ์ฒ๋ฆฌ ํ์.
String url = "jdbc:mysql://localhost/DB๋ช
";
connection = DriverManager.getConnection(url, "DB์ฌ์ฉ์ID", "DB์ฌ์ฉ์PW");
// 3. ์ฟผ๋ฆฌ ์ํ์ ์ํ Statement ๊ฐ์ฒด ์์ฑ
// (Statement ๊ฐ์ฒด : ์ฟผ๋ฆฌ๋ฅผ ์คํํ ์ ์๋ ๊ฐ์ฒด)
// *์ ์ ์ธ ์ฟผ๋ฆฌ๋ฌธ์ Statement statement = conn.createStatement();
// *๋์ ์ธ ์ฟผ๋ฆฌ๋ฌธ์ PreparedStatement preparedstatement = conn.prepareStatement();
// (๋์ ์ธ ์ฟผ๋ฆฌ๋ฌธ = ํ๋ผ๋ฏธํฐ๋ฅผ ์
๋ ฅ๋ฐ๋ ์ฟผ๋ฆฌ๋ฌธ)
statement = connection.createStatement();
// 4. SQL ์ฟผ๋ฆฌ ์์ฑ
// ์ฃผ์ 1. JDBC์์ ์ฟผ๋ฆฌ ์์ฑ์ ;๋ฅผ ๋นผ๊ณ ์์ฑํจ.
// ์ฃผ์ 2. SELECT ํ ๋ *๋ก ๊ฐ์ ธ์ค๋ ๊ฒ๋ณด๋ค, ๊ฐ์ ธ์ฌ ์ปฌ๋ผ์ ์ง์ ํ๋ ๊ฒ์ด ์ข์.
// ์ฃผ์ 3. ์ฟผ๋ฆฌ๋ก ๊ฒฐ๊ณผ๊ฐ๋ง ๊ฐ์ ธ์ค๊ณ , java์ฝ๋๋ก ํ์์
ํ๋ ๊ฒ์ ์ข์ง ์์.
// ์ฃผ์ 4. ์ฟผ๋ฆฌ๋ ๊ฐ๊ธ์ ํ ์ค๋ก ์์ฑ. ์ค์ ๋๋ ์, ๋์ด์ฐ๊ธฐ์ ์ ์.
String sql = "SELECT nickname, money FROM user_log";
// 5. SQL ์ฟผ๋ฆฌ ์ํ
// ์์ฑํ SQL ์ฟผ๋ฆฌ๋ฅผ Statement.executeQuery()์ ์ธ์๋ก ์ ๋ฌํด ํธ์ถํ๋ฉด ์ฟผ๋ฆฌ๊ฐ ์คํ๋จ.
// ๋ฆฌํดํ์
: ResultSet ๊ฐ์ฒด - ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์ ๋ ์ฝ๋๋ค์ด ๋ด๊ฒจ ์๋ค.
// DB์ ๋ ์ฝ๋๋ค์ ResultSet ๊ฐ์ฒด์ ์ถ๊ฐ๋๋ค.
resultSet = statement.executeQuery(sql);
// 6. ์คํ ๊ฒฐ๊ณผ ์ถ๋ ฅ
// (์ผ๋ฐ์ ์ผ๋ก ๊ฒฐ๊ณผ ์กฐํ๋ฅผ ์ํด์๋ VO๊ฐ์ฒด๋ฅผ ์ฌ์ฉํจ(ํค์๋ - DAO, VO)
while (resultSet.next()) {
// ์ฃผ์ - DB ๋ ์ฝ๋๋ค์ ์นผ๋ผ์ 0์ด ์๋ 1๋ถํฐ ์์ํ๋ค.
// resultSet.next()๋ boolean์ ๋ฆฌํดํจ - ๋ค์ ๋ ์ฝ๋๊ฐ ์กด์ฌํ๋ฉด true ๋ฆฌํด
String nickname = resultSet.getString(1);
int money = resultSet.getInt(2);
// DB์์ ๊ฐ์ ธ์ค๋ ๋ฐ์ดํฐ ํ์
์ ๋ง๊ฒ getString() ๋๋ getInt() ๋ฑ์ ํธ์ถํ๋ค.
System.out.println(nickname + " : " + money);
}
// ๊ฒฐ๊ณผ : MySQL์ user ๋ฐ์ดํฐ๋ฒ ์ด์ค, user_log ํ
์ด๋ธ์์ nickname(String)๊ณผ money(int)๋ฅผ ๊ฐ์ ธ์ ์ถ๋ ฅํจ.
} catch (ClassNotFoundException e) {
System.out.println("๋๋ผ์ด๋ฒ ๋ก๋ฉ ์คํจ");
} catch (SQLException e) {
System.out.println("์๋ฌ " + e);
}
finally {
// Connection, Statement, ResultSet ๊ฐ์ฒด๋ฅผ ๋ซ๋ ์ฝ๋.
// isClosed(), close()๋ SQLException ๋ฐ์ ๊ฐ๋ฅ - try-catch๋ก ์์ธ์ฒ๋ฆฌ.
try {
if (connection != null && !connection.isClosed()) {
// Connection์ด ์กด์ฌํ๊ณ , ๋ซํ์์ง ์๋ค๋ฉด
connection.close();
}
if (statement != null && !statement.isClosed()) {
statement.close();
}
if (resultSet != null && !resultSet.isClosed()) {
resultSet.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
INSERT๋ฌธ ์์
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class InsertMySQL {
public static void main(String[] args) {
insert(13 ,"robbins", 3100, "2021-01-31 00:00:00");
}
public static void insert(int id, String nickname, int money, String last_visit) {
Connection connection = null;
PreparedStatement preparedStatement = null;
try {
// 1. connector(๋๋ผ์ด๋ฒ) ๋ก๋ฉ.
// ClassNotFoundException ๋ฐ์ ๊ฐ๋ฅ - ์์ธ์ฒ๋ฆฌ ํ์.
Class.forName("com.mysql.jdbc.Driver");
// 2. DB์ ์ฐ๊ฒฐํ๊ธฐ - connection = DriverManager.getConnection()
// SQLException ๋ฐ์ ๊ฐ๋ฅ - ์์ธ์ฒ๋ฆฌ ํ์.
String url = "jdbc:mysql://localhost/DB๋ช
";
connection = DriverManager.getConnection(url, "DB์ฌ์ฉ์ID", "DB์ฌ์ฉ์PW");
// 3. ์ฟผ๋ฆฌ ์ํ์ ์ํ PreparedStatement ๊ฐ์ฒด ์์ฑ
// INSERT๋ก ์ถ๊ฐํ๋ ๋ฐ์ดํฐ ๊ฐ์ ๋ณดํต ํ๋ผ๋ฏธํฐ๋ฅผ ํตํด ๋์ ํ ๋น๋๋ ๊ฐ์ด๋ฏ๋ก,
// Statement.createStatement()๊ฐ ์๋ PreparedStatement.prepareStatement()๋ฅผ ์ฌ์ฉํจ.
// (์ฟผ๋ฆฌ๋ฅผ ์ค๋นํ๋ statement๋ผ๋ ์๋ฏธ)
// prepareStatement()๋ PreparedStatement ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ฉฐ,
// ์ด ๊ฐ์ฒด์๋ PreparedStatement.setString()์ผ๋ก ๋์ ์ผ๋ก ๊ฐ์ ํ ๋นํ ์ ์์.
// PreparedStatement ๋ฉ์๋๋ค์ SQLException ๋ฐ์ ๊ฐ๋ฅ - ์์ธ์ฒ๋ฆฌ ํ์.
String sql = "INSERT INTO user_log VALUES (?,?,?,?)";
preparedStatement = connection.prepareStatement(sql);
// 4. ๋ฐ์ดํฐ binding - sql๋ฌธ์ ๊ฐ ์์์ ํ๋ผ๋ฏธํฐ ๊ฐ์ ํ ๋นํด์ค
preparedStatement.setInt(1, id);
preparedStatement.setString(2, nickname);
preparedStatement.setInt(3, money);
preparedStatement.setString(4, last_visit);
// 5. ์ฟผ๋ฆฌ ์คํ ๋ฐ ๊ฒฐ๊ณผ ์ฒ๋ฆฌ
// SELECT์ ๋ฌ๋ฆฌ INSERT๋ ๋ฐํ ๋ฐ์ดํฐ๊ฐ ์์ผ๋ฏ๋ก ResultSet ๊ฐ์ฒด๊ฐ ํ์ ์์.
// ๋ฐ๋ผ์ ๋ฐ๋ก PreparedStatement.executeUpdate()๋ฉ์๋๋ฅผ ํธ์ถํจ.
// INSERT, UPDATE, DELETE ์ฟผ๋ฆฌ : PreparedStatement.executeUpdate()๋ฅผ ์ฌ์ฉํ๋ฉฐ,
// (์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ, ์ฆ ๋ฆฌํด๊ฐ์ด ์๋ ๊ฒฝ์ฐ)
// SELECT ์ฟผ๋ฆฌ : Statement.executeQuery()๋ฅผ ์ฌ์ฉํจ.
// (์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ, ์ฆ ๋ฆฌํด๊ฐ์ด ์๋ ๊ฒฝ์ฐ)
// ๋ฆฌํดํ์
: int (๋ช ๊ฐ์ row์ ์ํฅ์ ๋ฏธ์ณค๋์ง๋ฅผ ๋ฐํํจ)
int count = preparedStatement.executeUpdate();
if (count == 0) {
System.out.println("๋ฐ์ดํฐ ์
๋ ฅ ์คํจ");
} else {
System.out.println("๋ฐ์ดํฐ ์
๋ ฅ ์ฑ๊ณต");
}
} catch (ClassNotFoundException e) {
System.out.println("๋๋ผ์ด๋ฒ ๋ก๋ฉ ์คํจ");
} catch (SQLException e) {
System.out.println("์๋ฌ " + e);
}
finally {
// Connection, PreparedStatement ๊ฐ์ฒด๋ฅผ ๋ซ๋ ์ฝ๋.
// isClosed(), close()๋ SQLException ๋ฐ์ ๊ฐ๋ฅ - try-catch๋ก ์์ธ์ฒ๋ฆฌ.
try {
if (connection != null && !connection.isClosed()) {
// Connection์ด ์กด์ฌํ๊ณ , ๋ซํ์์ง ์๋ค๋ฉด
connection.close();
}
if (preparedStatement != null && !preparedStatement.isClosed()) {
preparedStatement.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
java.sql.SQLException: Column count doesn't match value count at row ์ซ์
์์ INSERT๋ฌธ ์์ ๋ฅผ ํ๋ค๊ฐ ๋ฐ์ํ ์๋ฌ.
MySQL ํ ์ด๋ธ์ ์ปฌ๋ผ๊ณผ INSERTํ ๋ฐ์ดํฐ์ ์๊ฐ ๋ง์ง ์์ ๋ ๋ฐ์ํ๋ ์๋ฌ๋ผ๊ณ ํ๋ค.
ํด๊ฒฐ ) MySQL๋ด์์ AUTO-INCREMENT
๋ก ์ค์ ํ ์ปฌ๋ผ์ ๋ํด์๋ INSERT ๊ฐ์ ์ง์ ํด ์ฃผ์ด์ผ ํ๋ค.