大体步骤:
1.加载Jdbc驱动(Class.forName("com.mysql.jdbc.Driver");
)
2.创建Jdbc连接(conn = DriverManager.getConnection("","","");
)
3.创建statement(
statement=conn.prepareStatemnet(sql);
statement.setObject(i,objects[i-1]);
)
4.执行增删改 或 执行查询操作。
5.增删改返回boolean值,判断是否操作成功。
6.查询操作可分为 返回一条数据,或返回多条数据。
7.释放资源。
代码示例:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Jdbc {
private Connection conn; // 加载数据库驱动后,进行数据库连接
private PreparedStatement statement; // 连接之后构建sql语句,并执行
private ResultSet resultSet; // 结果集,执行sql语句后,返回的结果
private static Jdbc instance;
// 私有构造,记载jdbc驱动
private Jdbc() {
try {
Class.forName("com.mysql.jdbc.Driver");// 加载jdbc驱动
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
// 单例模式
public static Jdbc getInstance() {
if (instance == null) {
instance = new Jdbc();
}
return instance;
}
// 创建jdbc连接
private void createConnection() {
try {
if (conn == null || conn.isClosed()) {
// Gsonadmin:工程名, root:数据库账号密码
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/Gsonadmin", "root", "root");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
// 创建statement
private void createStatement(String sql, Object... objects) throws SQLException {
this.createConnection();
/** * 可以通过调用 Connection 对象的 preparedStatement() 方法获取 PreparedStatement 对象 * PreparedStatement 接口是 Statement 的子接口,它表示一条预编译过的 SQL 语句 * PreparedStatement 对象所代表的 SQL 语句中的参数用问号(?)来表示 */
statement = conn.prepareStatement(sql);
// 统一绑定参数
if (objects != null && objects.length > 0) {
for (int i = 1; i <= objects.length; i++) {
// 第一个参数是要设置的 SQL 语句中的参数的索引(从 1 开始),第二个是设置的 SQL 语句中的参数的值.
statement.setObject(i, objects[i - 1]);
}
}
}
/** * 执行所有增、删、改的sql操作 * * @throws SQLException */
public boolean executeUpdate(String sql, Object... objects) throws SQLException {
boolean flag = false;
try {
this.createStatement(sql, objects);
flag = statement.executeUpdate() > 0;
} finally {
// 释放资源
this.release();
}
return flag;
}
/** * 返回一条记录的sql * * @throws SQLException */
public Map<String, Object> executeQuery(String sql, Object... objects) throws SQLException {
Map<String, Object> row = null;
try {
this.createStatement(sql, objects); // 创建statement
resultSet = statement.executeQuery(); // 执行query操作,返回结果赋给resultSet
// 遍历resultSet
if (resultSet.next()) {
row = new HashMap<>();
ResultSetMetaData meta = resultSet.getMetaData(); // 得到结果集的结构信息,比如字段数、字段名等。
for (int i = 1; i < meta.getColumnCount(); i++) { // 得到结果集的列数
String lable = meta.getColumnLabel(i); // 得到每列的字段名
row.put(lable, resultSet.getObject(lable));
}
}
} finally {
this.release();
}
return row;
}
/** * 返回多条记录的sql * * @throws SQLException */
public List<Map<String, Object>> executeQueryForList(String sql, Object... objects) throws SQLException {
List<Map<String, Object>> rows = null;
try {
this.createStatement(sql, objects); // 创建statement
resultSet = statement.executeQuery(); // 执行query操作,返回结果赋给resultSet
rows = new ArrayList<>();
Map<String, Object> row;
// 遍历resultSet
while (resultSet.next()) {
row = new HashMap<>();
ResultSetMetaData meta = resultSet.getMetaData(); // 得到结果集的结构信息,比如字段数、字段名等。
for (int i = 1; i < meta.getColumnCount(); i++) { // 得到结果集的列数
String lable = meta.getColumnLabel(i); // 得到每列的字段名
row.put(lable, resultSet.getObject(lable));
}
rows.add(row);
}
} finally {
this.release();
}
return rows;
}
/** * 释放资源 */
private void release() {
try {
if (resultSet != null) {
resultSet.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if (statement != null) {
statement.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
关键:反射+泛型。