Java数据库连接——JDBC编程

本文概述

本篇文章将分四块内容对JDBC编程进行介绍:
一. JDBC编程概述
二. JDBC开发步骤
三. 工具类撰写和使用
四. properties配置文件

一. JDBC编程概述

1. 什么JDBC

  JDBC(Java Database Connection):为多种关系数据库提供统一访问。它由一组用Java语言编写的类和接口组成。是Java访问数据库的标准和规范。

2. 常见数据库介绍

  Mysql:开源免费的数据库,小型的数据库。非常实用和受欢迎。已经被Oracle收购了.MySQL6.x版本也开始收费。
  Oracle:收费的大型数据库,Oracle公司的产品。一般中大型公司会使用。Oracle收购了SUN公司,Mysql数据库。
  DB2:IBM公司的收费数据库产品。常应用在银行系统和金融系统中.
  SQLServer:MicroSoft 公司收费的中型的数据库。常常在C#、.net等语言中使用。
  SyBase:提供了一个非常专业数据建模的工具PowerDesigner,但是数据库本身已经淡出历史舞台。
  SQLite: 嵌入式的小型数据库,基本上用于移动端。
  Java相关的数据库:MYSQL,Oracle。
  数据库的设计和开发,sql语句的编写在这里不做详细的介绍。

oracle.jpg

3. JDBC开发原理

  Java和数据库之间没有必然的联系,两者之间是如何连接的呢?虽然Java提供了各种数据库接口,但是我们并不知道各种数据库具体的实现原理,难以对接口进行具体的实现。
  所以,数据库生产商提供了这些接口的实现类:驱动
  Java提供访问数据库规范称为JDBC,而生产厂商提供规范的实现类称为驱动。

JDBC原理图.png

  JDBC是接口,驱动是接口的实现,没有驱动将无法完成数据库连接,从而不能操作数据库。每个数据库厂商都需要提供自己的驱动,用来连接自己公司的数据库。

二. JDBC开发步骤

JDBC一般的开发步骤如下:

首先要从官方网站上下载Mysql的驱动,并通过Eclipse导入驱动(jar包)

导入驱动的方法.png

JDBC开发步骤如下:

  1. 注册驱动(Driver)
  2. 获得连接(Connection)
  3. 获得语句执行平台(Statement)
  4. 使用SQL语句进行处理
  5. 释放资源,关闭链接
数据库中创建示例:
create table users(
  username varchar(10),
  pass varchar(10),
  nicheng varchar(30)
);
insert into users (username,pass,nicheng) values('wjy','wjykl22','凉凉夜色为你思念成河');
select * from users;
Java连接数据库
1.注册驱动:

官方API推荐方法:

Class.forName("com.mysql.jdbc.Driver");

不推荐使用DriverManager.registerDriver(new com.mysql.jdbc.Driver());注册,以上代码有两点不足:

  1. 硬编码,后期不易维护
  2. 驱动在源码中就被注册过,驱动会被两次注册
    Driver源码:
public class Driver extends NonRegisteringDriver implements java.sql.Driver {
    static {
        try {
            java.sql.DriverManager.registerDriver(new Driver());
        } catch (SQLException E) {
            throw new RuntimeException("Can't register driver!");
        }
    }
}
2.获得连接:
String url = "jdbc:mysql://localhost:3306/jdbc";
String username = "root";
String password = "wjykl22";
Connection con = DriverManager.getConnection(url, username, password);

其中url:需要连接数据库的位置(网址)目前来说格式基本上固定。

第一部分:jdbc,这是固定的;
第二部分:数据库名称,我们连接的是Mysql数据库,所以使用Mysql
第三部分:由数据库厂商规定的,每个厂商都有各自的要求,分别由数据库服务器的IP地址(localhost)、端口号(3306),以及DATABASE名称(jdbc)组成。

username:数据库用户名。
password:数据库密码。
采用上述方法就可以获得数据库的链接。

3.获得执行平台并执行sql语句
Statement stat = con.createStatement();
int executeUpdate(String sql);//用于执行insert update delete语句.
ResultSet executeQuery(String sql); //用于执行select语句.
boolean execute(String sql); //用于执行select返回true 执行其他的语句返回false.
4.结果集处理

得到ResultSet结果集后,需要对其中的数据进行数据的提取,对于ResultSet结果集的处理方法:

Object getObject(int index) / Object getObject(String name) 获得任意对象
String getString(int index) / Object getObject(String name) 获得字符串
int getInt(int index) / Object getObject(String name) 获得整形
double getDouble(int index) / Object getObject(String name) 获得双精度浮点型
5.释放资源

最后一步就是释放资源,与IO释放资源的方式如出一辙。

rs.close();
stmt.close();
con.close();
总结

完整的上述步骤如下:

