您的位置 首页 java

一般人不愿透露出来的Java数据库连接——JDBC编程

一. 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语句的编写在这里不做详细的介绍。

Java

3. JDBC开发原理

Java和数据库之间没有必然的联系,两者之间是如何连接的呢?虽然Java提供了各种数据库接口,但是我们并不知道各种数据库具体的实现原理,难以对接口进行具体的实现。

所以,数据库生产商提供了这些接口的实现类:驱动

Java提供访问数据库规范称为JDBC,而生产厂商提供规范的实现类称为驱动。

Java

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

二. JDBC开发步骤

JDBC一般的开发步骤如下:

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

Java

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.驱动在源码中就被注册过,驱动会被两次注册

3.Driver源码:

4.

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”.

4.3.1 key命名自定义,如果是多个单词,习惯使用点分隔。例如:jdbc.driver

5.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语言的智慧与魅力。

文章来源:智云一二三科技

文章标题:一般人不愿透露出来的Java数据库连接——JDBC编程

文章地址:https://www.zhihuclub.com/184421.shtml

关于作者: 智云科技

热门文章

网站地图