连接JDBC需要的对象

连接JDBC需要的对象
DriverManager :驱动管理对象
  • 功能:

    1. 注册驱动

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

      写代码使用:Class.froName(“com.mysql.cj.jdbc.Driver”)

      通过查看源码发现;在com.mysql.cj.jdbc.Driver类中存在静态代码块

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

      注意:mysql5之后的驱动jar包可以省略注册驱动的步骤。

    2. 获取数据库连接

      • 方法:static Connection getConnection(String url, String user , String password)
      • 参数:
        • url:指定连接的路径
          • 语法:jdbc:mysql://ip地址(域名):端口号/数据库名称(连接的是本机mysql服务器,并且mysql服务默认端口是3306,则可以写成:jdbc:mysql:///数据库名称)
        • user:用户名
        • password:密码
Connection : 数据库连接对象
  • 功能
    1. 获取执行sql的对象
      • Statement createStatement()
      • PreparedStatement prepareStatement(String sql)
    2. 管理事务
      • 开启事务:void setAutoCommit(boolean autoCommit): 调用该方法设置参数为false,即开启事务
      • 提交事务:commit()
      • 回滚事务:rollback()
Statement :执行sql语句
  1. 执行sql

    1. boolean excute(String sql) :可以执行任何sql语句

    2. int executeUpdate(String sql):执行DML(insert 、update、delete)语句(主要)、DDL(create、alter、drop)语句

      返回值是影响的行数 ,可以通过影响的行数判断DML语句是否执行成功 返回值>0的则执行成功,反之则失败

    3. ResultSet executeQuery(String sql):执行DQL(select)语句

ResultSet : 结果集对象
  • next():游标向下移动一行

  • getXxx(参数):获取数据类型

    • Xxx:代表数据类型 如:int getInt() ,String getString()

    • 参数:

      1. int:代表列的编号,从1开始 如 getString(1)
      2. String:代表列名称。 如:getDouble(“balance”)
    • 注意:

      • 使用步骤:

        1. 游标向下移动一行
        2. 判断是否有数据
        3. 获取数据
         while ( resultSet.next()){
                        //循环判断游标是否是最后一行末尾
                        // 6.2 获取数据
                        int id = resultSet.getInt(1);
                        String name = resultSet.getString("username");
                        double balance = resultSet.getDouble(3);
                        System.out.println(id+"---"+name+"----"+balance);
        }
        
  • 练习:

    • 定义一个方法,查询Account表的数据将其封装为对象,然后装载集合,返回

      1. 定义类
      2. 定义方法 public List findAll(){}
      3. 实现方法 select * from Account;
      package com.zhiyou.demo;
      
      import com.zhiyou.domain.Account;
      
      import java.sql.*;
      import java.util.ArrayList;
      import java.util.List;
      
      /*
          定义一个方法,查询Account表的数据将其封装为对象,然后装载集合,返回
       */
      public class JDBCDemo08 {
      
          public static void main(String[] args) {
              List<Account> list = new JDBCDemo08().findAll();
              System.out.println(list);
          }
      
          public List<Account> findAll(){
              ResultSet set =null;
              Statement statement=null;
              Connection conn = null;
              List<Account> list = null;
              try {
                  //1.注册驱动
                  Class.forName("com.mysql.cj.jdbc.Driver");
                  //2.获取连接
                  conn = DriverManager.getConnection("jdbc:mysql://rm-bp1l5nh94512lv5e3go.mysql.rds.aliyuncs.com:3306/java31", "myroot", "Dsw123456");
                  //3.定义sql语句
                  String sql ="select * from account";
                  //4.获取执行sql对象
                  statement = conn.createStatement();
                  //5.执行sql
                   set = statement.executeQuery(sql);
                  Account account = null;
                  list = new ArrayList<>();
                  //6.遍历结果集,封装对象,装载集合
                  while (set.next()){
                      //获取数据
                      int id = set.getInt("id");
                      String username = set.getString("username");
                      double balance = set.getDouble("balance");
                      //创建account对象,并且赋值
                      account = new Account();
                      account.setId(id);
                      account.setUsername(username);
                      account.setBalance(balance);
                      list.add(account);
                  }
              } catch (ClassNotFoundException | SQLException e) {
                  e.printStackTrace();
              }finally {
                 if (set!=null){
                     try {
                         set.close();
                     } catch (SQLException e) {
                         e.printStackTrace();
                     }
                 }
                 if (statement!=null){
                     try {
                         statement.close();
                     } catch (SQLException e) {
                         e.printStackTrace();
                     }
                 }
                 if (conn!=null){
                     try {
                         conn.close();
                     } catch (SQLException e) {
                         e.printStackTrace();
                     }
                 }
              }
      
              return list ;
          }
      
      }
      
      package com.zhiyou.domain;
      /*
          对应封装Account数据的javaBean
       */
      public class Account {
          private Integer id;
          private String username;
          private  Double balance;
      
          public Account() {
          }
      
          public Account(Integer id, String username, Double balance) {
              this.id = id;
              this.username = username;
              this.balance = balance;
          }
      
          public Integer getId() {
              return id;
          }
      
          public void setId(Integer id) {
              this.id = id;
          }
      
          public String getUsername() {
              return username;
          }
      
          public void setUsername(String username) {
              this.username = username;
          }
      
          public Double getBalance() {
              return balance;
          }
      
          public void setBalance(Double balance) {
              this.balance = balance;
          }
      
          @Override
          public String toString() {
              return "Account{" +
                      "id=" + id +
                      ", username='" + username + '\'' +
                      ", balance=" + balance +
                      '}';
          }
      }
      
      
      
      
      
      
      
      
      
PrepareStatement:执行sql的对象
  1. SQL注入问题:在拼接sql时,有一些sql的特殊关键字与字符串的拼接。会造成安全性问题
    1. 输入用户随便,输入密码:a’ or ‘a’ = 'a
    2. sql:select * from user where username = ‘aslkjaslk’ 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. 给?赋值:
      • 方法:setXxx(参数1,参数2)
        • 参数1:?的位置编号 从1开始
        • 参数2:?的值
    7. 执行sql,接受返回结果
    8. 处理结果
    9. 释放资源
  5. 注意:后期都会使用PreparedStatement来完成增删改查的所有操作
    1. 可以防止SQL注入
    2. 效率更高
 public boolean login2(String username,String password){
        if (username==null||password==null){
            return false;
        }
        //连接数据库判断是否登录成功
        Connection connection =null;
        Statement statement =null;
        ResultSet resultSet =null;
        PreparedStatement preparedStatement=null;
        //1.获取连接
        try {
            connection = JDBCUtils.getConnection();
            //2定义sql
            String sql = "select * from user where username = ? and password = ?";
            //3.获取执行sql的对象
             preparedStatement = connection.prepareStatement(sql);
             preparedStatement.setString(1,username);
             preparedStatement.setString(2,password);
            //
            resultSet = preparedStatement.executeQuery();

            return  resultSet.next();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            JDBCUtils.close(resultSet,statement,connection);
        }

        return false;
    }
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值