一. JDBC
1.// 注册驱动
-
使用 java . sql . DriverManager 类静态方法 registerDriver(Driver driver)
-
注册应使用 反射特性
Class . forName( "com . mysql . jdbc . Driver" );
推荐
DriverManager . registerDriver(new com . mysql . jdbc . Driver() ); 不推荐
2.// 获得数据库的连接
-
使用 DriverManager 类中静态方法
-
方法 法名 “Connection getConnection(String url , String user , String password)”(静态方法)
功能:获取数据库的连接,返回 Connection 接口的实现类,在 mysql 驱动程序;
url: 数据库地址 jdbc : mysql : // 连接主机 IP :端口号 / 数据库名字
例:
String url = " jdbc:mysql://localhost:3306/mybase "
String username = "root" , password = "root"
Connection con = DriverManager . getConnection( url , username , password );
System . out . println( con );
- // 获得语句执行平台
1.通过数据库连接对象,获取到 SQL 语句的执行者对象
Connection 对象调用方法 Statement createStatement( ) 获取 Statement 对象,将 SQL 语句发送到数据库
返回值是 Statement 接口的实现类,在 mysql 驱动程序
- 方法 法名 " . createStatement( )" (静态方法)
例:Statement stat = con . createStatement( );
4.// 执行 sql 语句
-
通过执行者调用方法执行 SQL 语句,获取结果
-
方法 法名 “executeUpdate( String sql )”
功能:执行数据库中的 SQL 语句,只能进行 insert delete update 。 返回 int 类型
例:int row = state . executeUpdate("INSERT INTO sort ( sname,sprice,sdesc ) VALUES ( '汽车用品' , 500000 , '疯狂涨价' )");
- 使用查询功能后要进行释放资源 . close( );
例:state . close( ); con . close( );
- 方法 法名 “executeQuery( String sql )”
功能:获取结果集执行 SQL 语句中的 select 查询,返回值 ResultSet 接口的实现类对象,实现类在 mysql 驱动中;
例:
String sql = "SELECT * FROM sort";
ResultSet rs = state . executeQuery( sql );
- 方法 法名 “next( )” (ResultSet 的接口方法)
功能:判断是否有结果集,有的话返回 true ,没有返回 false ;
例:
while( rs . next() ){
System . out . println( rs . getInt("") + " " + rs . getString("") + " " + rs . getDouble("") );
}
额:① 可以使用 getObject 方法
② 可以使用 getString 方法
这两种方法比较万能;
二. 比较推荐的方法
// PreparedStatement 接口
- 防止注入攻击
Statement 接口实现类,作用执行 SQL 语句,返回结果集
有一个子接口 PreparedStatement (SQL 预编译储存,多次高效的执行 SQL)
PreparedStatement 的实现类数据库的驱动中,如何获取接口的实现类
- 方法 法名"prepareStatement(String sql)"
功能:SQL 预编译储存,多次高效的执行 SQL,返回结果集;返回 PreparedStatement 类型;
该方法中所有参数, SQL 语句中的参数全部采用问号占位符
案例:
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/mybase";
String username = "root" , password = "root";
Connection con = DriverManager.getConnection(url, username, password);
String sql = "SELECT * FROM users WHERE username=? AND PASSWORD=?";
PreparedStatement pst = con . prepareStatement( sql );
pst . setObject( 1 , user );
pst . setObject( 2 , pass );
ResultSet rs = pst . executeQuery( );
① 方法 法名 “setObject( )”
功能:调用 pst 对象 set 方法,设置问号占位符上的参数
- 方法 法名 “executeQuery( )”(PreparedStatement的方法)
功能:执行查询语句;返回 ResultSet 类型;
例:
ResultSet rs = pst . executeQuery( );
while( rs . next( ) ){
System . out . println( rs . getString("...") + " " );
}
rs . close( ); pst . close( ); con . close( );
- 注入攻击的原因是因为 statement 不安全,这并不是 JAVA 语言的问题,而是 Sql 语言本身的问题,使得可能会出现
将用户信息直接泄露的情况, 例如: “SELET * FROM users WHERE username= … AND PASSWORD=… OR 1 = 1”
这种情况会判断 1 = 1 ,错误性的进入了数据库,使得数据被泄露或者更改。