day36_jdbc
创始人
2025-06-01 01:34:46

今日内容

上课同步视频:CuteN饕餮的个人空间_哔哩哔哩_bilibili
同步笔记沐沐霸的博客_CSDN博客-Java2301
零、 复习昨日
一、JDBC
二、登录
三、ORM

零、 复习昨日

  • sql语言:DDL DML DQL DCL

  • create table 表名(id int primary key auto_increment,sname varchar(20) unique,age int not null,score double(10,2) default 100.0,birthday date
    );
    
  • insert into stu values(1,'zs',18,98.2,'2020-01-01')
    update stu set sname = 'ls' where id = 1;
    delete from stu where id = 1;select 字段,聚合函数,函数,流程函数
    from 表1,表2 / left join 表2
    where 关联条件/过滤条件
    group by 分组字段
    having  分组后过滤条件
    order by 排序字段
    limit x[,y]
    
  • 字符串函数

    • concat
  • 数学函数

    • format,truncate,rand,round
  • 日期函数

    • sysdate() now(),current_date()
    • date_add(1 interval 1 单位) adddate()
    • date_sub , datediff
    • year() month() day()
    • 日期转字符串 data_format(日期,‘%Y-%m-%d’)
    • 字符串转日期 str_to_date(‘日期字符串’,‘%Y-%m-%d’)
  • 流程函数

  • if() ifnull() case when then esle end

  • 索引

    • 是一种数据结构,目的是为了提高查询效率
    • 主键索引,唯一索引,普通索引,复合索引(联合索引),全文索引
    • 索引什么时候加? 注意使用的时机

一、引言


1.1 如何操作数据库

使用客户端工具访问数据库,需要手工建立连接,输入用户名和密码登录,编写 SQL 语句,点击执行,查看操作结果(结果集或受影响行数)。

客户端操作数据库步骤
image-20230316181353316

1.2 实际开发中,会采用客户端操作数据库吗?

在实际开发中,当用户的数据发生改变时,不可能通过客户端操作执行 SQL 语句,因为操作量过大,无法保证效率和正确性。

二、JDBC


2.1 什么是 JDBC?

JDBC(Java Database Connectivity) Java 连接数据库的规范(标准),可以使用 Java 语言连接数据库完成 CRUD 操作。

2.2 JDBC 核心思想

Java 中定义了访问数据库的接口,可以为多种关系型数据库提供统一的访问方式。由数据库厂商提供驱动实现类(Driver 数据库驱动)。

核心思想
image-20230316181411600

2.2.1 MySQL 数据库驱动

  • mysql-connector-java-5.1.X 适用于 5.X 版本
  • mysql-connector-java-8.0.X 适用于 8.X版本

2.3 环境搭建

mysql厂商提供的jdbc规范的实现,要想完成JDBC操作,就需要将驱动包加入到当前项目中.

2.3.1 方式1:复制粘贴

  • 在项目下新建 lib 文件夹,用于存放 jar 文件。
  • 将 mysql 驱动mysql-connector-java-5.1.X复制到项目的 lib 文件夹中。
  • 选中 lib 文件夹右键 Add as Library,点击 OK。
在项目名下创建文件夹lib
image-20221121105646545
命名为lib
image-20221121105703497
将mysql驱动包复制粘贴到此处
image-20221121105753513
添加驱动包为当前项目的类库
image-20221121110032950

2.3.2 方式2:idea导入类库

打开项目结构(Project Structure)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YhqziKUh-1679393688625)(C:/Users/qiush/AppData/Roaming/Typora/typora-user-images/image-20230320105013907.png)]
选择libraries,添加jar包
image-20221121111310058
本地磁盘选择jar包
image-20221121111402075
应用生效
image-20221121111442727
下方,External查看导入类库
image-20221121111616446

三、JDBC编程

JDBC编程有标准步骤(八股文)

  • 注册驱动
    • 将sql语句的运行环境加载到JVM
  • 连接数据库
  • 获得执行SQL的对象
  • 执行SQL语句,获得结果
  • 关流

3.1 注册驱动

使用 Class.forName(“com.mysql.jdbc.Driver”);手动加载字节码文件到 JVM 中。
或者MySQL8版本 Class.forName(“com.mysql.cj.jdbc.Driver”);

Class.forName("com.mysql.jdbc.Driver");//5.7版本 加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");//5.7版本 加载驱动

