码迷,mamicode.com
首页 > 数据库 > 详细

Java数据库编程之JDBC增删查改

时间:2015-11-30 17:37:53      阅读:204      评论:0      收藏:0      [点我收藏+]

标签:

  前言

  众多的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。

Java数据库编程之JDBC增删查改

标签:

原文地址:http://www.cnblogs.com/coderworld/p/java-jdbc-crud.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!