JDBC概述
首先,我要知道JDBC是个啥东东?是sun公司提供的利用java语言操作数据库的标准。我的理解就是java世界中的sql工具类。
那它的优点在什么地方,我个人觉得就像是面向对象的思想,我不管你的实现只管api就好,我就知道你提供了诸多api供我直接操作数据库,而不用担心我操作的是mysql也好oracle也罢,它们对我的区别就是加载的驱动不同…
JDBC的几个核心类:
- DriverManager,
- Connection,
- Statement,
- ResultSet,
JDBC的套路:
- 加载驱动;
- 建立连接;
- 创建Statement对象;
- 执行sql语句;
- 处理结果集;
- 关闭资源。
我们来提供一个简单示例:
private final String URL = "jdbc:mysql://127.0.0.1:3306/mydatabase?characterEncoding=utf8&useSSL=true";
private final String USER = "root";
private final String PASSWORD = "root";
private final String QUERY = "select studentid,studentname from student";
// 加载驱动
Class.forName("com.mysql.jdbc.Driver");
// 建立连接
Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
// 创建Statement对象
Statement state = conn.createStatement();
// 获取结果集
ResultSet set = state.executeQuery(QUERY);
// 处理结果
while(set.next()){
//...
}
// 关闭连接
conn.close();
JDBC常用类和接口
1. java.sql.DriverManager类
用于加载驱动和建立数据库连接。
Class.forName("com.mysql.jdbc.Driver");
DriverManager.getConnection(“jdbc:mysql://localhost:3306/mydatabase”,”root”, “root”);
其中jdbc表示协议,mysql表示子协议,localhost代表IP,3306表示端口号,mydatabase表示要连接的数据库,第一个root表示用户名,第二个root表示密码。这些值是我示例中的配置,在项目中使用时请替换这些值。
2. java.sql.Connection类
它是一个接口用于和数据库进行交互,在各数据库驱动中都实现了该接口,它最常用的场景用于执行创建SQL语句。
conn.createStatement();
conn.close();
3. java.sql.Statement类
接口用于操作SQL语句并返回相应的结果集,在各数据库驱动中都实现了该接口。
- executeQuery(String sql) ,该方法用于执行select语句并根据查询语句返回结果集;
- executeUpdate(String sql) ,该方法用于执行insert、update、delete语句并返回受影响的行数;
- execute(String sql) ,此方法可以执行任意SQL语句。当且仅当执行select语句且有返回结果时该方法返回true, 其他情况下该方法返回false。
4. java.sql.ResultSet
用于保存执行SQL语句之后得到的结果集;各数据库驱动中均实现了该接口。ResultSet对外暴露一个游标,该游标默认指向结果集第一行之前。
ResultSet cursor;
// 向后移动一行
boolean next();
// 向前移动一行
boolean previous();
// 将光标移动到末尾,正好位于最后一行之后
void afterLast();
// 将光标移动到开头,正好位于第一行之前
void beforeFirst();
// 根据序号取值,索引从1开始
Object getObject(int index);
// 根据列名取值
Object getObject(String ColomnName);
// 获取该条数据的int值,根据索引/列名
int getInt(int colIndex);
int getInt(String colName);
// 获取该条数据的float值,根据索引/列名
int getFloat(int colIndex);
int getFloat(String colName);
// 获取该条数据的String值,根据索引/列名
int getString(int colIndex);
int getString(String colName);
// 获取该条数据的Date值,根据索引/列名
int getDate(int colIndex);
int getDate(String colName);
// 关闭ResultSet对象
void close();
5. preparedStatement防止SQL注入
preparedStatement(预编译对象)是Statement的子类,看看例子就懂了。
Connection conn = null;
PreparedStatement pState = null;
ResultSet set = null;
private final String QUERY = "select * from student where studentid=?"
public Student getStudent(int studentId){
DBUtil.connection();
pState = conn.prepareStatement(QUERY);
pstate.setInt(1, studentId);
set = pstate.executeQuery();
}