JDBC(Day29)----JDBC安装与使用,JDBC注册与登录案例,sql注入问题

1.为什么要使用JDBC?

学习数据库的目标是让数据库存储与管理我们项目的数据

项目是使用java写的,所以使用JDBC技术将java程序与数据库链接

2.Jdbc是什么?

JDBC(java与数据库连接):java database contectivity

该技术是由java提供的一种操作数据库的技术,并提供了统一的标准

但是该技术不在JDK中,所以我们需要下载并使用提供JDBC技术的jar包

Jar包本质:就是别人写好的代码打成类似于压缩包的文件,可以理解为大型工具包

3.下载驱动包与使用

下载地址: https://mvnrepository.com/

在搜索框输入mysql

选择mysql connect java,

选择对应版本后点击版本,进入后点击jar下载即可

使用jar包

步骤:

  1. 在项目的根目录下创建文件夹,这个文件夹必须命名为lib

  1. 然后将下载的jar包粘贴到lib文件夹下

3.选中jar包,点击右键,然后选中 ADD as libxxx,然后就可以了

注意:一个项目只需添加一次jar包

  1. JDBC的操作步骤
  1. 加载驱动,反射的技术

Jar5.x的驱动位置:com.mysql.jdbc.driver

Jar8.x的驱动位置:com.mysql.cj.jdbc.Driver

语法:

Class.forName(“驱动类所在的包名.类名”);

  1. 创建链接

语法:

Connection c=DriverManger.getConnection(数据库url,数据库账号,数据库密码);

  1. 获取sql语句执行对象

//存在sql注入问题

Statement s=c.createStatements();

//解决了sql注入问题

PreparedStatement s=c.prepareStatement(sql);

  1. 执行sql语句

//用于执行DML操作,返回值是受影响行数

Int num=s.executeUpdate();

//用于执行DQL操作,返回值是查询到的结果

ResultSet set=s.executeWQuery();

  1. 处理结果

根据业务决定

  1. 关闭资源

如果执行的是查询操作需要关闭查询结果集

关闭sql语句执行

关闭链接对象

JDBC操作核心类:

DriverManger:驱动管理器

  作用:获取连接

提供的方法:

Connection getConnection(url,username,password);

Connection:数据库连接对象

作用:获取sql语句执行对象,执行事务

注意:默认自动提交

提供的方法:

    //存在sql注入问题

Statement createStatements();

//解决了sql注入问题

PreparedStatement  prepareStatement(sql);

//用于调用存储过程

CallableStatement prepareCall(String sql);

//回滚

Void rollback();

//提交

Void commit();

//设置是否自动提交,默认为true

//c.setAutoCommit(false):关闭自动添加并开启事务

Void setAutoCommit(Boolean autoCommit);

Statements

作用:执行sql语句

提供的方法:

Int executeUpdate();用于执行DML操作

ReusltSet executeWQuery():用于执行DQL操作

Boolean execute();用于执行DDL操作

子类:

preparedStatement

作用:解决sql注入问题

提供的方法:

setInt(?号的位置,替换?号的值);

setString(?号的位置,替换?号的值);

注意:?表示占位符,位置从1开始

子类:

CallableStatement

作用:调用存储过程

ResultSet

作用:存储查询的结果

提供的方法:

Boolean next():移动游标

Getint(列名);

getString(列名);

       

  1. JDBC注册案例

package com.qf.demo;

import java.sql.*;

import java.util.Scanner;

public class Demo02 {

    static{

        try {

            Class.forName("com.mysql.jdbc.Driver");

        } catch (ClassNotFoundException e) {

            e.printStackTrace();

        }

    }

    private static final String URL="jdbc:mysql://localhost:3306/day29?useSSL=false&characterEncoding=utf-8";

    private static final String SQL_USERNAME="root";

    private static final String SQL_PASSWORD="123456";

    public static void main(String[] args) {

        try {

            regist();

        } catch (SQLException e) {

            e.printStackTrace();

        }

    }

