JDBC
JDBC编码的步骤:
1、加载驱动并注册驱动
Class.forName("com.mysql.jdbc.Driver");
说明:在加载Driver类时,它会自动创建自己的实例并向 DriverManager 注册该实例。
com.mysql.jdbc.Driver的源码:
1 public class Driver extends NonRegisteringDriver implements java.sql.Driver { 2 3 // Register ourselves with the DriverManager 4 static { 5 try { 6 java.sql.DriverManager.registerDriver(new Driver()); 7 } catch (SQLException E) { 8 throw new RuntimeException("Can't register driver!"); 9 } 10 } 11 12 // Construct a new driver and register it with DriverManager 13 public Driver() throws SQLException { 14 // Required for Class.forName().newInstance() 15 } 16 }
2、获取与数据库的连接:Connection
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/oa", "root", "root");
3、得到代表SQL语句的对象:Statement
Statement stmt = conn.createStatement();
4、发送SQL给数据库,如果有查询结果,则得到封装了查询结果的对象:ResultSet
ResultSet rs = stmt.executeQuery("select id,name,password,email,birthday from users");
5、遍历结果
while(rs.next()){
System.out.println(rs.getObject("id"));
System.out.println(rs.getObject("name"));
}
6、释放占用的资源
rs.close();
stmt.close();
conn.close();
JDBC中常用的接口和类
1、DriverManager
作用:注册驱动,得到数据库的连接
1.1注册驱动:
DriverManager.registDriver(new com.mysql.jdbc.Driver());(不可取)
原因: 1、严重依赖具体的数据库驱动。
2、导致驱动注册两遍,也就是在内存中会有两个Driver对象
注:new com.mysql.jdbc.Driver():在new了一个driver的同时使用DriverManager把自己给注册了(查看com.mysql.jdbc.Driver的源码可知)。
替代方案:
Class.forName("com.mysql.jdbc.Driver");
1.2获取数据库的连接:
static Connection getConnection()
2、Connection
所有与数据库交互都必须建立在连接的基础上
3、Statement
作用:代表着SQL语句
常用的方法:
ResultSet executeQuery(String sql)
int executeUpdate(String sql)
boolean execute(String sql)
PreparedStatement:处理 DML 语句的利器,有以下3点好处
1、预编译SQL语句,数据库执行效率高。
注:Statement会使数据库频繁编译SQL,可能造成数据库缓冲区溢出
2、防止SQL注入
3、支持参数占位符"?",简化sql语句的编写
PreparedStatement pstmt = conn.prepareStatement("insert into user (username, birthday) values(?,?)");
pstmt.setString(1, user.getUsername());
pstmt.setDate(2, new java.sql.Date(user.getBirthday().getTime()));
pstmt.executeUpdate();
4、ResultSet
boolean next():下移一行
boolean previous():上移一行
void absolute(int row):第一行的记录就是1
注:absolute(1) 等效于 first()、absolute(-1) 等效于last()
void beforeFirst():移动到第一行的前面
void afterLast():移动到最后一行的后面
5、释放资源
rs.close();
stmt.close();
conn.close();