java学习干货之jdbc连接与编写数据库的工具类

什么是jdbc?

全称java data base connectivity, java数据库连接。是一种执行sql语句的java API,可以为多种关系数据库提供统一访问,它是由一组用java语言编写的类和接口组成。

为什么要用jdbc?

运用jdbc就不必为访问不同数据库专门写程序了。只需要用jdbc API就过了。将Java语言和JDBC结合起来使程序员不必为不同的平台编写不同的应用程序,只须写一遍程序就可以让它在任何平台上运行,这也是Java语言编写一次,处处运行”的优势。

怎样使用jdbc?

既然jdbc这么好用?哪要怎样去使用它, 首先需要向项目中导入jdbc驱动。将驱动包导入到工程中之后,接下来就是与数据库连接的6个步骤了。

  • 第一步加载驱动类
try {
    Class.forName("oracle.jdbc.OracleDriver");
} catch (ClassNotFoundException e) {
    e.printStackTrace();
}

java中通过class.fromName()方法来加载驱动类,由于每种数据库的驱动包不一样所以它们的驱动类也是不一样的,但这个方法它会抛出一个classNotFoundException找不到类异常,所以我们需要捕获它或者是抛出这个异常

  • 第二步 连接数据库
try {
    Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@//localhost:1521/orcl","system","12345678");
} catch (SQLException e) {
    e.printStackTrace();
}

这步是Java与数据的连接,通过DriverManager的getConnection()方法连接,而getConnection()方法中有三个参数分别是有数据库连接的url,每种数据库的URL是不一样的,第二个是参数是登陆数据库是的用户名,第三个参数是在登陆数据库是的密码。同时这个我方法也会抛出一个SQLException。
*第三步发送sql请求

PreparedStatement statement = connection.prepareStatement(sql);

通过第二步创建的connection对象的prepareStatement()方法返回一个 statement对象。

  • 第四步执行sql代码
ResultSet resultSet =  statement.executeQuery();
int row =  statement.executeUpdate();

通过第三步返回的statement对象的executeQuery()的方法执行查询语句返回的是一个int类型的结果,也就是影响的行数,statement的executeUpdate()的方法执行增删改,返回的算是一个结果集,这个结果集就是从数据库中查询到的数据

  • 处理结果

当我们返回的是一个结果集的时候,我们需要通过一个循环来打印这几个数据:

while (resultSet.next()){
    int newId = resultSet.getInt(1);
    String title = resultSet.getString(2);
}

如果返回的结果集它有下一项的话,就通过结果集对象的getInt等方法来打印这个结果,而这个方法中的参数是第几列或者是该列的列名。
如果返回的是一个int类型的话,说明执行的是数据库的增、删、改操作这样我们只需要判断这个int类型的书是否是大于0,如果他大于0则说明操作执行成功。否则执行失败。

  • 关闭数据库连接
try {
    if (rs != null)
        rs.close();
    if (st != null)
        st.close();
    if (conn != null)
        conn.close();
} catch (SQLException e) {
    e.printStackTrace();
}

最后要关闭数据库连接,要注意的是数据库的连接时有内向外关闭的,也就是说自开始创建的对象最后关闭,而最后创建的对象,最先关闭。
这样就实现了与数据库的连接。当我们有很多程序都需要与数据库建立连接的话,每个程序我们都需要这样写而且有大量的重复代码,是一件很麻烦的事。

有什么方法可以解决中这个问题呢?

我们可以对一些重复的代码进行封装,这样我们每次要对数据库进行操作的时候我们调用就可以了

public class DBUtils {

    // 驱动程序类
    private static final String DB_DRIVER = "oracle.jdbc.OracleDriver";
    // 数据库连接字符串
    private final static String DB_URL = "jdbc:oracle:thin:@localhost:1521:orcl";
    // 数据库账户名
    private static final String DB_ACCT = "system";
    // 数据库密码
    private static final String DB_PWD = "12345678";

