day42_jdbc

今日内容

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(…)


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/373036.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode、746. 使用最小花费爬楼梯【简单,动态规划 线性DP】

文章目录 前言LeetCode、746. 使用最小花费爬楼梯【简单,动态规划 线性DP】题目与分类思路 资料获取 前言 博主介绍:✌目前全网粉丝2W,csdn博客专家、Java领域优质创作者,博客之星、阿里云平台优质作者、专注于Java后端技术领域。…

idea 快捷键ctrl+shift+f失效的解决方案

文章目录 搜狗输入法快捷键冲突微软输入法快捷键冲突 idea的快捷键ctrlshiftf按了没反应,理论上是快捷键冲突了,检查搜狗输入法和微软输入法快捷键。 搜狗输入法快捷键冲突 不需要简繁切换的快捷键,可以关闭它,或修改快捷键。 微…

Linux Shell编程系列--开篇

一、目的 从本篇开始介绍Linux Shell脚本编程,为简单起见,本篇中以一个显示当前时间的shell脚本来帮助大家理解shell脚本的组成。 SHELL脚本中可以包含变量、函数、命令等部分。 二、介绍 我们通过vim新建一个myshell.sh的脚本,然后输入以下…

工作与生活平衡:在生活中寻找和谐

工作和生活是我们生活中不断交织的两个重要方面。对许多人来说,找到两者之间的完美平衡已经成为一个持久的挑战。然而,与其专注于平衡,更重要的是要认识到工作和生活并不是可以相互平衡的两个分离实体,而是一个相互影响的循环。正…

C++之程序内存分配方式

程序内存布局 现在的应用程序都运行在一个虚拟内存空间里,以32位系统为例,其寻址空间为 4G,大部分的操作系统都将4G内存空间的一部分挪给内核调用,应用程序无法直接 访问这一段内存,这一部分内核地址成为内核态空间&am…

LeetCode:13.罗马数字转整数

13. 罗马数字转整数 - 力扣(LeetCode) 目录 思路: 官解代码: 作者辣眼代码: 每日表情包: 思路: 思路已经很明了了,题目已经给出一般规则和特殊规则(而且题目确保给定的是正确的…

利用 ASP.NET Core 开发单机应用

前言 现在是分布式微服务开发的时代,除了小工具和游戏之类刚需本地运行的程序已经很少见到纯单机应用。现在流行的Web应用由于物理隔离天然形成了分布式架构,核心业务由服务器运行,边缘业务由客户端运行。对于消费终端应用,为了应…

Nginx使用详解

简介Nginx的优缺点Nginx的应用场景Nginx支持的模块Nginx模块配置示例1. **HTTP Access Log 模块**2. **HTTP SSL 模块**3. **HTTP Gzip 模块**4. **HTTP Rewrite 模块** Nginx支持的反向代理协议Nginx反向代理配置Nginx反向代理优点Nginx反向代理配置示例Nginx常用配置参数Ngin…

一文搞懂 springboot 如何融合数据源

1、简介 springboot 支持关系型数据库的相关组件进行配置,包括数据源、连接池、事务管理器等的自动配置。降低了数据库使用的难度,除了 mysql 还支持 Derby、H2等嵌入式数据库的自动配置,MongoDB、Redis、elasticsearch等常用的 NoSQL 的数据…

uWSGI、灰度发布、网站数据指标分析、网站限速

1 案例1:部署Python网站项目 1.1 问题 配置Nginx使其可以将动态访问转交给uWSGI: 1.2 方案 安装Python工具及依赖 安装uWSGI并编写配置文件 1.3 步骤 实现此案例需要按照如下步骤进行。 步骤一: 首先$教学资料目录/python拷贝到虚拟…

Python程序设计 函数

简单函数 函数:就是封装了一段可被重复调用执行的代码块。通过此代码块可以实现大量代码的重复使用。 函数的使用包含两个步骤: 定义函数 —— 封装 独立的功能 调用函数 —— 享受 封装 的成果 函数的作用,在开发程序时,使用…

Unity3d Shader篇(一)— 顶点漫反射着色器解析

文章目录 前言一、顶点漫反射着色器是什么?1. 顶点漫反射着色器的工作原理 二、编写顶点漫反射着色器1. 定义属性2. 创建 SubShader3. 编写着色器程序段4. 完成顶点着色器5. 完成片段着色器 三、效果四、总结 前言 在 Unity 中,Shader 可以用来实现各种…

jmeter设置关联

一、为什么要设置关联? http协议本身是无状态的,客户端只需要简单向服务器请求下载某些文件,无论是客户端还是服务端都不去记录彼此过去的行为,每一次请求之间都是独立的。如果jmeter需要设置跨线程组脚本,就必须设置…

【问题篇】activiti工作流转办并处理备注问题

当处理activiti转办问题时,需要做的就是处理审批人和备注问题。 处理的思路是,先将当前环节标志成转办标签,再通过BUSINESS_KEY_找到流程实例的历史记录,找到最新的一条复制一份出来,表示需要转办到的人的历史记录并设…

APP专项测试方法总结

APP专项测试 1、网络测试 可使用抓包工具辅助网格测试推荐:fiddler,Charles 网络切换: 2G-3G-4G-wifi-网络信号差–无网 网络信号弱: 关注是否出现ANR、crash 2、中断测试 意外中断: 来电;短信&am…

不需英文基础也可以轻松学编程,中文编程开发工具免费版下载,编程工具构件箱之扩展控制面板构件用法

不需英文基础也可以轻松学编程,中文编程开发工具免费版下载,编程工具构件箱之扩展控制面板构件用法 一、前言 编程入门视频教程链接 https://edu.csdn.net/course/detail/39036 编程工具及实例源码文件下载可以点击最下方官网卡片——软件下载——常…

ShardingSphere 5.x 系列【3】分库分表中间件技术选型

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 3.1.0 本系列ShardingSphere 版本 5.4.0 源码地址:https://gitee.com/pearl-organization/study-sharding-sphere-demo 文章目录 1. 前言2. My Cat3. ShardingSphe…

C++ 类与对象(下)

目录 1. 再谈构造函数 1.1 构造函数体赋值 1.2 初始化列表 1.3 explicit关键字 2. static成员 2.1 概念 2.2 特性 3.友元 3.1友元函数 3.2 友元类 4. 内部类 5.匿名对象 6.拷贝对象时的一些编译器优化 7. 再次理解类和对象 【本节目标】 1. 再谈构造函数 2. Static成员…

【产品升级】SmartPipe升级到版本2.0

在近一个月的攻关和测试下,SmartPipe软件轴线自动识别算法的性能大幅提升,鲁棒性和稳定性进一步增强。近一年来客户累计反馈的多种复杂管路(包括带有支管管路、带有压瘪段管路、推弯管、装配管、带有复杂孔洞管路等)现在均能够正确…

通过消息队列实现进程之间通信代码

#include <myhead.h> struct msgbuf {long int mtype; char mtext[1024]; }; //定义一个消息大小 #define MSGSIZE sizeof(struct msgbuf)-sizeof(long int) int main(int argc, const char *argv[]) {//1、创建key值以便创建消息队列key_t key ftok("/", k)…