3.2 连接数据库

  • 通过 DriverManager.getConnection(url,user,password) 获取数据库连接对象
    • URL:jdbc:mysql://localhost:3306/database
      • ?useUnicode=true&characterEncoding=utf8 // 解决数据编码格式乱码
      • &useSSL=false // 解决执行时控制台红色警告
      • &serverTimezone=UTC // mysql8版本需要加时区
    • username:root
    • password:123456
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/database?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC   ", "root","1234");
  • URL(Uniform Resource Locator) 统一资源定位符:由协议、IP、端口、SID(程序实例名称)组成

3.3 获取发送 SQL 的对象

通过 Connection 对象获得 Statement 对象,用于对数据库进行通用访问。

Statement statement = conn.createStatement();

3.4 执行SQL 语句

执行 SQL 语句并接收执行结果。

String sql ="INSERT INTO t_jobs(JOB_ID,JOB_TITLE,MIN_SALARY,MAX_SALARY) VALUES('JAVA_Le','JAVA_Lecturer',4000,10000);";int result = statement.executeUpdate(sql);//执行SQL语句并接收结果
  • 注意:在编写 DML 语句时,一定要注意字符串参数的符号是单引号 ‘值’
  • DML 语句:增删改时,返回受影响行数(int 类型)。
  • DQL 语句:查询时,返回结果数据(ResultSet 结果集)。

3.5 处理结果

接受处理操作结果。

if(result == 1){System.out.println("Success");
}
  • 受影响行数:逻辑判断、方法返回。
  • 查询结果集:迭代、依次获取。

3.6 释放资源

遵循先开后关原则,释放所使用到的资源对象。

statement.close();
conn.close();

3.7 案例

准备数据库表,进行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表插入数据


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: 利用反射技术,将驱动类加载到JVMClass.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();}
}

四、完成增删改

4.1 插入

参考入门案例

4.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();}
}

4.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();}
}

五、查询结果集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,方法返回值是ResultSetResultSet 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();}}

image-20221121164359945

六、登录案例【重要】

需求:

  • 通过控制台用户输入用户名和密码。
  • 用户输入的用户名和密码作为条件,编写查询 SQL 语句。
    • select * from user where username = 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/database?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;}
}

七、ORM【重要】

7.1 什么是ORM

目前使用JDBC完成了CRUD,但是现在是进行CRUD,增删改方法要设计很多参数,查询的方法需要设计集合才能返回.


在实际开发中,我们需要将零散的数据封装到对象处理.

ORM (Object Relational Mapping) 对象关系映射

是指数据库表Java的实体类有关系,可以进行映射

  • 数据库表 --> Java的类
    • tb_user —> User.java
  • 字段 --> 类的属性
    • id int --> private int id;
    • username varchar --> private String username;
  • 一行数据 --> 类的对象

7.2 实体类

实体类: 数据表中零散数据的载体,用来封装数据.

  • 表名 设计 类名
  • 将列名设计成属性名
    • id --> id
    • create_time --> createTime (下划线转驼峰)
  • 将列的数据类型设计成属性的数据类型
  • 给类提供对应set get

一般项目中一个表就会对应一个实体类,所有的实体类都会放在model/entity/pojo/javabeen包结构中


将来写项目,数据库设计完,搭建完项目,第一件事件就是根据表结构,创建实体类

package com.qf.model; // 包
public class User {   // 实体类,是表名// 属性是字段名private int id;private String username;private String password;private String phone;private Date createTime;private double money;private int sex;// setter getter...
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8UL7zM35-1679393687865)(…/…/…/…/Java2217/阶段2/day43/笔记/day43_jdbc.assets/image-20221122160619448.png)]

7.3 ORM改造登录案例

