一起学Java——JDBC,java面试指南

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
img

正文

if(cnt == 1){

System.out.println(“学生班级调整完毕!”);

}else{

System.out.println(“没有找到对应编号学生!”);

}

} catch (ClassNotFoundException | SQLException e) {

e.printStackTrace();

}finally {

DbUtils.closeConnection(null, pstmt, conn);

}

}

}

请添加图片描述

  • 删除数据

package com.five.jdbc.example;

import com.five.jdbc.common.DbUtils;

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.SQLException;

import java.util.Scanner;

/**

  • Description:

  • @Author: kk(专业bug开发)

  • DateTime: 2022-01-08 13:37

*/

public class DeleteExample {

public static void main(String[] args) throws SQLException {

Scanner in = new Scanner(System.in);

System.out.println(“请输入学生编号:”);

int id = in.nextInt();

Connection conn = null;

PreparedStatement pstmt = null;

try {

conn = DbUtils.getConnection();

String sql = “delete from student where id=?”;

pstmt = conn.prepareStatement(sql);

pstmt.setInt(1, id);

int cnt = pstmt.executeUpdate(); //写操作影响的行数

if (cnt == 1) {

System.out.println(“学生信息删除完毕!”);

} else {

System.out.println(“没有找到对应编号学生!”);

}

} catch (ClassNotFoundException | SQLException e) {

e.printStackTrace();

} finally {

DbUtils.closeConnection(null, pstmt, conn);

}

}

}

请添加图片描述

JDBC事务管理
  1. 什么是事务?

事务是以一种可靠的、一致的方式,访问和操作数据库的程序单元

通俗的说:要么把事情做完,要么什么都不做,不要做一半。

  1. 事务原理图如下;

在这里插入图片描述

在这里插入图片描述

  1. 提交事务模式
  • 自动提交事务

每执行一次写操作,自动提交事务

自动提交开启方法:conn.setAutoCommit(true)

自动事务是JDBC的默认行为,此模式无法保证数据一致性

  • 手动提交事务

显示调用commit()和rollback()方法管理事务

手动提交开启方法:conn.setAutoCommit(false)

保证多数据一致性,但必须手动调用提交/回滚方法

手动调用事务案例:

请添加图片描述

package com.five.jdbc.example;

import com.five.jdbc.common.DbUtils;

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.SQLException;

/**

  • Description:

  • @Author: kk(专业bug开发)

  • DateTime: 2022-01-08 16:02

*/

public class TransactionExample {

public static void main(String[] args) throws SQLException {

Connection conn = null;

PreparedStatement pstmt = null;

try {

conn = DbUtils.getConnection();

conn.setAutoCommit(false); //关闭自动提交

String sql = “insert into student(id,name,classname) values(?,?,?)”;

for (int i = 20; i < 40; i++) {

// 模拟发生异常的情况

// if(i == 35){

// throw new RuntimeException(“添加失败”);

// }

pstmt = conn.prepareStatement(sql);

pstmt.setInt(1, i);

pstmt.setString(2, “学生” + i);

pstmt.setString(3, “高三(10)班”);

pstmt.executeUpdate(); //写操作

}

conn.commit(); //提交数据

} catch (Exception e) {

e.printStackTrace();

try {

if (conn != null && !conn.isClosed()) {

conn.rollback(); //如果发生异常,数据库事务回滚

}

} catch (SQLException ex) {

ex.printStackTrace();

}

} finally {

DbUtils.closeConnection(null, pstmt, conn);

}

}

}

实体类实现分页数据封装

设想一下实际的开发,我们查询数据经常是一组数据,这一组数据我们需要统一返回,这时候我们可以利用Java面向对象的特性进行处理。

  1. 新建实体类和测试类;

请添加图片描述

  1. 实体类代码;

package com.five.jdbc.entity;

/**

  • Description:学生信息实体类

  • 1.具备默认构造函数 2.属性私有 3.存在getter和setter

  • @Author: kk(专业bug开发)

  • DateTime: 2022-01-08 16:19

*/

public class Student {

public Student(){

}

private Integer id;

private String name;

private String cname;

public Integer getId() {

return id;

}

public void setId(Integer id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getCname() {

return cname;

}

public void setCname(String cname) {

this.cname = cname;

}

}

