jdbc 详解各个对象

jdbc 详解各个对象及简单登录练习


1、详解各个对象:

​ 1、DriverManager :驱动管理器

  • 功能:

    1.注册驱动(static void registerDriver(Driver driver):注册与给定的驱动程序 DriverManager)

    代码:

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

    关联性:

    在com.mysql.jdbc.Driver类中存在静态代码块:

    static{
    	try{
    		java.sql.DriverManager.registerDriver(new Driver());
    	}catch(SQLException E){
    		throw new RuntimeException("Can't register driver!")
    	}
    }
    

    2.获取数据库连接

    • 方法:static Connection getConnection(String url,String user,String password)

    • 参数:

      ​ 1、url:指定链接的路径

      ​ 语法:jdbc:mysql://ip地址(域名):端口号/数据库名称

      ​ 例如:jdbc:mysql://localhost:3306/db3

      ​ 细节:若依旧是本地ip以及默认端口号,则可以简写为:jdbc:mysql:///db3

      ​ 2、user:用户名

      ​ 3、password:密码

​ 2、Connection:数据库连接对象

  • 功能

    1、获取执行sql的对象

    • Statement createStatement()
    • PreparedStatement prepareStatement(String sql)

    2、管理事务:

    • 开启事务:void setAutoCommit(boolean autoCommit):调用该方法设置参数为false,即开启事务
    • 提交事务:commit()
    • 回滚事务:roolback()

​ 3、Statement:执行sql的对象

​ 1、执行sql:

​ (1) boolean excute(String sql);(了解)可以执行任意sql

​ (2) int excuteUpdate(String sql);执行DML(insert\update\delete)语句、ddl(create\alter\drop)语句

​ 返回值为影响行数

​ (3)ResultSet excuteQuery(String sql) :执行DQL(select)语句

​ 4、ResultSet:结果集对象,封装查询结果

  • boolean next():游标向下移动一行

  • getXxxx(参数):获取数据

    ​ Xxxx:代表数据类型 如 :int getInt() , String getString()

    ​ 参数:1、int :代表编号,从1开始

    ​ 2、String:代表列名称

  • 使用步骤:

    ​ 1、游标向下移动一行

    ​ 2、判断是否有数据

    ​ 3、获取数据

    ResultSet rs = tmt.executeUpdate(sql);
    while(rs.next()){//循环 判断游标是否有下一行
        //获取数据
        int id = rs.getInt(1);
        String name = rs.getString("sname");
        System.out.println(id + name);
    }
    

​ 5、PreparedStatement(3子类,更加强大): 执行sql的对象

​ 1、sql注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接。会造成安全性问题

​ 1、输出用户随便,输入密码:‘a’ or ‘a’ = ‘a’;

​ 2、sql:select * from user where username = ‘dsfs’ and password = ‘a’ or ‘a’ = ‘a’

​ 2、解决sql注入问题:使用PreparedStatement对象来解决

​ 3、预编译SQL:参数使用?作为占位符

​ 4、步骤:

​ 1、导入驱动jar包

​ 2、注册驱动

​ 3、获取数据库连接对象Connection

​ 4、定义sql语句

​ (注意:SQL参数使用?作为占位符。如:select * from user where username = ? and password = ? ;)

​ 5、获取执行sql语句的对象PreparedStatement Connection.prepareStatement(String sql)

​ 6、给? 赋值:

​ 1、方法:setXxxx(参数1,参数2)

​ 参数1:?的位置编号 从1开始

​ 参数2:?的值

​ 7、执行sql语句,接受返回值,不需要传递sql

​ 8、处理结果

​ 9、资源释放

​ 5、后期都会使用PreparedStatement来完成增删改查的所有操作,更加高效,防止SQL注入

抽取JDBC工具类:JDBCUtils

  • 目的:简化书写

  • 分析:

    • 注册驱动

    • 抽取一个方法获取链接

      • 需求:不传参,保证工具类的通用性
      • 解决:配置文件
        • jdbc.properties
        • url=
        • user =
        • password =
    • 抽取一个方法释放资源

