从零开始搭建JDBC+servlet管理系统(1)——JDBC基本操作

这个系列是我自己的java实战学习记录。如果能帮助到你的学习进程,我不胜荣幸!
这次的项目是使用JDBC和servlet技术搭建一个数据库管理平台。它能在web端实现数据库基本的增删改查功能。值得一提的是,servlet技术在当今的企业中已经很少使用。绝大多数企业都是用SSM或Spring全家桶来开发web应用程序的。可是我们仍有学习servlet的意义。servlet是java web的基础。搞懂了这个,之后使用框架时如果遇到问题,才知道如何下手debug。
首先我们搭建JDBC环境。JDBC是使用java语言连接并控制数据库的技术。使用JDBC需要导入一个jar包:mysql-connector-java-5.1.6-bin.jar。注意,其中的版本号不一定要和我用的一致。
第一步,我们看一下JDBC的连接开启办法:

try {
    Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
    e.printStackTrace();
}

首先使用反射的方法动态加载一个java类jdbc.Driver。顾名思义,这是JDBC的驱动类。你可以把它理解成JDBC服务的初始化。之后我们建立对数据库的连接。

public Connection getConnection() throws SQLException {

    return DriverManager.getConnection("jdbc:mysql://localhost:3306/${数据库名}?characterEncoding=UTF8","${用户名}", "${密码}");
    }

Connection c = getConnection();

这是就创建了一个数据库连接对象c。之后的操作会基于这个c来进行。下面依次介绍一下JDBC操作数据库增、删、改、查的方法。首先是查询数据:

Statement s = c.creatStatement();
String sql = "SELECT * FROM ${table名}";
ResultSet rs = s.executeQuery(sql);
while (rs.next()) {
    ...
}

首先建立一个Statement对象s,之后使用s的executeQuery方法执行一个sql语句,将结果保存在ResultSet对象rs中。之后对rs的每一行进行遍历,通过以下方法读取rs中的数据:

rs.getInt(n); // 第n列的数据(这里不是从0开始,是从1开始)
rs.getInt("abc") // 列名为abc的数据。这里的Int也可以换成String,double之类

例如,编写一个查询某table数据数目的方法:

public int getTotal() {
    int total = 0;
    try (Connection c=getConnection(); Statement s=c.createStatement()) {
        String sql = "SELECT COUNT(*) FROM ${table名}";
        ResultSet rs = s.executeQuery(sql);
        if (rs.next()) {
            total = rs.getInt(1);
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return total;
}

因为Connection一旦建立,在操作结束后必须关闭,否则会出现意想不到的错误,所以这里我们使用try-with-resources语句进行控制,确保连接的关闭。接下来介绍增删改的操作。首先建立一个Conncetion对象c,方法和前面一模一样,之后创建一个Statement对象并用它的execute方法执行。举例来说,编写一个添加数据的方法:

public void add(Hero hero) {
    String sql = "INSERT INTO hero values(null, ?, ?, ?)";
    try (Connection c=getConnection(); PreparedStatement ps=c.prepareStatement(sql)) {
        ps.setString(1, hero.getName());
        ps.setFloat(2, hero.getHp());
        ps.setInt(3, hero.getDamage());
        ps.execute();
        ResultSet rs = ps.getGeneratedKeys();
        if (rs.next()) {
            hero.setId(rs.getInt(1));
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

这里有几点和之前查询操作不一样的地方。首先,使用execute方法而不是executeQuery方法执行sql语句;其次,为了方便,使用了prepareStatement方法建立语句对象,用法一看便知。最后,如果需要获取修改好的数据对象的话,使用getGeneratedKeys方法即可。遍历ResultSet的方法也与上面一样。

展开阅读全文

没有更多推荐了,返回首页