共计 4702 个字符,预计需要花费 12 分钟才能阅读完成。
一、准备驱动
准备 mysql 数据库的驱动 jar 包:mysql-connector-java-5.1.13-bin.jar;
二、获取连接
获取连接需要两步:
一是使用 DriverManager 来 注册驱动
二是使用 DriverManager 来 获取 Connection 对象 ( 连接对象)。
注册驱动
看清楚了,注册驱动就只有一句话:Class.forName(“com.mysql.jdbc.Driver”),下面的内容都是对这句代码的解释。今后我们的代码中,与注册驱动相关的代码只有这一句。
DriverManager 类的 registerDriver()方法的参数是 java.sql.Driver,但 java.sql.Driver 是一个接口,实现类由 mysql 驱动来提供,mysql 驱动中的 java.sql.Driver 接口的实现类为 com.mysql.jdbc.Driver!那么注册驱动的代码如下:
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
上面代码虽然可以注册驱动,但是出现硬编码(代码依赖 mysql 驱动 jar 包),如果将来想连接 Oracle 数据库,那么必须要修改代码的。并且其实这种注册驱动的方式是注册了两次驱动!
JDBC 中规定,驱动类在被加载时,需要自己“主动”把自己注册到 DriverManger 中,下面我们来看看 com.mysql.jdbc.Driver 类的源代码:
com.mysql.jdbc.Driver.java
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!");
}
}
……
}
com.mysql.jdbc.Driver 类中的 static 块会创建本类对象,并注册到 DriverManager 中。这说明只要去加载 com.mysql.jdbc.Driver 类,那么就会执行这个 static 块,从而也就会把 com.mysql.jdbc.Driver 注册到 DriverManager 中,所以可以把 注册驱动类 的代码修改为 加载驱动类。
Class.forName(“com.mysql.jdbc.Driver”);
获取连接
获取连接的也只有一句代码:DriverManager.getConnection(url,username,password),其中 username 和 password 是登录数据库的用户名和密码,如果我没说错的话,你的 mysql 数据库的用户名和密码分别是:root、123。
url相对复杂一点,它是用来找到要连接数据库“网址”,就好比你要浏览器中查找百度时,也需要提供一个 url。下面是 mysql 的 url:
jdbc:mysql://localhost:3306/mydb1
JDBC 规定url 的格式由三部分组成,每个部分中间使用逗号分隔。
第一部分是 jdbc,这是固定的;
第二部分是数据库名称,那么连接 mysql 数据库,第二部分当然是 mysql 了;
第三部分是由数据库厂商规定的,我们需要了解每个数据库厂商的要求,mysql 的第三部分分别由 数据库服务器的 IP 地址 (localhost)、 端口号(3306),以及 **DATABASE 名称(mydb1)** 组成。
下面是获取连接的语句:
Connection con = DriverManager.getConnection(“jdbc:mysql://localhost:3306/mydb1”,”root”,”123”);
还可以在 url 中提供参数:
jdbc:mysql://localhost:3306/mydb1**?useUnicode=true&characterEncoding=UTF8**
useUnicode 参数指定这个连接数据库的过程中,使用的字节集是 Unicode 字节集;
characherEncoding 参数指定连接数据库的过程中,使用的字节集编码为 UTF- 8 编码。请注意,mysql 中指定 UTF- 8 编码是给出的是 UTF8,而不是 UTF-8。要小心了!
三、获取 Statement
在得到 Connectoin 之后,说明已经与数据库连接上了,下面是通过 Connection 获取 Statement 对象的代码:
Statement stmt = con.createStatement();
Statement 是用来向数据库发送要执行的 SQL 语句的!
四、发送 SQL 增、删、改语句
定义 sql 语句
String sql =“insert into user value(’zhangSan’,’123’)”;
执行增删改的方法:executeUpdate(String sql)
int m = stmt.executeUpdate(sql);
其中 int 类型的返回值表示执行这条 SQL 语句所影响的行数,我们知道,对 insert 来说,最后只能影响一行,而 update 和 delete 可能会影响 0~n 行。
如果 SQL 语句执行失败,那么 executeUpdate()会抛出一个 SQLException。
五、发送 SQL 查询语句
定义 sql 语句
String sql =“select * from user”;
执行查询语句
ResultSet rs = stmt.executeQuery(sql);
请注册,执行查询使用的不是 executeUpdate()方法,而是 executeQuery()方法。executeQuery()方法返回的是 ResultSet,ResultSet 封装了查询结果,我们称之为结果集。
六、读取结果集中的数据
ResultSet 就是一张二维的表格,它内部有一个“行光标”,光标默认的位置在“第一行上方”,我们可以调用 rs 对象的 next()方法把“行光标”向下移动一行,当第一次调用 next()方法时,“行光标”就到了第一行记录的位置,这时就可以使用 ResultSet 提供的 getXXX(int col)方法来获取指定列的数据了:
rs.next();// 光标移动到第一行
rs.getInt(1);// 获取第一行第一列的数据
当你使用 rs.getInt(1)方法时,你必须可以肯定第 1 列的数据类型就是 int 类型,如果你不能肯定,那么最好使用 rs.getObject(1)。在 ResultSet 类中提供了一系列的 getXXX()方法,比较常用的方法有:
Object getObject(int col)
String getString(int col)
int getInt(int col)
double getDouble(int col)
七、关闭
与 IO 流一样,使用后的东西都需要关闭!关闭的顺序是先得到的后关闭,后得到的先关闭。
rs.close();
stmt.close();
con.close();
八、代码实现
获取连接的方法
public static Connection getConnection() throws Exception {Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/mydb1";
return DriverManager.getConnection(url, "root", "poi");
}
执行插入的方法
@Test
public static void insert() throws Exception {Connection con = getConnection();
Statement stmt = con.createStatement();
String sql = "insert into user values('zhangSan','123')";
stmt.executeUpdate(sql);
System.out.println("插入成功!");
}
执行更新的方法
@Test
public static void update() throws Exception {Connection con = getConnection();
Statement stmt = con.createStatement();
String sql = "update user set password='456'where username='zhangSan'";
stmt.executeUpdate(sql);
System.out.println("修改成功!");
}
执行删除的方法
@Test
public static void delete() throws Exception {Connection con = getConnection();
Statement stmt = con.createStatement();
String sql = "delete from user where username='zhangSan'";
stmt.executeUpdate(sql);
System.out.println("删除成功!");
}
执行查询的方法
@Test
public static void query() throws Exception {Connection con = getConnection();
Statement stmt = con.createStatement();
String sql = "select * from user";
ResultSet rs = stmt.executeQuery(sql);
while(rs.next()) {String username = rs.getString(1);
String password = rs.getString(2);
System.out.println(username + "," + password);
}
}
九、规范化代码
所谓规范化代码就是无论是否出现异常,都要关闭 ResultSet、Statement,以及 Connection,如果你还记得 IO 流的规范化代码,那么下面的代码你就明白什么意思了。
@Test
public void query() {Connection con = null;
Statement stmt = null;
ResultSet rs = null;
try {con = getConnection();
stmt = con.createStatement();
String sql = "select * from user";
rs = stmt.executeQuery(sql);
while(rs.next()) {String username = rs.getString(1);
String password = rs.getString(2);
System.out.println(username + "," + password);
}
} catch(Exception e) {throw new RuntimeException(e);
} finally {try {if(rs != null) rs.close();
if(stmt != null) stmt.close();
if(con != null) con.close();} catch(SQLException e) {//throw new RuntimeException(e);
e.printStackTrace();}
}
}