标签:
众多的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