标签:
众多的ORM框架使我们从原生的JDBC编码摆脱出来,但在学习数据库编程之初,应该先掌握底层的JDBC编程,熟练应用后,学起框架才会更得心应手。就像金庸笔下的武侠人物,只要内功深厚,再去学习其他武功绝学,只不过是招式罢了。正所谓,温故而知新,本文回顾了最基础的JDBC增删查改操作。
在之前一篇随笔讲过如何连接数据库——《Java数据库编程之JDBC配置》。
数据库连接工具类 DBConnection
package database;
import java.sql.*;
import java.sql.Statement;
/**
* Created by Michael Wong on 2015/11/28.
*/
public class DBConnection {
/** 数据库地址 jdbc:mysql://[ip]:[port]/[db_name] */
private static final String URL = "jdbc:mysql://localhost:3306/test";
/** 用户名 */
private static final String USERNAME = "root";
/** 密码 */
private static final String PASSWORD = "root";
/** 驱动器类 */
private static final String DRIVER = "com.mysql.jdbc.Driver";
//注册驱动器类
static {
try {
Class.forName(DRIVER);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/**
* 获取数据库连接
* @return Connection
* @throws SQLException
*/
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(URL, USERNAME, PASSWORD);
}
/**
* 关闭相关资源
* @param connection 连接
* @param statement 陈述
* @param resultSet 结果集
*/
public static void close(Connection connection, Statement statement, ResultSet resultSet) {
try {
if(connection != null) {
connection.close();
}
if(statement != null) {
statement.close();
}
if(resultSet != null) {
resultSet.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 关闭相关资源 重载
* @param connection 连接
* @param statement 陈述
*/
public static void close(Connection connection, Statement statement) {
close(connection, statement, null);
}
}
在数据库创建一张简单的用户表,只包含两个字段——id和name。结构如下图: 
新建用户类 User
package database;
/**
* Created by Michael Wong on 2015/11/28.
*/
public class User {
private int id;
private String name;
public User(int id, String name) {
this.id = id;
this.name = name;
}
public User(String name) {
this.name = name;
}
public void setId(int id) {
this.id = id;
}
public int getId() {
return this.id;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
@Override
public String toString() {
return "#" + id + " name: " + name;
}
}
JDBC操作数据库主要用到Connection、Statement和ResultSet相关类,具体方法可以查看官方API。
.Connection - 到指定数据库的连接
.Statement - 执行具体的SQL语句
.ResultSet - 查询结果
package database;
import java.sql.*;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
/**
* Created by Michael Wong on 2015/11/28.
*/
public class UserDAO {
/** 数据库连接 */
private Connection connection;
public UserDAO(Connection connection) {
this.connection = connection;
try {
connection.setAutoCommit(true);
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 添加一位用户
* @param name 用户名称
*/
public void addUser(String name) {
String sql = "INSERT INTO user(name) VALUES (?)";
PreparedStatement preparedStatement = null;
try {
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1, name);
preparedStatement.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
DBConnection.close(connection, preparedStatement);
}
}
/**
* 删除一位用户
* @param name 待删除用户名
*/
public void removeUser(String name) {
String sql = "DELETE FROM user WHERE name = ?";
PreparedStatement preparedStatement = null;
try {
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1, name);
preparedStatement.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
DBConnection.close(connection, preparedStatement);
}
}
/**
* 根据用户获取用户名
* @param id id
* @return 用户名
*/
public String getNameById(int id) {
String sql = "SELECT name FROM user WHERE id = ?";
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
String name = null;
try {
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setInt(1, id);
resultSet = preparedStatement.executeQuery();
resultSet.next();
name = resultSet.getString(1);
} catch (SQLException e) {
e.printStackTrace();
} finally {
DBConnection.close(connection, preparedStatement, resultSet);
}
return name;
}
/**
* 修改一位用户名称
* @param id 用户id
* @param name 用户修改后名称
*/
public void updateUser(int id, String name) {
String sql = "UPDATE user set name = ? where id = ?";
PreparedStatement preparedStatement = null;
try {
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1, name);
preparedStatement.setInt(2, id);
preparedStatement.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
DBConnection.close(connection, preparedStatement);
}
}
/**
* 查找所有用户
* @return 用户
*/
public List<User> getAllUsers() {
String sql = "SELECT * FROM user";
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
List<User> userList = null;
try {
preparedStatement = connection.prepareStatement(sql);
resultSet = preparedStatement.executeQuery();
userList = new LinkedList<User>();
while(resultSet.next()) {
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
userList.add(new User(id, name));
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
DBConnection.close(connection, preparedStatement, resultSet);
}
List<User> returnedList = new ArrayList<User>();
returnedList.addAll(userList);
return returnedList;
}
}
此处使用PreparedStatement——预备语句。PreparedStatement相对于Statement是预编译的,对于批量处理大大提高效率,而Statement每次执行SQL语句,数据库都要执行SQL语句的编译。如果对数据库只做一次性存取操作,用Statement处理更高效。预备语句改进了查询性能,每当数据库执行一个查询时,它总是首先通过计算来确定查询策略,以便高效地执行查询操作。通过事先准备好查询并多次重用它,就可以确保查询所需要的准备步骤只被执行一次。
在预备查询语句中,每个宿主变量都有“?”来表示。如果存在一个以上的变量,那么在设置变量值时必须注意“?”的位置。在执行预备语句之前,必须使用set方法将变量绑定到实际的值上。和ResultSet方法中的get方法类似,针对不同的数据类型也有不同的set方法。
注意:ResultSet类的迭代方法与java.util.Iterator接口稍有不同。对于ResultSet类,迭代器初始化时被设定在第一行之前的位置,必须调用next方法将它移动到第一行。另外,它没有hasNext方法,我们需要不断地调用next,直至该方法返回false。
标签:
原文地址:http://www.cnblogs.com/coderworld/p/java-jdbc-crud.html