/*
* JDBC工具类
* */
import java.io.FileReader;
import java.io.IOException;
import java.net.URL;
import java.sql.*;
import java.util.Properties;

public class JDBCUtils {
    private static String url;
    private static String user;
    private static String password;
    private static String driver;
    /*
    * 文件的读取,只需要读取一次即可拿到这些值。使用静态代码块
    * */
    static{
//        获取资源文件,获取值

        try {
            //1、创建Properties集合类
            Properties pro = new Properties();
//            获取src路径下的文件方式--->ClassLoader类加载器
            ClassLoader classLoader = JDBCUtils.class.getClassLoader();
            URL resource = classLoader.getResource("jdbc.properties");
            String path = resource.getPath();
            //2、加载文件
            //pro.load(new FileReader("src/jdbc.properties"));
            pro.load(new FileReader(path));
            //3、获取数据,赋值
            url = pro.getProperty("url");
            user = pro.getProperty("user");
            password = pro.getProperty("password");
            driver = pro.getProperty("driver");
            //4、注册驱动
            Class.forName(driver);
        }catch (ClassNotFoundException e) {
            e.printStackTrace();

        } catch (IOException e) {
            e.printStackTrace();
        }

    }
    /*
    * 获取连接

     */
    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(url,user,password);
    }
    public static void close(Statement stmt, Connection conn, ResultSet rs){
        if (rs != null ){
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (conn != null ){
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (stmt != null ){
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

练习

  • 需求 :

    • 通过键盘录入用户名和密码

    • 判断用户是否登陆成功

      select * from user where username = "(参数)" and password = "(参数)";
      ###若有查询结果则返回成功,否则返回失败
      
  • 步骤:

    • 创建数据表user

      create table user(
      	id int primary key auto_increment,
      	username varchar(32),
      	password varchar(32)
      );
       insert into user values(null,'zhangsan','123');
       insert into user values(null,'lisi','345');
      
    • 完整代码

      package cn.itest.jdbc;
      /*
      * 需求 :
      - 通过键盘录入用户名和密码
      - 判断用户是否登陆成功
      * */
      
      import cn.itest.util.JDBCUtils;
      
      import java.sql.*;
      import java.util.Scanner;
      
      public class jdbcdemo3 {
          public static void main(String[] args) {
      //        1、键盘录入,输入用户名和密码
              Scanner sc = new Scanner(System.in);
              System.out.println("请输入用户名:");
              String username = sc.nextLine();
              System.out.println("请输入密码:");
              String password = sc.nextLine();
      //        2、调用方法
              boolean flag = new jdbcdemo3().login(username, password);
      //        3、判断结果输出结果
              if (flag){
                  System.out.println("登录成功!");
              }else{
                  System.out.println("用户名或密码错误");
              }
          }
      //    登陆方法
          public boolean login(String username,String password){
              if(username == null || password == null){
                  return false;
              }
      //        连接数据库判断是否登录成功
              Connection conn = null;
              PreparedStatement pstmt = null;
              ResultSet rs = null;
      
      
              try {
                  //1、获取连接
                  conn = JDBCUtils.getConnection();
      //            2、定义sql
                  String sql = "select * from user where username = ? and password = ? ";
      //            3、获取执行sql的对象
                  pstmt = conn.prepareStatement(sql);
                  //给?赋值
                  pstmt.setString(1,username);
                  pstmt.setString(2,password);
      //           4、 执行查询
                  rs = pstmt.executeQuery();
      //            5、判断
                  return rs.next();
              } catch (SQLException e) {
                  e.printStackTrace();
              }finally {
                  JDBCUtils.close(pstmt,conn,rs);
              }
      
      
              return false;
          }
      }
      
      

                                                黑马
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

文D刀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值