今日内容
0 复习昨日
1 JDBC概述
2 JDBC开发步骤
3 完成增删改操作
4 ResultSet
5 登录案例
0 复习昨日
1 写出JQuery,通过获得id获得dom,并给input输入框赋值的语句
$(“#id”).val(“值”)2 mysql内连接和外连接的区别
内连接只会保留完全符合关联条件的数据
外连接会保留表(左外保留左表)中不符合关联条件的数据3 事务是什么?
事务是逻辑一组操作,要么全部成功,要么全部失败4 索引有什么好处和坏处
索引可以提高查询效率如果表是经常性的需要增删改,有索引在就会非常慢
1 JDBC概述
目前我们操作数据库,只能通过命令行(cmd)或者图形工具Navicat来操作数据库.
但是实际开发时配合页面数据对数据操作,如果还是使用命令行(cmd)或者图形工具Navicat来操作就很麻烦!
JDBC就是另外一种操作数据库的方式.(Java操作数据库)
JDBC: Java DataBase Connectivity Java 数据库连接
JDBC的设计思想

 
Mysql厂商提供了驱动包,如下(jar包)(jar包就是把java项目压缩打包)

驱动包,就是MYSQL厂商提供一套JDBC规范的实现.
每个知识点小问?
什么是JDBC ?
设计思想 ?
什么是jar包 ?
mysql驱动包是什么 ?
2 JDBC开发步骤
2.1 创建java项目
2.2 导入mysql驱动包
mysql厂商提供的jdbc规范的实现,要想完成JDBC操作,就需要将驱动包加入到当前项目中.
2.2.1 复制粘贴版本
- 在项目名下创建文件夹lib

- 命名为lib

-  将mysql驱动包复制粘贴到此处  
-  添加驱动包为当前项目的类库  
2.2.2 idea导入类库版本
- 打开项目结构(Project Structure)

-  选择libraries,添加jar包  

-  应用生效  
-  成功  
2.3 JDBC编程
准备数据库表,进行CRUD.
create table tb_user(
 id int(11) primary key auto_increment comment '用户编号',
 username varchar(10) comment '用户名',
 password varchar(10) comment '密码',
 phone varchar(11) comment '手机号',
 createTime date comment '注册时间',
 money double(10,2) comment '账户余额',
 sex int(1) comment '性别 1男2女'
);
需求: 使用JDBC完成对tb_user表插入数据
JDBC编程有标准步骤(八股文)
- 注册驱动 
  - 将sql语句的运行环境加载到JVM
 
- 连接数据库
- 获得执行SQL的对象
- 执行SQL语句,获得结果
- 关流
package com.qf.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
/**
 * --- 天道酬勤 ---
 *
 * @author QiuShiju
 * @desc 演示JDBC
 */
public class Demo1_insert {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        // 1 加载驱动
        // ps: 利用反射技术,将驱动类加载到JVM
        Class.forName("com.mysql.jdbc.Driver");
        // 2 通过驱动管理对象获得连接对象
        /**
         * 参数1 url: 数据库连接的地址
         *    协议://ip:端口/库名
         * 参数2 username: 数据库用户名
         * 参数3 password: 数据库密码
         */
        String url = "jdbc:mysql://localhost:3306/java2217?useSSL=false&serverTimezone=UTC";
        String username = "root";
        String password = "123456";
        Connection conn = DriverManager.getConnection(url,username,password);
        // 3 通过连接对象,创建执行sql语句的对象
        Statement statement = conn.createStatement();
        // 4 通过执行语句对象,执行sql,获得结果
        String sql = "insert into tb_user (id,username,password,phone,createTime,money,sex) values (2,'root','123456','1122200','2022-11-21',2000.0,2)";
        // 执行查询,是executeQuery()
        // 执行增删改,是executeUpdate(),返回受影响的行数
        int num = statement.executeUpdate(sql);
        if (num > 0) {
            System.out.println("插入成功!!" );
        }
        // 5 关流
        statement.close();
        conn.close();
    }
}
小总结:
-  记住5个步骤的关联和顺序,会读代码 
-  理解url的写法 - 协议
- ip
- 端口
- 参数
 
-  其中涉及的单词要认识 Driver,Connection,Manager,url,Statement, execute 
3 完成增删改
3.1 插入
参考入门案例
3.2 更新
任何的JDBC都是那5个步骤.
package com.qf.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
/**
 * --- 天道酬勤 ---
 *
 * @author QiuShiju
 * @desc 更新
 */
public class Demo2_update {
    public static void main(String[] args) throws Exception {
        // 1 加载驱动
        Class.forName("com.mysql.jdbc.Driver");
        // 2 通过驱动管理对象获得连接对象
        String url = "jdbc:mysql://localhost:3306/java2217?useSSL=false";
        String username = "root";
        String password = "123456";
        Connection conn = DriverManager.getConnection(url, username, password);
        // 3 通过连接对象创建执行语句对象
        Statement statement = conn.createStatement( );
        // 4 通过执行语句对象执行sql,获得结果
        String sql = "update tb_user set username = '小孟', phone = '666666' where id = 3";
        int num = statement.executeUpdate(sql);
        if (num > 0) {
            System.out.println("更新成功!" );
        }
        // 5 将对象的流关闭
        statement.close();
        conn.close();
    }
}
ps: 一定自己主动试错,看报错信息
3.3 删除
public class Demo3_delete {
    public static void main(String[] args) throws Exception {
        Class.forName("com.mysql.jdbc.Driver");
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/java2217?useSSL=false", "root", "123456");
        Statement statement = conn.createStatement( );
        int num = statement.executeUpdate("delete from tb_user where id = 3");
        if (num > 0) {
          System.out.println("删除成功!");
        }
        statement.close();
        conn.close();
    }
}
4 查询结果集ResultSet【重要】
查询返回的是一种虚拟表,Java的JDBC中是使用结果集(ResultSet)来封装这个虚拟表,结果集就是一个集合,内部就存储了列名和每行数据,那么学习查询的重点是
- 从结果集取值
package com.qf.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
/**
 * --- 天道酬勤 ---
 *
 * @author QiuShiju
 * @desc 查询
 */