    public static  void regist() throws SQLException {

        //注册步骤

        //1.让用户输入信息

        Scanner scanner = new Scanner(System.in);

        System.out.println("请输入账号:");

        String username = scanner.next();

        System.out.println("请输入密码:");

        String password = scanner.next();

        System.out.println("请输入昵称:");

        String name = scanner.next();

        System.out.println("请输入性别:");

        String sex = scanner.next();

        System.out.println("请输入年龄:");

        int age = scanner.nextInt();

        //2.判断账号是否存在,操作数据库查询账号是否存在

        //2.1加载驱动

        //2.2获取链接

        Connection connection = DriverManager.getConnection(URL, SQL_USERNAME, SQL_PASSWORD);

        //2.3创建sql语句执行对象

        Statement statement = connection.createStatement();

        //2.4执行sql语句

        String sql="select u_name from myuser where  u_username='"+username+"'";

        //executeQuery返回值为查询到的数据集合

        ResultSet set = statement.executeQuery(sql);

        if(set.next()){

            //查询到了数据,账号已经存在

            System.out.println("账号已存在");

            return;

        }

        //3.不存在,存储用户数据

        String sql02="insert into myuser (u_username,u_password,u_name,u_sex,u_age)values('"+username+"','"+password+"'," +

                "'"+name+"','"+sex+"','"+age+"')";

        int i = statement.executeUpdate(sql02);

        //4.判断是否存储成功,如果成功显示注册成功,否则显示注册失败

        if (i>0){

            System.out.println("注册成功");

        }else{

            System.out.println("注册失败");

        }

        if (statement!=null&&!statement.isClosed()){

            statement.close();

        }

        if (connection!=null&&!connection.isClosed()){

            connection.close();

        }

    }

}

  1. JDBC登录案例

package com.qf.demo;

import java.sql.*;

import java.util.Scanner;

public class Demo03 {

    static{

        try {

            Class.forName("com.mysql.jdbc.Driver");

        } catch (ClassNotFoundException e) {

            e.printStackTrace();

        }

    }

    private static final String URL="jdbc:mysql://localhost:3306/day29?useSSL=false&characterEncoding=utf-8";

    private static final String SQL_USERNAME="root";

    private static final String SQL_PASSWORD="123456";

    public static void main(String[] args) {

        try {

            login();

        } catch (SQLException e) {

            e.printStackTrace();

        }

    }

    public static void login() throws SQLException {

        //1.让用户输入信息

        Scanner scanner = new Scanner(System.in);

        System.out.println("请输入账号:");

        String username = scanner.next();

        System.out.println("请输入密码:");

        String password = scanner.next();

        Connection connection = DriverManager.getConnection(URL, SQL_USERNAME, SQL_PASSWORD);

        Statement statement = connection.createStatement();

        ResultSet set = statement.executeQuery("select * from myuser where u_username='" + username + "' " +

                "and u_password='" + password + "'");

        if(set.next()){

            String u_username = set.getString("u_username");

            String u_password = set.getString("u_password");

            String u_name = set.getString("u_name");

            String u_sex = set.getString("u_sex");

            int u_age = set.getInt("u_age");

            System.out.println(u_username+"\t"+u_password+"\t"+u_name+"\t"+u_sex+"\t"+u_age);

            System.out.println("登录成功");

        }

        if (set!=null){

            set.close();

        }

        if (statement!=null){

            statement.close();

        }

        if (connection!=null){

            connection.close();

        }

    }

}

  1. SQL注入问题与解决防范

preparedStatement是Statement的子类

prepareStatement需要预加载要执行的sql语句

?表示占位符,prepareStatement的一个sql语句中可以提供多个?

package com.qf.demo;

import java.sql.*;

import java.util.Scanner;

public class Demo04 {

    static{

        try {

            Class.forName("com.mysql.jdbc.Driver");

        } catch (ClassNotFoundException e) {

            e.printStackTrace();

        }

    }

    private static final String URL="jdbc:mysql://localhost:3306/day29?useSSL=false&characterEncoding=utf-8";

    private static final String SQL_USERNAME="root";

    private static final String SQL_PASSWORD="123456";

    public static void main(String[] args) {

        try {

            login01();

        } catch (SQLException e) {

            e.printStackTrace();

        }

    }

    public  static void login01() throws SQLException {

        Scanner scanner = new Scanner(System.in);

        System.out.println("请输入账号:");

        String username = scanner.next();

        System.out.println("请输入密码:");

        String password = scanner.next();

        Connection connection = DriverManager.getConnection(URL, SQL_USERNAME, SQL_PASSWORD);

        PreparedStatement preparedStatement = connection.prepareStatement("select * from myuser where u_username=? and u_password=?");

        preparedStatement.setString(1,username);

        preparedStatement.setString(2,password);

        ResultSet set = preparedStatement.executeQuery();

        if (set.next()){

            System.out.println("登录成功");

        }else{

            System.out.println("登录失败");

        }

    }

}

preparedStatement

作用:解决sql注入问题

提供的方法:

setInt(?号的位置,替换?号的值);

setString(?号的位置,替换?号的值);

注意:?表示占位符,位置从1开始

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值