回顾 JDBC 并完成查询

回顾 JDBC 并完成查询

JDBC : (Java DataBase Connectivity) Java 连接数据库,Sun 公司推出的 Java 访问数据库的标准规范(接口)。
1、JDBC 是一种用于执行 sql 语句的 API。
2、JDBC 可以为多种关系型数据库提供统一访问入口。
3、JDBC 由一组 Java 工具类和 接口组成。

原理:
                                  
JDBC 是接口,驱动是接口的实现,没有驱动将无法完成与数据库连接,从而不能操作数据库每个数据库厂商需要提供自己的驱动,用来连接自己公司的数据库,也就是说驱动一般由各大数据库厂商提供。
当然还有第三方公司专门为某一类的数据库提供驱动,这样的驱动往往不是免费的。

例如 MySQL 的驱动是:mysql-connector-java-x.x.x-bin.jar

Junit 测试:
package com.ma.jdbc;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class TestJunit {
      
       public static void main(String[] args) {
            System. out .println( "hello jdbc !" );
            
      }
      
       @Test
       public void testJunit(){
            System. out .println( "hello Junit !" );
      }
       @Before
       public void testBefore(){
            System. out .println( "Before testJunit !" );
      }
       @After
       public void testAfter(){
            System. out .println( "After testJunit !" );
      }
}

JDBC 开发步骤:

1、注册驱动。
Class. forName( "com.mysql.jdbc.Driver" );

2、连接。
Connection conn = DriverManager. getConnection ( url , username , password );
url = jdbc:mysql://localhost:3306/uer     //Oracle:2521
url = jdbc:mysql:///user
username:用户名
password:密码

3、获得 sql 语句执行者。
String sql = "insert into category(cid, cname) values('c007', '分类')" ;
Statement 语句执行代码 : Statement stmt = conn.createStatement();


4、执行 sql 语句。
int executeUpdate(String);//执行 insert, update, delete 语句(DML语句)。
ResultSet executeQuery(String sql);//执行 select 语句(DQL语句) 。
boolean execute(String sql);//执行 select 返回 true, 执行其他语句返回 false。
   
如果返回 true,需要使用 getResultSet()获得查询结果;
    如果返回 false,需要使用 getUpdateCount()获得影响行数。
执行批处理:(可选)
    
addBatch(String sql);
    clearBatch();
    executeBatch();

特点
    如果有参数,需要在 sql 语句中进行拼凑,存在 sql 注入问题。

5、处理结果。
ResultSrt 实际上就是一张二维的表格,它内部有一个“行光标”,光标默认的位置在“第一行上方”,我们可以调用 rs 对象的 next() 方法把“行光标”向下移动一行,当第一次调用 next() 方法时,“行光标”就到了第一行记录的位置,这时候就可以使用 ResultSet 提供的 getXXX(int col) 获取指定列的数据了:
rs.next();//光标移动到第一行
rs.getInt();//获取第一行第一列的数据
Object getObject(int col);//获取任意对象
String getString(int col);//获取字符串
int getInt(int col);//获取整型
double getDouble(int col);//获取双精度浮点型 

6、释放资源。
与 IO 流一样使用后的东西都需要关闭!关闭的顺序是先得到的后关闭,后得到的先关闭。
rs.close();
stmt.close();
con.close();
模拟登录
package com.ma.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import org.junit.Test;
/**
 * 测试 sql 注入问题
 * @author young
 *
 */
public class TestLogin {
      
       @Test
       public void testLogin (){
             try {
                  login( "Jack" , "654321" );
            } catch (Exception e) {
                  e.printStackTrace();
            }
            
      }
       /**
       * 用户登录方法
       * @param username
       * @param password
       * @throws ClassNotFoundException
       * @throws SQLException
       */
       public void login(String username, String password) throws ClassNotFoundException, SQLException{
             //1、注册驱动
            Class. forName ( "com.mysql.jdbc.Driver" );
            
             //2、获取连接
            Connection conn = DriverManager. getConnection ( "jdbc:mysql://localhost:3306/user" , "root" , "123456" );
            
             //3、创建执行 sql 的对象
            Statement stmt = conn.createStatement();
            
             //4、书写 sql 语句
            String sql = "select * from t_user where " + "username = '" +username+ "' and password = '" +password+ "'" ;
            
             //5、执行 sql 语句
            ResultSet rs = stmt.executeQuery(sql);
            
             //6、对结果集处理
             if (rs.next()){
                  System. out .println( "恭喜您," +username+ "登录成功!" );
                  System. out .println(sql);
            } else {
                  System. out .println( "账号或密码错误!" );
            }
             if (rs != null ){
                  rs.close();
            }
             if (stmt != null ){
                  stmt.close();
            }
             if (conn != null ){
                  conn.close();
            }
      
      }
}

    
恭喜您,Jack登录成功!
select * from t_user where username = 'Jack' and password = '654321'

SQL攻击
1、什么是 SQL 攻击
在需要用户输入的地方,用户输入的是 sql  语句的片段,最终用户输入的 sql 片段与我们 DAO 中写的语句合成一个完整的 Sql 语句。
3、防止  SQL 攻击
    1.过滤用用户输入的数据是否包含非法字符。
    2.分布校验,先使用用户名来查询用户,如果查到了,再比较密码。
    3.使用 PreparedStatement。
PreparedStatement 是什么?
    PreparedStatment 叫做预编译声明
    PreparedStatment 是 Statment 的子接口,可以使用 PreparedStatment 来替换 Statment

好处:
防止 SQL 攻击
提高代码的可读性
提高效率
public void login1(String username, String password) throws ClassNotFoundException, SQLException{
                         //1、注册驱动
                        Class. forName ( "com.mysql.jdbc.Driver" );
                        
                         //2、获取连接
                        Connection conn = DriverManager. getConnection ( "jdbc:mysql://localhost:3306/user" , "root" , "123456" );
                        
                         //3、书写 sql 语句
                        String sql = "select * from t_user where username = ? and password = ?" ;
                        
                        
                         //4、创建预处理对象
                        PreparedStatement pstmt = conn.prepareStatement(sql);
                        
                         //5、设置参数
                        pstmt.setString(1, username);
                        pstmt.setString(2, password);
                        ResultSet rs = pstmt.executeQuery();
                        
                         //6、对结果集处理
                         if (rs.next()){
                              System. out .println( "恭喜您," +username+ "登录成功!" );
                              System. out .println(sql);
                        } else {
                              System. out .println( "账号或密码错误!" );
                        }
                         if (rs != null ){
                              rs.close();
                        }
                         if (pstmt != null ){
                              pstmt.close();
                        }
                         if (conn != null ){
                              conn.close();
                        }
                        
      }
limit 分页查询
(limit 2(起始位置), 2(每页显示数目))

猜你喜欢

转载自blog.csdn.net/young_1004/article/details/80686161