文章目录
概述
Java数据库连接(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。
导入驱动程序
在一个java程序中,如果需要使用jdbc进行连接数据库的操作,则需要导入对应数据库的驱动程序。
以MySQL为例,在MySQL的官网下载JDBC(mysql-connector-java,注意版本号需要与数据库的版本号一致),将jar包添加到java项目的lib中即可。
jdbc的示例操作流程
1.加载驱动程序
数据库的驱动程序是实现了Driver
接口的类,它一般由数据库厂商提供。加载JDBC
驱动程序最常用的方法是使用Class
类的forName()
静态方法。该方法的声明格式为:
public static Class<?> forName(String className)
throws ClassNotFoundException
参数className为字符串表示的完整的驱动程序类名。例如,对于MySQL
,获取方法为:
Class.forName("com.mysql.cj.jdbc.Driver");
Class.forName()
属于反射机制,也就是获取相关类名的类对象并加载如内存中。后续的连接获取就是通过数据库URL查找已经加载的实现Driver
接口的类,这个过程被形象地称为“注册”。因为类仅能被加载到内存一次,因此多次注册驱动程序不会出现重复注册的情况。
2.建立连接对象
驱动程序加载成功后应使用DriverManager
类的getConnection()
建立数据库对象。该方法的声明如下(未写异常抛出):
public static Connection getConnection(String dburl);
public static Connection getConnection(String dburl, String user,String password);
其中dburl表示JDBC URL
,user表示数据库用户名,password表示密码。DriverManager
类试图从注册的驱动程序中选择一个合适的驱动程序,然后建立到给定的JDBC URL
的连接。如果不能建立连接则抛出SQLException
异常。
3.创建数据库语句对象
获取到Connection
之后,可以从连接中创建数据库SQL语句对象以及在连接对象上完成相关的操作。连接对象有两种:语句对象Statement
和预处理对象PreparedStatement
。
1)Statement
Connection创建Statement对象:
Statement statement = conn.createStatement();
在执行statement语句时,需要在execute时添加语句。
2)PreparedStatement(常用)
Connection创建PreparedStatement对象:
PreparedStatement pstmt = conn.prepareStatement("select * from user"); // 需要附带sql语句
在执行statement语句时,不应在execute时添加语句。
4.执行语句/获取结果集
对于PreparedStatement
语句,执行语句可以用如下方法:
ResultSet rs = pstmt.executeQuery(); // SELECT语句
int n = pstmt.executeUpdate(); // DDL语句(INSERT、DELETE、UPDATE等)
对于Statement
对象,需要添加参数写入数据库语句。
5.释放对象
在Connection
接口、Statement
接口、ResultSet
接口都定义了close()
。当这些对象使用完毕后应使用close()
关闭。
示例代码:查询一张数据表中的用户信息
一个简单的示例代码如下,其中操作的数据库是MySQL
。
为了代码的简洁,异常我在这里直接抛出。实际操作时建议使用try-catch
捕获并处理。
public static void main(String[] args) throws ClassNotFoundException, SQLException{
Connection conn = null;
String driver = "com.mysql.cj.jdbc.Driver";
String dburl = "jdbc:mysql://127.0.0.1:3306/database?userSSL=true"; // 这句话表示连接127.0.0.1:3306(本机默认的数据库)的数据库database,使用SSL模式
String username = "root"; // root为最高权限用户,不推荐做项目使用
String password = "123456";
Class.forName(driver); // 加载驱动程序
conn = DriverManager.getConnection(dburl,username,password); // 获取连接对象
String sql = "select name,password from user where name=?";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1,"张三");
ResultSet rs = pstmt.executeQuery();
while(rs.next()) {
String name = rs.getString("name");
String password = rs.getString("password");
System.out.println("name" + "password");
}
rs.close();
pstmt.close();
conn.close();
}
一些对象的补充
各种数据库的Connection对象的获取方法
其中dbServerIP
代表连接的数据库的IP地址。
数据库 | 驱动名称 | 数据库URL |
---|---|---|
MySQL | com.mysql.cj.jdbc.Driver | jdbc:mysql://dbServerIP:3306/dbName |
Oracle | oracle.jdbc.driver.OracleDriver | jdb:oracle:thin:@dbServerIP:1521:ORCL |
SQL Server | com.microsoft.jdbc.sqlserver.SQLServerDriver | jdbc:microsoft:sqlserver://dbServerIP:1433;databaseName=master |
PostgreSQL | org.postgresql.Driver | jdbc:postgresql://dbServerIP/dbName |
PreparedStatement 预处理对象
设置占位符参数
在PreparedStatement
创建时传入的sql语句,可以用 ?
代替需要输入数据的地方,然后使用setXXX语句设置这部分的值。其中setXXX中的XXX表示类型。例如:
pstmt.setString(1,"小明"); // 把第一个占位符的位置设置成字符串小明
pstmt.setInt(3,123); // 把第三个占位符的位置设置成整型数字123
事务/批处理
以下是使用PrepareStatement对象进行批处理的典型步骤顺序:
- 使用占位符创建SQL语句。
- 使用
prepareStatement()
方法创建PrepareStatement
对象。 - 使用
setAutoCommit()
将自动提交设置为false
。 - 使用
addBatch()
方法在创建的Statement
对象上添加SQL语句到批处理中。 - 在创建的
Statement
对象上使用executeBatch()
方法执行所有SQL语句。 - 最后,使用
commit()
方法提交所有更改。
如果中途操作有误,可以使用rollback()
进行回滚。
这部分参考教程:https://www.yiibai.com/jdbc/preparestatement-batching-example.html
ResultSet 结果集
对于结果集对象,比较常用的操作方法有两类:next()
和getXXX()
。
next()
类似于Iterator
遍历器,将结果集的数据指针指向下一个位置,如果下一个位置没有元素,返回false,否则返回true。通常用下面的语句进行遍历:
while(rs.next()) {
// TODO
}
getXXX()
类似于上文的setXXX,不同的是,get也可以用select返回的字段的名称获取当前行当前字段的值。例如:
rs.getString(1); // 以字符串形式获取第一个参数
rs.getInt("userid"); // 获取整型的userid