package com.qf.jdbc;import com.qf.model.User;import java.sql.*;
import java.util.Scanner;/*** --- 天道酬勤 ---** @author QiuShiju* @desc 使用orm改造login登录案例*/
public class Demo6_login_orm {public static void main(String[] args) {input();}// 1 键盘输入public static void input() {Scanner scanner = new Scanner(System.in);System.out.println("请输入用户名:");String username = scanner.nextLine( );System.out.println("请输入密码:");String password = scanner.nextLine( );// 调用方法执行查询User user = findUserByUsernameAndPassword(username, password);if (user != null) {System.out.println("用户登录成功" );System.out.println("用户信息: " + user );} else {System.out.println("用户名或密码错误!" );}}// 2 执行登录public static User findUserByUsernameAndPassword(String username, String password) {Connection conn = null;Statement s = null;ResultSet rs = null;// 声明user,赋值为null,下方如果登录成功,创建user对象// 即将来,可以通过user是否为空判断是否登录成功User user = null;try {// 1 驱动Class.forName("com.mysql.jdbc.Driver");// 2 连接conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/java2301?useSSL=false", "root", "123456");// 3 语句s = conn.createStatement( );// 4 查询String sql = "select * from tb_user where username = '"+username+"' and password = '"+password+"'";// 执行rs = s.executeQuery(sql);// 判断成功,说明查询到用户if (rs.next()) {// 取出数据int id = rs.getInt("id");String username1 = rs.getString("username");String password1 = rs.getString("password");String phone = rs.getString("phone");Date createTime = rs.getDate("createTime");double money = rs.getDouble("money");int sex = rs.getInt("sex");// 封装数据user = new User();user.setId(id);user.setUsername(username1);user.setPassword(password1);user.setPhone(phone);user.setCreateTime(createTime);user.setMoney(money);user.setSex(sex);}} catch (Exception e) {System.out.println("出错了!" + e.getMessage( ));} finally {// 5 关流try {rs.close();s.close( );conn.close( );} catch (SQLException e) {System.out.println("关流时有异常" + e.getMessage( ));}}return user;}
}

7.4 ORM完成注册

package com.qf.jdbc;import com.qf.model.User;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.Date;/*** --- 天道酬勤 ---** @author QiuShiju* @desc*/
public class Demo7_insert_orm {public static void main(String[] args) {User user = new User( );user.setUsername("王五");user.setPassword("123456");user.setPhone("110");user.setCreateTime(new Date( ));user.setMoney(2800.0);user.setSex(2);insert(user);}// 注册public static void insert(User user) {Connection conn = null;Statement s = null;try {Class.forName("com.mysql.jdbc.Driver");conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/java2301?useSSL=false", "root", "123456");s = conn.createStatement( );SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");String date = sdf.format(user.getCreateTime( ));String sql = "insert into tb_user (username,password,phone,createTime,money,sex) " +"values ('"+user.getUsername()+"','"+user.getPassword()+"','"+user.getPhone()+"','"+date+"',"+user.getMoney()+","+user.getSex()+")";System.out.println("拼接后的sql ---> " + sql );int num = s.executeUpdate(sql);System.out.println(num > 0 ? "插入成功":"插入失败" );} catch (Exception e) {e.printStackTrace( );}}
}

相关内容

热门资讯

