接口与步骤
导入jdbc驱动包
加载数据库驱动
Class.forName(“com.mysql.jdbc.Driver”); //mysql
Class.forName(" oracle.jdbc.driver.OracleDriver"); //oracle
创建数据库链接对象
DriverManager类
作用:1) 管理和注册驱动。 2) 创建数据库的连接。
类中的方法:
DriverManager 类中的静态方法 | 描述 |
---|---|
Connection getConnection (String url, String user, String password) | 通过连接字符串,用户名,密码来得到数据 库的连接对象 |
Connection getConnection (String url, Properties info) | 通过连接字符串,属性对象来得到连接对象 |
数据库URL
常用数据库URL地址的写法:
Oracle:jdbc:oracle:thin:@localhost:1521:orcl
SqlServer:jdbc:microsoft:sqlserver://localhost:1433; DatabaseName=shen
MySql:jdbc:mysql://localhost:3306/shen
Connection
与特定数据库的连接(会话)。在连接上下文中执行 SQL 语句并返回结果。
Collection是数据库编程中最重要的一个对象,客户端与数据库所有交互都是通过connection对象完成的,创建方法为:
Connection conn = DriverManager.getConnection(url,user,pass);
这个对象的常用方法:
方法 | 描述 |
---|---|
createStatement() | 创建向数据库发送sql的statement对象。 |
prepareStatement(sql) | 创建向数据库发送预编译sql的PrepareSatement对象。 |
prepareCall(sql) | 创建执行存储过程的callableStatement对象。 |
setAutoCommit(boolean autoCommit) | 设置事务是否自动提交。 |
commit() | 在链接上提交事务。 |
rollback() | 在此链接上回滚事务。 |
String url = "jdbc:oracle:thin:@localhost:1521:orcl";
String username = "scott";
String password = "tiger";
Connection conn = null;
//2.获取与数据库的链接
conn = DriverManager.getConnection(url, username, password);
创建statement对象
Statement
用于执行静态 SQL 语句并返回它所生成结果的对象。
所有已知子接口: CallableStatement, PreparedStatement 。
Jdbc程序中的Statement对象用于向数据库发送SQL语句,创建方法为:
Statement stmt = conn.createStatement();
Statement对象常用方法:
方法 | 含义 |
---|---|
executeQuery(String sql) | 用于向数据发送查询语句。 |
executeUpdate(String sql) | 用于向数据库发送insert、update或delete语句 |
execute(String sql) | 用于向数据库发送任意sql语句 |
addBatch(String sql) | 把多条sql语句放到一个批处理中。 |
executeBatch() | 向数据库发送一批sql语句执行。 |
Statement stmt = null;
//3.获取用于向数据库发送sql语句的statement
stmt = conn.createStatement();
//4.向数据库发sql
String sql = "select empno,ename,sal from emp";
stmt.executeQuery(sql);
PrepareStatement
表示预编译的 SQL 语句的对象。
所有已知子接口: CallableStatement
它的实例对象可以通过调用:
PreperedStatement pstm = conn.preparedStatement()
PreperedStatement pstm = null;
String sql = "select * from users where name=? and password=?";
//3.获取用于向数据库发送sql语句的Preperedstatement
pstm = conn.preparedStatement(sql);//在此次传入,进行预编译
pstm.setString(1, username);
pstm.setString(2, password);
//4.向数据库发sql
pstm.executeQuery();//在这里不需要传入sql
比较:相对于Statement对象而言
- PreperedStatement可以避免SQL注入的问题。
如:String sql=“select * from admin where loginname=’”+loginName+"+and loginpwd=’"+loginPwd+"’";
在应用中:
-》请输入账号: 333
-》请输入密码: wer’or’1’='1
实际上发送:select * from admin where loginname=‘333’ and loginpwd=‘wer’or’1’=‘1’,登录成功! - Statement会使数据库频繁编译SQL,可能造成数据库缓冲区溢出。PreparedStatement可对SQL进行预编译,从而提高数据库的执行效率。
- 并且PreperedStatement对于sql中的参数,允许使用占位符的形式进行替换,简化sql语句的编写。
CallableStatement
用于执行 SQL 存储过程的接口。
填充结果集
Jdbc程序中的ResultSet用于代表Sql语句的执行结果。Resultset封装执行结果时,采用的类似于表格的方式,ResultSet 对象维护了一个指向表格数据行的游标,初始的时候,游标在第一行之前,调用ResultSet.next() 方法,可以使游标指向具体的数据行,进行调用方法获取该行的数据。
ResultSet
表示数据库结果集的数据表,通常通过执行查询数据库的语句生成。
1、获取行
- ResultSet提供了对结果集进行滚动的方法:
next():移动到下一行
Previous():移动到前一行
absolute(int row):移动到指定行
beforeFirst():移动resultSet的最前面。
afterLast() :移动到resultSet的最后面。
2、获取值
- ResultSet既然用于封装执行结果的,所以该对象提供的都是用于获取数据的get方法:
获取任意类型的数据
getObject(int index)
getObject(string columnName)
获取指定类型的数据,例如:
getString(int index)
getString(String columnName)
ResultSet rs = null;
//4.向数据库发sql,并获取代表结果集的resultset
String sql = "select empno,enamesal,birthday from emp";
rs = pstm.executeQuery(sql);
关于 ResultSet 接口中的注意事项:
- 如果光标在第一行之前,使用 rs.getXX()获取列值,报错:Before start of result set
- 如果光标在最后一行之后,使用 rs.getXX()获取列值,报错:After end of result set
- 使用完毕以后要关闭结果集 ResultSet,再关闭 Statement,再关闭 Connection
遍历结果集
//5.取出结果集的数据
rs.afterLast();
rs.previous();
System.out.println("id=" + rs.getInt("empno"));
System.out.println("name=" + rs.getStringt("name"));
System.out.println("password=" + rs.getDouble("sal"));
System.out.println("birthday=" + rs.getObject("birthday"));
//循环取出
while (rs.next()) {
System.out.println(rs.getInt("empno")+"\t"+rs.getString("ename")+"\t"+
rs.getDouble("sal"));
}
关闭连接
Jdbc程序运行完后,切记要释放程序在运行过程中,创建的那些与数据库进行交互的对象,这些对象通常是ResultSet, Statement和Connection对象。
注意:为确保资源释放代码能运行,资源释放代码也一定要放在finally语句中。
- 需要释放的对象:ResultSet 结果集,Statement 语句,Connection 连接
- 释放原则:先开的后关,后开的先关。ResultSet Statement Connection
- 放在哪个代码块中:finally 块
//7.关闭链接,释放资源
finally {
try {
if(rs!=null) {
rs.close();
rs =null;
}
if(stmt!=null) {
stmt.close();
stmt =null;
}
if(conn!=null) {
conn.close();
conn =null;
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
JDBC配置使用
// 第一步: 首先注册驱动, 驱动一般只会注册一次
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 第二步:建立连接 Connect, 设置url ,用户名, 密码
// url格式:JDBC:子协议:子名称//主机名:端口/数据库名?属性名=属性值&…
// 注意的是url中一定不要加多余的空格,否则会出错, useSSL=false是为了解决身份验证时出现的警告的问题
// String url = "jdbc:mysql://localhost:3306/test?" + "user=root&password=wsw011152&useUnicode=true&characterEncoding=UTF-8&useSSL=false";
String url = "jdbc:mysql://localhost:3306/test?useSSL=false";
String name = "root";
String psw = "******";
Connection connect = null;
try {
connect = DriverManager.getConnection(url, name, psw);
// connect = DriverManager.getConnection(url);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 第三步: 创建一个 Statement ,一般建议使用 PreparedStatement
// 1、执行静态SQL语句。通常通过Statement实例实现。
// 2、执行动态SQL语句。通常通过PreparedStatement实例实现。
// 3、执行数据库存储过程。通常通过CallableStatement实例实现。
// String sql = "select * from user where id = ?";
String sql = "select * from user where id = ?";
try {
PreparedStatement ps = connect.prepareStatement(sql);
ps.setInt(1, 1); // 设置参数
// 第四步: 执行语句,获得一个结果集,处理获得的结果
ResultSet result = ps.executeQuery();
while (result.next()){
System.out.println(result.getInt("id"));
System.out.println(result.getString("name"));
System.out.println(result.getInt("age"));
System.out.println(result.getString("salary"));
}
// 第五步: 关闭资源
result.close();
ps.close();
connect.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}