欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JavaSE (回顾 JDBC 并完成查询)

程序员文章站 2024-03-19 20:10:10
...

回顾 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(每页显示数目))

JavaSE (回顾 JDBC 并完成查询)