13寸电脑尺寸是多少厘米,13... 13寸电脑尺寸是多少厘米目录13寸电脑尺寸是多少厘米13英寸等于多少厘米13寸大概有多大?13.3寸...
管理员的英文缩写是什么,管理员... 管理员的英文缩写是什么目录管理员的英文缩写是什么管理员英文怎么写admn具体指的是什么?管理员的英文...
为什么喊张艺兴孙艺兴,张艺兴为... 为什么喊张艺兴孙艺兴目录为什么喊张艺兴孙艺兴张艺兴为什么叫孙兴?,孙艺兴和张艺兴是同一个人吗为什么喊...
肉沫土豆泥的做法,土豆泥怎么做... 肉沫土豆泥的做法目录肉沫土豆泥的做法土豆泥怎么做?土豆泥怎么做好吃,肉末土豆泥的家常做法土豆打成泥怎...
洛阳市区有哪些大学,洛阳有几所... 洛阳市区有哪些大学目录洛阳市区有哪些大学洛阳有几所大学求洛阳各大高校地址洛阳的大学有哪些洛阳市区有哪...
霎时间的近义词是什么,“ 霎时... 霎时间的近义词是什么目录霎时间的近义词是什么“ 霎时间 ”的近义词与“霎时间”意思相近的词有什么?霎...
如何画机器猫的简笔画,机器猫的... 如何画机器猫的简笔画目录如何画机器猫的简笔画机器猫的简笔画是怎样的?如何画哆啦a梦叮当的图案-如何画...
磁卡没有磁了小妙招,交通卡没有... 磁卡没有磁了小妙招目录磁卡没有磁了小妙招交通卡没有磁性怎么办磁卡消磁了怎样让其恢复?磁卡没有磁了怎么...
华为畅享6s是什么处理器,华为... 华为畅享6s是什么处理器目录华为畅享6s是什么处理器华为畅享6s:参数详解华为畅享6S外观及性能评测...
京东方普工干什么活,北京京东方... 京东方普工干什么活目录京东方普工干什么活北京京东方茶谷累不累合肥京东方一线员工做什么京东方普工,特工...
燕城是哪个城市,我的人间烟火燕... 燕城是哪个城市目录燕城是哪个城市我的人间烟火燕城是哪个城市?秦国燕城是现在的哪里燕城是哪个城市燕城是...
什么是黑洞谢谢告诉我,黑洞的基... 什么是黑洞谢谢告诉我目录什么是黑洞谢谢告诉我黑洞的基本性质?黑洞是什么?什么是黑洞什么是黑洞谢谢告诉...
光疗美甲怎么卸除,光疗甲怎么卸... 光疗美甲怎么卸除目录光疗美甲怎么卸除光疗甲怎么卸光疗甲要怎么卸下来?光疗甲怎么卸掉光疗美甲怎么卸除 ...
巧克力是怎么做成的,巧克力是用... 巧克力是怎么做成的目录巧克力是怎么做成的巧克力是用什么做成的 巧克力是用啥做的巧克力是什么做的巧克力...
感慨生活不易但励志的句子,关于... 感慨生活不易但励志的句子目录生活很苦的励志说说 励志开心的说说关于在艰难的路上的励志句子生活不易下一...
等腰三角形三线合一怎么证明,如... 等腰三角形三线合一怎么证明目录等腰三角形三线合一怎么证明如果只告诉三角形是等腰三角形,那么直接能证明...
番禺有哪些公园好玩的,广州市番... 番禺有哪些公园好玩的目录番禺有哪些公园好玩的广州市番禺区有哪些公园广州番禺有哪些公园好玩番禺旅游必去...
研究生读几年研究生的介绍,研究... 研究生读几年研究生的介绍目录研究生读几年研究生的介绍研究生读几年学制研究生是啥啊?国内研究生读几年研...
擦什么可以让纹身变淡,抹点什么... 擦什么可以让纹身变淡目录擦什么可以让纹身变淡抹点什么可以淡化纹身什么可以淡纹身不花钱去掉纹身的小窍门...
61键电子琴各个琴键代表什么,... 61键电子琴各个琴键代表什么目录61键电子琴各个琴键代表什么如何认识61键电子琴电子琴上的按钮分别是...
汽车钣金是什么意思(汽车钣金是... 今天给各位分享汽车钣金是什么意思的知识,其中也会对汽车钣金是什么意思的照片进行解释,如果能碰巧解决你...
40尺的高柜集装箱尺寸是多少(... 本篇文章极速百科给大家谈谈40尺的高柜集装箱尺寸是多少,以及40尺的高柜集装箱尺寸是多少寸对应的知识...
斗罗大陆唐三的魂环分别是什么,... 斗罗大陆唐三的魂环分别是什么目录斗罗大陆唐三的魂环分别是什么唐家三少的《斗罗大陆》一书中,主角唐三的...
浅色硅胶手机壳脏了怎么清洗,硅... 1. 准备工具:洗洁精、牙膏、牙刷、风油精、棉签、橡皮擦和抹布。 以上内容仅供参考,可阅读硅胶...
英雄联盟lng是哪个战队,ln... 英雄联盟lng是哪个战队目录英雄联盟lng是哪个战队lng是哪个国家的战队lng打野tarzan哪国...
有没有学习美妆的软件,有什么教... 有没有学习美妆的软件目录有没有学习美妆的软件有什么教化妆的app?有什么美妆的APP有什么教化妆的a...
黑芝麻一天吃多少合适,每天吃多... 黑芝麻一天吃多少合适目录黑芝麻一天吃多少合适每天吃多少黑芝麻为宜黑芝麻每天吃多少合适?黑芝麻每天吃多...
东风标志307三厢车多长(东风... 今天给各位分享东风标志307三厢车多长的知识,其中也会对东风标志307三厢车多长多宽进行解释,如果能...
法国百科法国女人最钟爱的香水是... 本篇文章极速百科给大家谈谈法国百科法国女人最钟爱的香水是?,以及法国的什么香水最有名对应的知识点,希...
自然灾难电影有哪些 极速百科网... 自然灾难电影有哪些目录自然灾难电影有哪些自然灾难电影有哪些自然灾难片都有那些?像(后天)(烈火雄心)...