如何通过Java操作数据库
三大厂商实现数据库的底层代码肯定不一样(不然也不会开发三套数据库)。在没有JDBC之前,如果想开发人员是面向MySQL开发的,但是一段时间后需要迁移到Oracle数据库,那么原来编写的数据库代码都不能用了。JDBC的作用是提供开发人员操作数据库的接口,然后各大厂商实现接口,开发人员只需要面向JDBC接口编程。
*属于JavaSE的一部分:有JDK就可以用
JDBC使用步骤
1.将Driver(驱动程序)注册到DriverManager(驱动程序管理者)
比如用的驱动是mySQL驱动(lib目录下的mysql-connector-java包),就需要这个步骤将驱动注册到驱动程序管理者上进行管理。
Class.forName("com.mysql.jdbc.Driver");
上述代码是类装载代码,装载一个类,会执行这个类中的静态代码块(合理利用源码资源)。com.mysql.jdbc.Driver类源码如下:
java.sql.DriverManager.regiserDriver(new Driver());达到了注册驱动的效果。
2.利用DriverManager创建Connection(数据库连接)
上一步注册好了,就已经知道了要用哪一个数据库。这一步可以用JDBC中的DriverManager来创建连接。
DriverManager.getConnection(url:"jdbc:mysql://localhost:3306/xmg",usename:"root",password:"root");
3.利用Connection创建Statement(语句)
Statement stmt=conn.createStatement();
4.利用
stmt.execute(sql:"");
5.关闭资源(关闭Statement、Connection)
stmt.close();
conn.close();
进一步,可以抽取数据库相关信息:
JDBC版本
我们只需要将供应商的Jar放在类路径中,然后DriverManager就可以自动检测并加载驱动程序:所以Class.forName(driverClassName);不用写了,程序会自动干这件事情。
private static void test2() {
// 0.数据库相关的信息
// JDK7开始,try-with-resources
try {
// Class.forName(driverClassName);
// DriverManager.registerDriver(new Driver());
//try-with-resource语句
try (Connection conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
Statement stmt = conn.createStatement()) {
stmt.execute("UPDATE student SET age = 100 WHERE id = 1");
}
} catch (Exception e) {
e.printStackTrace();
}
}
Statement的常见API
结果集resultSet
private static void test4() throws Exception {
try (Connection conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
Statement stmt = conn.createStatement()) {
String sql = "SELECT id myId, name myName FROM student";
ResultSet rs = stmt.executeQuery(sql); // 4:编译、解析、优化、执行
while (rs.next()) {
System.out.println(rs.getInt("myId"));
System.out.println(rs.getString("myName"));
System.out.println("---------------------");
}
}
}
依赖注入与PreparedStatement
没使用PreparedStatement:
Statement stmt = conn.createStatement()) {
String sql = "SELECT * FROM user WHERE username = '" + username + "' AND password = '" + password + "'";
System.out.println(sql);
ResultSet rs = stmt.executeQuery(sql);
使用PreparedStatement:
String sql = "SELECT * FROM user WHERE username = ? AND password = ?";
try (Connection conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
PreparedStatement pstmt = conn.prepareStatement(sql)) { // 3:编译、解析、优化
// 设置参数值
pstmt.setString(1, username);
pstmt.setString(2, password);
// 执行SQL语句
ResultSet rs = pstmt.executeQuery(); // 执行
if (rs.next()) {
System.out.println("登录成功");
} else {
System.out.println("登录失败,用户名或密码不正确");
}
}