JDBC java数据库连接

JDBC java数据库连接

Java DataBase Connectivity

* JDBC是java官方提供的一套结构,用于连接DBMS并进行相关操作。

 * 核心的接口:

 * Connection               表示数据库连接

 * Statement                用来执行SQL语句的语句对象

 * PreparedStatement        用来执行预编译SQL语句的语句对象

 * ResultSet                用来表示查询结果集

* 不同的DBMS提供上都会提供一套具体的实现类,并打包为jar。那么这个jar包被我们称为是连接该DBMS的驱动(Driver)

一.Statement提供了多种执行SQL的方法

1.     boolean execute(String sql)

用于向数据库执行SQL语句。该方法可以执行任何种类的SQL

但是实际上执行DML,DQL都有专门的方法,因此通常只用来执行DDL

该方法返回一个boolean值,执行该SQL后是否产生了查询结果集。

  1. int executeUpdate(String sql)

专门用于执行DML语句的,返回值表达执行该DML后影响了表中多少条记录

  1. executeQuery专门用于执行DQL语句的
  2. ResultSet重要方法:           boolean next()

 让结果集向下移动一行,返回值表示是否存在下一行。

如果存在下一行则返回true否则返回false。

try (

    Connection connection = DBUtil.getConnection();

){

  Statement statement = connection.createStatement();

String sql = "SELECT id,name,salary,title " +"FROM teacher ";

      ResultSet resultSet = statement.executeQuery(sql);

            

while(resultSet.next()){//结果集向下移动一行,并判断改行是否存在

int id = resultSet.getInt("id");

String name = resultSet.getString("name");

int salary = resultSet.getInt("salary");

String title = resultSet.getString("title");

System.out.println(id+","+name+","+salary+","+title);

            }

} catch (SQLException e) {

            e.printStackTrace();

        }

二.预编译SQL语句的写法,将原本需要拼接的"值"先用"?"代替

SELECT id,username,password,nickname,age

FROM userinfo

WHERE username='拼接' AND password='拼接'

缺陷:登录验证

* 若密码为:a' OR '1'='1

 * 会出现拼接SQL导致语义发生改变,这就是SQL注入攻击

* SELECT * FROM userinfo

 * WHERE username='hajkdshfkj' AND password='a' OR '1'='1'

预编译SQL:

SELECT id,username,password,nickname,age

FROM userinfo

WHERE username=? AND password=?

String sql = "SELECT id,username,password,nickname,age " +

  "FROM userinfo " +"WHERE username=? AND password=?";

    

    try (Connection connection = DBUtil.getConnection();){

//创建预编译SQL语句执行时将预编译SQL发送给数据库要求其理解语义

            PreparedStatement ps = connection.prepareStatement(sql);

            //执行该sql前要指明预编译SQL中"?"的值是什么

/*     ?是什么类型的值,这里就应当调用对应的set方法

例如

?表示整数时,调用ps.setInt(...)

?表示字符串时,调用ps.setString(...)

方法第一个参数表示预编译SQL中第几个"?"."?"从左往右,从上往下,并且

?"从1开始,1表示第一个"?"。   */

            ps.setString(1,"范传奇");//第一个?值

            ps.setString(2,"123456");//第二个?值

            //将值传给数据库执行该SQL

            ResultSet rs = ps.executeQuery();

            if(rs.next()){

                String nickname = rs.getString("nickname");

                System.out.println("登录成功,欢迎你:"+nickname);

            }else{

                System.out.println("登录失败,用户名或密码不正确");

            }

        } catch (SQLException throwables) {

            throwables.printStackTrace();

        }

你可能感兴趣的:(数据库,java,sql)