public class Demo4_select {
    public static void main(String[] args) throws Exception {
        Class.forName("com.mysql.jdbc.Driver");
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/java2217?useSSL=false", "root", "123456");
        Statement statement = conn.createStatement( );
        String sql = "select id,username,password from tb_user";
        // 执行查询的方法executeQuery,方法返回值是ResultSet
        ResultSet rs = statement.executeQuery(sql);
        /**
         * ResultSet 内部包含了整个查询返回的虚拟表数据
         * 内部提供了方法可以操作结果集
         * boolean next(); 判断结果集有没有下一行数据,返回false,即没有下一行数据返回
         *                 true就是有下一行数据,此时就可以进入取值
         * getObject()                获得数据,返回值是Object
         * getInt/getString/getDate() 获得数据,返回对应数据类型
         * --------------------------------------
         * getXxx(int columnIndex)  通过列下标获得对应Xxx数据类型的数据
         *                         下标从1开始,顺序是按照查询返回虚拟表顺序
         * getXxx(String columnLabel)  通过列名获得对应Xxx数据类型的数据
         *                         根据虚拟表列名,如果有别名那就是别名
         */
        while (rs.next()) {
            // 通过列下标获得数据
            // int id =  rs.getInt(2);
            // String username = rs.getString(1);
            // 通过列名获得数据 【推荐】
            int id = rs.getInt("id");
            String username = rs.getString("username");
            System.out.println(id + "-" + username);
        }
        statement.close();
        conn.close();
    }
}
在这里插入图片描述

每个知识点小问?
ResultSet是什么?
next()有什么特点?
if(next())和while(next())有啥区别 ?
如果按下标取值,下标从哪开始,下标顺序是什么顺序?
如果按列名取值,列名根据谁来定?
5 登录案例【重要】
需求:
- 通过控制台用户输入用户名和密码。
- 用户输入的用户名和密码作为条件,编写查询 SQL 语句。
- select * from user where usename = xxx and password = xxx
- 如果该用户存在,提示登录成功,反之提示失败。
package com.qf.jdbc;
import com.mysql.jdbc.Driver;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Scanner;
/**
 * --- 天道酬勤 ---
 *
 * @author QiuShiju
 * @desc
 */
public class Demo5_Login {
    public static void main(String[] args) {
        // 1 输入用户名和密码
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入用户名:" );
        String username = scanner.nextLine( );
        System.out.println("请输入密码:" );
        String password = scanner.nextLine( );
        // 2 根据用户名和密码查人
       boolean isOk =  findUserByLogin(username,password);
        // 3 结果
        if (isOk) {
            System.out.println("登录成功!" );
        } else {
            System.out.println("用户名或密码错误!" );
        }
    }
    // 使用捕获代码完成
    private static boolean findUserByLogin(String username, String password) {
        Connection conn = null;
        Statement statement = null;
        boolean isOk = false;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/java2217?useSSL=false", "root", "123456");
            statement = conn.createStatement( );
            // 根据用户名和密码查询,注意字符串拼接.特别注意单引号
            ResultSet rs = statement.executeQuery("select * from tb_user where username = '"+username+"' and password = '"+password+"'");
            // 只要有值,就说明数据库有这个信息,登录成功
            if (rs.next()) {
               // System.out.println("登录成功!" );
                int id = rs.getInt("id");
                String uname= rs.getString("username");
                // ...
                System.out.println(id+"-"+username);
                isOk = true;
            } else {
               // System.out.println("用户名或密码错误!!" );
            }
        }catch (Exception e) {
            System.out.println("SQL操作出错!" );
            e.printStackTrace();// 打印异常
        } finally {
            try{
                statement.close();
                conn.close();
            }catch (Exception e) {
                System.out.println("关流异常" );
                e.printStackTrace();// 打印异常
            }
        }
        return isOk;
    }
}
6 作业
1 重复代码1遍
2 全部使用try..catch..模式再写一遍
3 设计方法,传参数完成增删改查
  void findUserById()
  void findUserByUsername()
  void findUsersByLikePhone()
  void insertUser(....)
  void updateUserById(....)
  void deleteUserById(....)
            conn.close();
        }catch (Exception e) {
            System.out.println("关流异常" );
            e.printStackTrace();// 打印异常
        }
    }
    return isOk;
}
}
# 6 作业
1 重复代码1遍
 2 全部使用try…catch…模式再写一遍
 3 设计方法,传参数完成增删改查
 void findUserById()
 void findUserByUsername()
 void findUsersByLikePhone()
 void insertUser(…)
 void updateUserById(…)
 void deleteUserById(…)



















