1、JDBC的基本格式
Oracle驱动jar | ojdbc-x.jar |
---|---|
Oracle具体驱动类 | oracle.jdbc.OracleDriver |
Oracle连接字符串 | jdbc:oracle:thin:@localhost:1521:ORCL |
MySQL 驱动jar | mysql-connector-java-x.jar |
MySQL 具体驱动类 | com.mysql.jdbc.Driver |
MySQL 连接字符串 | jdbc:mysql://localhost:3306/数据库实例名 |
SQLServer 驱动jar | sqljdbc-x.jar |
SQLServer 具体驱动类 | com.microsoft.sqlserver.jdbc.SQLServerDriver |
SQLServer 连接字符串 | jdbc:microsoft:sqlserver:localhost:1433;databasename=数据库实例名 |
-
Class.forName(“具体驱动类”);//导入驱动包、加载具体驱动类
-
connection = DriverManager.getConnection(…); 与数据库建立连接
-
String sql=“SQL语句”;
-
通过connection,获取操作数据库的对象//.发送sql,执行(Statement\preparedStatement\callablestatement)//preparedStatement和Statement两者选一个就好了
stmt = connection.createStatement();//Statement
pstmt = connection.prepareStatement(sql);//preparedStatement -
(查询)处理结果集preparedStatement和Statement两者选一个就好了
rs=stmt.executeUpdate(sql)//处理结果集 (查询)Statement
rs = pstmt.executeQuery()//处理结果集 (查询)preparedStatement
while(rs.next()){ rs.getXxx(…) ;}
}catch(ClassNotFoundException e )
{ …}
catch(SQLException e)
{…
}
catch(Exception e)
{…
} -
关闭资源
finally
{
//打开顺序,与关闭顺序相反
if(rs!=null)rs.close()
if(stmt!=null) stmt.close();
if(connection!=null)connection.close();
}
2、JDBC API 主要功能:
三件事,具体是通过以下类/接口实现:
- DriverManager : 管理jdbc驱动
- Connection: 连接(通过DriverManager产生)
- Statement(PreparedStatement) :增删改查 (通过Connection产生 )
- CallableStatement : 调用数据库中的 存储过程/存储函数 (通过Connection产生 )
- Result :返回的结果集 (上面的Statement等产生 )
- Connection产生操作数据库的对象:
- Connection产生Statement对象:createStatement()
- Connection产生PreparedStatement对象:prepareStatement()
- Connection产生CallableStatement对象:prepareCall();
Statement操作数据库:
- 增删改:executeUpdate()
- 查询:executeQuery();
- ResultSet:保存结果集 select * from xxx
- next():光标下移,判断是否有下一条数据;true/false
- previous(): true/false
- getXxx(字段名|位置):获取具体的字段值
PreparedStatement操作数据库:
public interface PreparedStatement extends Statement
因此
- 增删改:executeUpdate()
- 查询:executeQuery();
此外
- 赋值操作 setXxx();
PreparedStatement与Statement在使用时的区别:
- Statement:
sql
executeUpdate(sql) - PreparedStatement:sql(可能存在占位符?)
在创建PreparedStatement 对象时,将sql预编译 prepareStatement(sql)
executeUpdate()
setXxx()替换占位符?
推荐使用PreparedStatement:原因如下:
- 编码更加简便(避免了字符串的拼接)
String name = “zs” ;
int age = 23 ;
-
stmt:
String sql =" insert into student(stuno,stuname) values(’"+name+"’, “+age+” ) " ;
stmt.executeUpdate(sql); -
pstmt:
String sql =" insert into student(stuno,stuname) values(?,?) " ;
pstmt = connection.prepareStatement(sql);//预编译SQL
pstmt.setString(1,name);
pstmt.setInt(2,age);
2.提高性能(因为 有预编译操作,预编译只需要执行一次)
需要重复增加100条数
-
stmt:
String sql =" insert into student(stuno,stuname) values(’"+name+"’, “+age+” ) " ;
for(100)
stmt.executeUpdate(sql); -
pstmt:
String sql =" insert into student(stuno,stuname) values(?,?) " ;
pstmt = connection.prepareStatement(sql);//预编译SQL
pstmt.setString(1,name);
pstmt.setInt(2,age);
for( 100){
pstmt.executeUpdate();
}
3.安全(可以有效防止sql注入)
sql注入: 将客户输入的内容 和 开发人员的SQL语句 混为一体
stmt:存在被sql注入的风险
(例如输入 用户名:任意值 ’ or 1=1 –
密码:任意值)
分析:
select count() from login where uname=‘任意值 ’ or 1=1 --’ and upwd =‘任意值’ ;
select count() from login where uname='任意值 ’ or 1=1 ;
select count(*) from login ;
select count(*) from login where uname=’"+name+"’ and upwd =’"+pwd+"’
pstmt:有效防止sql注入
推荐使用pstmt