  1. 测试类代码,原理参见注释;

请添加图片描述

package com.five.jdbc.example;

import com.five.jdbc.common.DbUtils;

import com.five.jdbc.entity.Student;

import java.sql.*;

import java.util.ArrayList;

import java.util.List;

import java.util.Scanner;

/**

  • Description:分页查询

  • @Author: kk(专业bug开发)

  • DateTime: 2022-01-08 16:28

*/

public class PaginationExample {

public static void main(String[] args) {

Scanner in = new Scanner(System.in);

System.out.println(“请输入页号:”);

int page = in.nextInt();

Connection conn = null;

PreparedStatement pstmt = null;

ResultSet rs = null;

// 用于存放结果的list

List list = new ArrayList<>();

try {

conn = DbUtils.getConnection();

String sql = “select * from student limit ?,10”;

pstmt = conn.prepareStatement(sql);

pstmt.setInt(1, (page-1)*10);

rs = pstmt.executeQuery();

// 展开结果集数据库

while (rs.next()) {

// 通过字段检索

int id = rs.getInt(“id”);

String name = rs.getString(“name”);

String classname = rs.getString(“classname”);

// 数据保存到实体类中

Student stu = new Student();

stu.setId(id);

stu.setName(name);

stu.setCname(classname);

list.add(stu);

}

System.out.println(list.size());

} catch (ClassNotFoundException | SQLException e) {

e.printStackTrace();

}

}

}

JDBC中Date日期对象的处理
  1. 数据表新增日期字段;

请添加图片描述

  1. 获取数据表日期;

//JDBC获取日期的时候使用java.sql.Date,继承于java.util.Date

Date sdate = rs.getDate(“sdate”);

package com.five.jdbc.example;

import java.sql.*;

import java.util.Scanner;

/**

  • Description:

  • @Author: kk(专业bug开发)

  • DateTime: 2022-01-07 16:29

*/

public class JdbcExample {

// MySQL 8.0 以下版本 - JDBC 驱动名及数据库 URL

// static final String JDBC_DRIVER = “com.mysql.jdbc.Driver”;

// static final String DB_URL = “jdbc:mysql://localhost:3306/RUNOOB”;

// MySQL 8.0 以上版本 - JDBC 驱动名及数据库 URL

static final String JDBC_DRIVER = “com.mysql.cj.jdbc.Driver”;

static final String DB_URL = “jdbc:mysql://localhost:3306/study?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC”;

// 数据库的用户名与密码,需要根据自己的设置

static final String USER = “root”;

static final String PASS = “123456”;

public static void main(String[] args) {

Connection conn = null;

// Statement stmt = null;

PreparedStatement pstmt = null;

try {

// 注册 JDBC 驱动

Class.forName(JDBC_DRIVER);

// 打开链接

System.out.println(“连接数据库…”);

conn = DriverManager.getConnection(DB_URL, USER, PASS);

// 执行查询

System.out.println(" 实例化Statement对象…");

System.out.println(“请输入待查询的班级:”);

// 仔细看这部分代码,prepareStatement对sql进行了预编译

Scanner in = new Scanner(System.in);

String cname = in.next();

String sql= “SELECT * FROM student where classname = ?”;

pstmt= conn.prepareStatement(sql);

pstmt.setString(1, cname);

ResultSet rs = pstmt.executeQuery();

// 展开结果集数据库

while (rs.next()) {

// 通过字段检索

int id = rs.getInt(“id”);

String name = rs.getString(“name”);

String classname = rs.getString(“classname”);

//JDBC获取日期的时候使用java.sql.Date,继承于java.util.Date

Date sdate = rs.getDate(“sdate”);

// 输出数据

System.out.print("ID: " + id);

System.out.print(", 姓名: " + name);

System.out.print(", 班级: " + classname);

System.out.print(", 日期: " + sdate);

System.out.print(“\n”);

}

// 完成后关闭

rs.close();

pstmt.close();

conn.close();

} catch (SQLException se) {

// 处理 JDBC 错误

se.printStackTrace();

} catch (Exception e) {

// 处理 Class.forName 错误

e.printStackTrace();

} finally {

// 关闭资源

try {

if (pstmt != null) pstmt.close();

} catch (SQLException se2) {

}// 什么都不做

try {

if (conn != null)

conn.close();

} catch (SQLException se) {

se.printStackTrace();

}

}

System.out.println(“Goodbye!”);

}

}

请添加图片描述

3. 向数据表添加日期;

添加日期数据时获取到的是String类型

1.String转化为java.util.Date

2.java.util.Date转化为java.sql.Date

// 1.String转化为java.util.Date

java.util.Date usdate = null;

SimpleDateFormat sdf = new SimpleDateFormat(“yyyy-MM-dd”);

try {

usdate = sdf.parse(sdate);

} catch (ParseException e) {

e.printStackTrace();

}

//2.java.util.Date转化为java.sql.Date

long time = usdate.getTime(); //获取自1970年到现在的毫秒数

//这个日期就是java.sql.Date格式

java.sql.Date lsdate = new java.sql.Date(time);

package com.five.jdbc.example;

import com.five.jdbc.common.DbUtils;

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.SQLException;

import java.text.ParseException;

import java.text.SimpleDateFormat;

import java.util.Scanner;

/**

  • Description:

  • @Author: kk(专业bug开发)

  • DateTime: 2022-01-08 13:06

*/

public class InsertExample{

public static void main(String[] args) throws SQLException {

Scanner in = new Scanner(System.in);

System.out.println(“请输入学生编号:”);

int id = in.nextInt();

System.out.println(“请输入学生姓名:”);

String name = in.next();

System.out.println(“请输入学生班级:”);

String cname = in.next();

System.out.println(“请输入日期:”);

String sdate = in.next();

Connection conn = null;

PreparedStatement pstmt = null;

// 1.String转化为java.util.Date

java.util.Date usdate = null;

SimpleDateFormat sdf = new SimpleDateFormat(“yyyy-MM-dd”);

try {

usdate = sdf.parse(sdate);

} catch (ParseException e) {

e.printStackTrace();

}

//2.java.util.Date转化为java.sql.Date

long time = usdate.getTime(); //获取自1970年到现在的毫秒数

java.sql.Date lsdate = new java.sql.Date(time); //这个日期就是java.sql.Date格式

try {

conn = DbUtils.getConnection();

String sql = “insert into student(id,name,classname, sdate) values(?,?,?,?)”;

pstmt = conn.prepareStatement(sql);

pstmt.setInt(1, id);

pstmt.setString(2, name);

pstmt.setString(3, cname);

pstmt.setDate(4, lsdate);

int cnt = pstmt.executeUpdate(); //写操作影响的行数

System.out.println(“cnt” + cnt);

System.out.println(name = “添加成功啦!”);

} catch (ClassNotFoundException | SQLException e) {

e.printStackTrace();

}finally {

DbUtils.closeConnection(null, pstmt, conn);

}

}

}

请添加图片描述

请添加图片描述

JDBC批处理

pstmt = conn.prepareStatement(sql);

pstmt.addBatch(); //将参数添加到批处理任务里面

pstmt.executeBatch(); //执行批处理任务

请添加图片描述

请添加图片描述

请添加图片描述

数据库连接池

数据库每次执行操作都会连接一次数据库,实际使用过程中频繁的连接务必会降低效率,数据库连接池可以在初始的时候进行数据库连接,需要时直接使用。

相关文档参见:参考文章

Druid连接池
  1. 官方地址 : 官方地址

请添加图片描述

2. 项目引入jar包,新建配置文件;

请添加图片描述

配置文件代码:

driverClassName=com.mysql.cj.jdbc.Driver

url=jdbc:mysql://localhost:3306/study?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC

username=root

password=123456