public class JDBCDemo {
    public static void main(String args[]) {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            String url = "jdbc:mysql://localhost:3306/jdbc";
            String username = "root";
            String password = "wjykl22";
            Connection con = DriverManager.getConnection(url, username, password);
            Statement stat = con.createStatement();
            stat.executeUpdate("insert into users (username,pass,nicheng) values('wjy2','wjykl33','如水流央')");
            ResultSet rs = stat.executeQuery("select * from users");
            while(rs.next()) {
                System.out.println(rs.getString("username")
                      +"\t"+rs.getString("pass")+"\t"+rs.getString("nicheng"));
            }
            rs.close();
            stat.close();
            con.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

预处理对象方法

  为了防止代码存在SQL注入漏洞,使得代码更加完善,我们一般采用预处理对象:PreparedStatement
  每条sql语句所有的实际参数,都使用逗号分隔。

1. 预处理对象并执行sql语句
String sql = "insert into sort(sid,sname) values(?,?)";
PreparedStatement psmt = conn.prepareStatement(sql)
2. 设置实际参数
void setXxx(int index, Xxx xx)

完整的代码程序段如下:

public class LoginDemo {
    /*
     * Java程序实现用户的登录,用户名和密码,数据库检查
     * 防止注入攻击
     * Statment有一个子接口PrepareStatment,表示预编译的SQL语句对象,可以高效的执行
     * 这个方法是Connection数据库连接的方法
     * 如何获取这个实现类呢?
     */
    public static void main(String args[]) throws Exception {
        Class.forName("com.mysql.jdbc.Driver");
        String url = "jdbc:mysql://localhost:3306/world";
        String username = "root";
        String password = "wjykl22";
        Connection con = DriverManager.getConnection(url,username,password);
        Scanner sc = new Scanner(System.in);
        String user = sc.nextLine();
        String pass = sc.nextLine();    
        //执行sql语句,查询用户名和密码。
        //注意要写问号
        String sql = "select * from users where username =? and pass =?";
        java.sql.PreparedStatement pst = con.prepareStatement(sql);
        //调用pst中的set方法
        pst.setObject(1, user);
        pst.setObject(2, pass);

        System.out.println(sql);
        ResultSet rs = pst.executeQuery();
        while(rs.next()) {
            System.out.println(rs.getString("username") + "    " + rs.getString("pass"));
        }
    }
}

三. 工具类撰写和使用

  作为一名程序员最应该学会的事情就是偷懒。设想一下,如果我们要在多各程序中使用Mysql数据库,会有很多代码重复使用,我们可以创建一个工具类Utils,通过工具类来完成注册驱动,获得链接,获得执行平台以及释放资源的操作。
  
  代码如下:

public class JDBCUtils {
    public static final  String DRIVERNAME = "com.mysql.jdbc.Driver";
    public static final  String URL = "jdbc:mysql://localhost:3306/mydb";
    public static final  String USER = "root";
    public static final  String PASSWORD = "root";
    static {
        try {
            Class.forName(DRIVERNAME);
        } catch (ClassNotFoundException e) {
            System.out.println("数据库驱动注册失败!");
        }
    }
    public static Connection getConn() throws Exception {
        Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
        return conn;
    }
}

通过调用Utils类中的各种静态方法来达到重复利用代码的效果。

四. properties配置文件

  上述代码还是不太方便,如果要修改某个参数,需要修改源代码,有没有方法能够不修改源代码就能够完成配置的修改呢?
  通常情况下,我们习惯使用properties文件来存储与数据库有关的配置文件。

  1. 文件位置:任意,建议src下
  2. 文件名称:任意,扩展名为properties
  3. 文件内容:一行一组数据,格式是“key=value”.
    3.1 key命名自定义,如果是多个单词,习惯使用点分隔。例如:jdbc.driver
    3.2 value值不支持中文,如果需要使用非英文字符,将进行unicode转换。
例如:

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/jdbc
user=root
password=root

加载配置文件properties的方法:

  对应properties文件处理,开发中也使用Properties对象进行。我们将采用加载properties文件获得流,然后使用Properties对象进行处理。

public class JDBCUtils {
    private static String driver;
    private static String url;
    private static String user;
    private static String password;
    static {
        try {
            // 1. 使用Properties处理流
            // 使用load()方法加载指定的流
            Properties props = new Properties();
            Reader is = new FileReader("db.properties");
            props.load(is);
            // 2. 使用getProperty(key),通过key获得需要的值,
            driver = props.getProperty("driver");
            url = props.getProperty("url");
            user = props.getProperty("user");
            password = props.getProperty("password");
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 获得连接
     */
    public static Connection getConnection() {
        try {
            // 1 注册驱动
            Class.forName(driver);
            // 2 获得连接
            Connection conn = DriverManager.getConnection(url, user, password);
            return conn;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

总结

  JDBC编程是Java学习中的重点,对于初学Java的学习者来说也是一大难点,需要大量的练习和经验的总结。JDBC经常和WEB一起使用,在之后文章中会结合具体的案例对JDBC进行进一步讲解。欢迎继续观看后续内容,一起体会Java语言的智慧与魅力。

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

推荐阅读更多精彩内容