Jdbc入门介绍第二章——Jdbc结合JSP和Servlet的简单综合应用

本文介绍了如何在Web项目中结合Servlet和JSP使用JDBC进行数据库操作。通过创建JDBCTemplate类,实现了增删改查的方法,并利用PreparedStatement处理JDBC通配符。创建了实体类和DAO层,展示了添加、删除、更新和查询用户的方法。同时,通过JSP页面和Servlet控制器实现用户交互,利用EL表达式和JSTL标签展示数据。
摘要由CSDN通过智能技术生成

接下来我们来做结合Servlet和JSP技术的简单的综合应用。
首先新建一个web项目,将之前的工具类和oracle驱动贴在相应的位置,如图

这里写图片描述

Web项目添加驱动Jar有个方便的方法,直接将jar文件复制到WebRoot/WEB-INF/lib目录下就行类,当然用我上面讲述的方法同样适用。接下来,我在DBUtil工具类中添加了关闭资源的代码:

/**
     * 关闭所有资源
     */
    public static void closeAll(ResultSet rs, Statement st)
    {
        try
        {
            //先从结果集关闭
            if (null != rs)
            {
                rs.close();
                rs = null;
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        finally
        {
            try
            {
                //Statement接口关闭
                if (null != st)
                {
                    st.close();
                    st = null;
                }
            }
            catch (SQLException e)
            {
                e.printStackTrace();
            }
            finally
            {
                try
                {
                    if (null != con)
                    {
                        if (con.getAutoCommit())
                        {
                            //最后数据库连接关闭
                            con.close();
                            con = null;
                        }
                    }
                }
                catch (SQLException e)
                {
                    e.printStackTrace();
                }
            }
        }
    }
}                catch (SQLException e)
                {
                    e.printStackTrace();
                }
            }
        }
    }

接下来,需要一个jdbc操作模板,我们将JDBC对数据库的基本操作定义在这个模板类中,不再是上个例子中写在测试类中类,我将模板类命名为JDBCTemplate类。具体代码如下:

package com.java.jdbc.jdbctemplate;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import com.java.jdbc.util.DBUtil;

public abstract class JDBCTemplate<T> {
    private Connection con;
    private PreparedStatement ps;
    private ResultSet rs;

    // 增删改
    public boolean update(String sql, Object... params) throws Exception {
        int res = 0;
        con = DBUtil.getCon();
        ps = con.prepareStatement(sql);
        //params是一个存储参数的数组
        if (null != params)
            for (int i = 0; i < params.length; i++) {
                ps.setObject(i + 1, params[i]);
            }
        res = ps.executeUpdate();
        DBUtil.closeAll(rs, ps);
        if (res > 0)
            return true;
        else
            return false;
    }

    // 查
    public ArrayList<T> select(String sql, Class c, Object... params) {
        ArrayList<T> lst = new ArrayList<T>();
        con = DBUtil.getCon();
        try {
            ps = con.prepareStatement(sql);
            if (null != params)
                for (int i = 0; i < params.length; i++) {
                    ps.setObject(i + 1, params[i]);
                }
            rs = ps.executeQuery();

            while (rs.next()) {
                lst.add(getObject(rs, c));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DBUtil.closeAll(rs, ps);
        }
        if (lst.size() == 0)
            return null;
        return lst;
    }

    /**
     * 通过反射得到某个对象
     */
    private T getObject(ResultSet rs, Class c) {
        T t = null;
        String colName = null;
        String methodName = null;
        String colType = null;
        try {
            // 对象的实例
            t = (T) c.newInstance();
            // 所有公共方法
            Method[] ms = c.getMethods();
            // 得到元数据
            ResultSetMetaData rsmd = rs.getMetaData();
            // 查询的所有列
            int colCount = rsmd.getColumnCount();
            for (int i = 0; i < colCount; i++) {
                // 得到列名
                colName = rsmd.getColumnName(i + 1); //
                // 得到类型
                colType = rsmd.getColumnTypeName(i + 1);
                // 拼接成set方法 setId setName setBirth setGender setAddress
                methodName = "set" + colName.substring(0, 1).toUpperCase()
                        + colName.substring(1);
                // 得到set方法
                for (Method m : ms) {
                    if (m.getName().equalsIgnoreCase(methodName)) {

                        // 调用set方法
                        if ("NUMBER".equalsIgnoreCase(colType)) {
                            try {
                                m.invoke(t, rs.getInt(colName));
                            } catch (Exception e) {
                                m.invoke(t, rs.getBoolean(colName));
                            }
                        } else
                            m.invoke(t, rs.getObject(colName));
                    }
                }
            }
        } 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值