  1. 使用流程
  • 1.导入jar包 druid-1.0.9.jar

  • 2.定义配置文件:properties形式的

  • 3.加载配置文件。Properties

  • 4.获取数据库连接池对象:通过工厂来来获取 DruidDataSourceFactory

  • 5.获取连接:getConnection

  1. 示例代码;

package com.five.jdbc.example;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import com.five.jdbc.common.DbUtils;

import javax.sql.DataSource;

import java.io.FileInputStream;

import java.net.URLDecoder;

import java.sql.Connection;

import java.sql.Date;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.util.Properties;

/**

  • Description:

  • @Author: kk(专业bug开发)

  • DateTime: 2022-01-08 18:01

*/

public class DruidExample {

public static void main(String[] args) throws Exception {

//1.加载属性文件

Properties properties = new Properties();

String propertyFile = DruidExample.class.getResource(“/druid-config.properties”).getPath();

try {

propertyFile = URLDecoder.decode(propertyFile, “UTF-8”);

properties.load(new FileInputStream(propertyFile));

} catch (Exception e) {

e.printStackTrace();

}

Connection conn = null;

PreparedStatement pstmt = null;

ResultSet rs = null;

try {

//2.获取DataSource数据源对象

DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);

//3.创建数据库连接

conn = dataSource.getConnection();

pstmt = conn.prepareStatement(“select * from student limit 0,20”);

rs = pstmt.executeQuery();

// 展开结果集数据库

while (rs.next()) {

// 通过字段检索

int id = rs.getInt(“id”);

String name = rs.getString(“name”);

String classname = rs.getString(“classname”);

//JDBC获取日期的时候使用java.sql.Date,继承于java.util.Date

Date sdate = rs.getDate(“sdate”);

// 输出数据

System.out.print("ID: " + id);

System.out.print(", 姓名: " + name);

System.out.print(", 班级: " + classname);

System.out.print(", 日期: " + sdate);

System.out.print(“\n”);

}

} catch (Exception e) {

e.printStackTrace();

}finally {

DbUtils.closeConnection(rs,pstmt,conn);

}

}

}