    // 静态块中加载数据库驱动
    static {
        try {
            Class.forName(DB_DRIVER);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取数据库连接
     * 
     * @return Connection据库连接
     */
    public static Connection getConn() {
        try {
            return DriverManager.getConnection(DB_URL, DB_ACCT, DB_PWD);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 执行查询操作
     * 
     * @param sql
     *            查询SQL语句
     * @param args
     *            SQL语句 参数
     * @return 返回查询结果
     */
    public static Map<String, Object> query(String sql, Object... args) {
        Connection conn = getConn();// 获取数据连接
        PreparedStatement pst = null;
        ResultSet rs = null;
        try {
            pst = conn.prepareStatement(sql);
            // 设置参数
            for (int i = 0; i < args.length; i++) {
                if (args[i] != null)
                    pst.setObject(i + 1, args[i]);
            }
            // 执行查询语句
            rs = pst.executeQuery();
            if (rs.next()) {
                return rsToMap(rs);
            }
            return null;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            close(conn, pst, rs);
        }
        return null;
    }

    /**
     * 执行查询操作
     * 
     * @param sql
     *            查询SQL语句
     * @param args
     *            SQL语句 参数
     * @return 返回查询结果
     */
    public static List<Map<String, Object>> list(String sql, Object... args) {
        Connection conn = getConn();// 获取数据连接
        PreparedStatement pst = null;
        ResultSet rs = null;
        try {
            pst = conn.prepareStatement(sql);
            // 设置参数
            for (int i = 0; i < args.length; i++) {
                if (args[i] != null)
                    pst.setObject(i + 1, args[i]);
            }
            // 执行查询语句
            rs = pst.executeQuery();
            List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
            while (rs.next()) {
                Map<String, Object> map = rsToMap(rs);
                list.add(map);
            }
            return list;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            close(conn, pst, rs);
        }
        return null;
    }

    /**
     * 执行增删改操作
     * 
     * @param sql
     *            增删改SQL语句
     * @param args
     *            SQL语句 参数
     * @return 返回是否执行成功
     */
    public static boolean update(String sql, Object... args) {
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = getConn();// 获取数据库连接
            pst = conn.prepareStatement(sql);
            for (int i = 0; i < args.length; i++) {
                if (args[i] != null)
                    pst.setObject(i + 1, args[i]);
            }
            int row = pst.executeUpdate();
            return row > 0;
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            close(conn, pst, null);
        }
        return false;
    }

    /**
     * 关闭连接释放资源
     * 
     * @param conn
     *            数据库连接
     * @param st
     *            Statement对象
     * @param rs
     *            ResultSet 结果集
     */
    public static void close(Connection conn, Statement st, ResultSet rs) {
        try {
            if (rs != null)
                rs.close();
            if (st != null)
                st.close();
            if (conn != null)
                conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    /**
     * 将结果集转换成Map
     * 
     * @param rs
     *            结果集
     * @return map
     * @throws SQLException
     */
    public static Map<String, Object> rsToMap(ResultSet rs) throws SQLException {
        Map<String, Object> map = new HashMap<String, Object>();
        // 获取结果集的元信息(列名,列类型,大小,列数量等等)
        ResultSetMetaData rsmd = rs.getMetaData();
        int count = rsmd.getColumnCount();// 获取结果集中的列的数量
        for (int i = 1; i <= count; i++) {
            // 根据列的下标获取列名称
            String columnName = rsmd.getColumnName(i);
            Object value = rs.getObject(i);
            map.put(columnName.toLowerCase(), value);
        }
        // map.get("uname");
        return map;
    }

首先将数据库的连接的驱动包和url等定义为静态的常量这样就可以直接写了;然后再将加载驱动类的方法静态代码块中这样当程序调用的时候就会加载这个方法;然后在定义一个与数据库连接的方法返回值为connection,这样就可以数据库进行操作了,定义一个当个查询的方法,返回一个Map集合,这样就可以通过Map集合来存取数据了,数据库中的列名是Map集合的键而查询到的数据为值;在定义一个查询多条数据的方法,返回一个List集合,在List集合里面的嵌套以个Map集合,这样就可以对多条数据进行存取了;在定义一个增删改的方法,因为它们返回的都是sql语句在数据库所影响的行数所以可以定义成一个方法,只需要返回以boolean类型的来判断是否执行成功。这样就这个工具类就完成了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,577评论 18 399
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,598评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,479评论 25 707
  • UIView 看了网上有很多关于UIView的教程和文章,决定写一个自己的笔记来帮助自己理解学习到的只是。UIvi...
    51a6eae8afce阅读 1,817评论 0 0
  • 2017-03-04 华杉 王阳明心学,不是书斋里做出来的学问,不可把它只当一个“学说”,要结合他的人生经历去看,...
    郁萍阅读 542评论 0 0