请添加图片描述

C3P0连接池
  1. 官方地址 : 官方地址

请添加图片描述

  1. 项目引入jar包,新建配置文件;

请添加图片描述

配置文件代码:

<?xml version="1.0" encoding="UTF-8"?>

com.mysql.cj.jdbc.Driver

jdbc:mysql://localhost:3306/study?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC

root

123456

10

20

3000

  1. 示例代码;

package com.five.jdbc.example;

import javax.sql.DataSource;

import com.five.jdbc.common.DbUtils;

import com.mchange.v2.c3p0.ComboPooledDataSource;

import java.sql.*;

/**

  • Description:

  • @Author: kk(专业bug开发)

  • DateTime: 2022-01-08 21:46

*/

public class C3P0Example {

public static void main(String[] args) throws SQLException {

//1.加载配置文件

//2.创建DataSource

DataSource dataSource = new ComboPooledDataSource();

//3.得到数据库连接

Connection conn = null;

PreparedStatement pstmt = null;

ResultSet rs = null;

try {

conn = dataSource.getConnection();

pstmt = conn.prepareStatement(“select * from student limit 0,20”);

rs = pstmt.executeQuery();

// 展开结果集数据库

while (rs.next()) {

// 通过字段检索

int id = rs.getInt(“id”);

String name = rs.getString(“name”);

String classname = rs.getString(“classname”);

//JDBC获取日期的时候使用java.sql.Date,继承于java.util.Date

Date sdate = rs.getDate(“sdate”);

// 输出数据

System.out.print("ID: " + id);

System.out.print(", 姓名: " + name);

System.out.print(", 班级: " + classname);

System.out.print(", 日期: " + sdate);

System.out.print(“\n”);

}

} catch (Exception e) {

e.printStackTrace();

}finally {

DbUtils.closeConnection(rs,pstmt,conn);

}

}

}

请添加图片描述

Commons DBUtils使用

Commons DBUtils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化JDBC编码的工作量,同时也不会影响程序的性能。

  1. 官方地址 : 官方地址

请添加图片描述

  1. 项目引入jar包;

请添加图片描述

  1. 示例代码,使用时需要仔细看文档,因为操作简单导致内容略显复杂;

package com.five.jdbc.example;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import com.five.jdbc.common.DbUtils;

import com.five.jdbc.entity.Student;

最后

毕竟工作也这么久了 ,除了途虎一轮,也七七八八面试了不少大厂,像阿里、饿了么、美团、滴滴这些面试过程就不一一写在这篇文章上了。我会整理一份详细的面试过程及大家想知道的一些问题细节

美团面试经验

美团面试
字节面试经验
字节面试
菜鸟面试经验
菜鸟面试
蚂蚁金服面试经验
蚂蚁金服
唯品会面试经验
唯品会

因篇幅有限,图文无法详细发出

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

ons DBUtils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化JDBC编码的工作量,同时也不会影响程序的性能。

  1. 官方地址 : 官方地址

请添加图片描述

  1. 项目引入jar包;

请添加图片描述

  1. 示例代码,使用时需要仔细看文档,因为操作简单导致内容略显复杂;

package com.five.jdbc.example;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import com.five.jdbc.common.DbUtils;

import com.five.jdbc.entity.Student;

最后

毕竟工作也这么久了 ,除了途虎一轮,也七七八八面试了不少大厂,像阿里、饿了么、美团、滴滴这些面试过程就不一一写在这篇文章上了。我会整理一份详细的面试过程及大家想知道的一些问题细节

美团面试经验

[外链图片转存中…(img-sDdSQn4P-1713673089946)]
字节面试经验
[外链图片转存中…(img-arB4SUo4-1713673089947)]
菜鸟面试经验
[外链图片转存中…(img-PHxLAf5z-1713673089948)]
蚂蚁金服面试经验
[外链图片转存中…(img-brOXDjuu-1713673089948)]
唯品会面试经验
[外链图片转存中…(img-ApKPRz8R-1713673089949)]

因篇幅有限,图文无法详细发出

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-IpeKfUVa-1713673089950)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 14
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值