分享
首先分享一份学习大纲,内容较多,涵盖了互联网行业所有的流行以及核心技术,以截图形式分享:
(亿级流量性能调优实战+一线大厂分布式实战+架构师筑基必备技能+设计思想开源框架解读+性能直线提升架构技术+高效存储让项目性能起飞+分布式扩展到微服务架构…实在是太多了)
其次分享一些技术知识,以截图形式分享一部分:
Tomcat架构解析:
算法训练+高分宝典:
Spring Cloud+Docker微服务实战:
最后分享一波面试资料:
切莫死记硬背,小心面试官直接让你出门右拐
1000道互联网Java面试题:
Java高级架构面试知识整理:
2、使用DriverManager获取连接
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.Properties;
/**
@Author: Yeman
@Date: 2022-01-11-21:51
@Description:
*/
public class jdbcLinked {
public static void main(String[] args) throws Exception {
//1、加载配置文件
InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream(“jdbc.properties”);
Properties pros = new Properties();
pros.load(is);
//2、读取配置信息
String user = pros.getProperty(“user”);
String password = pros.getProperty(“password”);
String url = pros.getProperty(“url”);
String driverClass = pros.getProperty(“driverClass”);
//3、加载驱动
Class.forName(driverClass);
//4、获取连接
Connection conn = DriverManager.getConnection(url, user, password);
System.out.println(conn);
}
}
1、PreparedStatement介绍
①通过调用获取连接时生成的 Connection
对象的 preparedStatement(String sql)
方法获取 PreparedStatement
对象。
②PreparedStatement
接口是 Statement
的子接口,它表示一条预编译过的 SQL 语句。
③PreparedStatement
对象所代表的 SQL 语句中的参数用问号(?)来表示,调用PreparedStatement
对象的 setXxx()
方法来设置这些参数。setXxx()
方法有两个参数,第一个参数是要设置的 SQL 语句中的参数的索引(从 1 开始),第二个是设置的 SQL 语句中的参数的值。
2、PreparedStatement vs Statement
①PreparedStatement 可以防止 SQL 注入问题,且提高代码的可读性和可维护性。
②PreparedStatement 能最大可能提高性能:
DBServer会对预编译语句提供性能优化。因为预编译语句有可能被重复调用,所以语句在被DBServer的编译器编译后的执行代码被缓存下来,那么下次调用时只要是相同的预编译语句就不需要编译,只要将参数直接传入编译过的语句执行代码中就会得到执行。在statement语句中,即使是相同操作但因为数据内容不一样,所以整个语句本身不能匹配,没有缓存语句的意义,事实是没有数据库会对普通语句编译后的执行代码缓存。这样每执行一次都要对传入的语句编译一次。(语法检查,语义检查,翻译成二进制命令,缓存)
③PreparedStatement 便于操作BLOB类型字段(图片视频等文件数据)。
④PreparedStatement 更适于批量操作。
3、Java与SQL对应数据类型转换表
4、使用PreparedStatement实现通用增、删、改操作
这里所说的通用是针对于同一数据库下的不同表或同一张表的不同DML。
①工具类(包括获取连接,通用增删改,关闭连接)
package utils;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
/**
@Author: Yeman
@Date: 2022-01-12-14:34
@Description:操作数据库的工具类
*/
public class jdbcUtils {
/**
@Description 获取数据库连接
@Param []
@return java.sql.Connection
**/
public static Connection getSqlConnection() throws Exception{
//1、加载配置文件
InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream(“jdbc.properties”);
Properties pros = new Properties();
pros.load(is);
//2、读取配置信息
String user = pros.getProperty(“user”);
String password = pros.getProperty(“password”);
String url = pros.getProperty(“url”);
String driverClass = pros.getProperty(“driverClass”);
//3、加载驱动
Class.forName(driverClass);
//4、获取连接
Connection conn = DriverManager.getConnection(url, user, password);
return conn;
}
/**
@Description 关闭连接和Statement资源
@Param [conn, ps]
@return void
**/
public static void closeResource(Connection conn, Statement ps){
try {
if (ps != null) ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
if (conn != null) conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
//重载
public static void closeResource(Connection conn, Statement ps, ResultSet res){
try {
if (ps != null) ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
if (conn != null) conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
if (res != null) res.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
@Description 通用增删改操作
@Param [sql, args]
@return void
**/
public static int updateDate(String sql, Object… args) {
Connection conn = null;
PreparedStatement ps = null;
try {
//获取数据库连接
conn = getSqlConnection();
//预编译sql语句,获取PreparedStatement实例
ps = conn.prepareStatement(sql);
//填充占位符
for (int i = 0; i < args.length; i++) {
ps.setObject(i + 1, args[i]);
}
//执行操作
return ps.executeUpdate(); //返回操作的字段数,没有则为0
} catch (Exception e) {
e.printStackTrace();
}finally {
//关闭资源
closeResource(conn, ps);
}
return 0;
}
}
②测试类
package jdbc;
import utils.jdbcUtils;
/**
@Author: Yeman
@Date: 2022-01-12-20:51
@Description:
*/
public class comUpdate {
public static void main(String[] args) {
String sql = “update order
set order_name = ? where order_id < ?”;
int bb = jdbcUtils.updateDate(sql, “BB”, 4);
System.out.println(bb);
}
}
5、使用PreparedStatement实现通用查询操作
这里所说的通用是针对同一数据库下的不同表或者同一张表的不同查询字段数。而要实现不同表的通用,则首先需要创建相应的不同Java类,即依据ORM思想。
/*
ORM编程思想(object relational mapping)
一个数据表对应一个Java类
表中的一条记录对应Java类的一个对象,一个字段对应Java类的一个属性
*/
例如,我这里的数据库中有一张customers表,因此我需要创建一个customers类。
package javabean;
import java.sql.Date;
/**
@Author: Yeman
@Date: 2022-01-12-21:08
@Description: customers表对应的Java类
*/
public class Customers {
private int id;
private String name;
private String email;
private Date birth;
public Customers() {
}
public Customers(int id, String name, String email, Date birth) {
this.id = id;
this.name = name;
this.email = email;
this.birth = birth;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
public String getEmail() {
return email;
}
public Date getBirth() {
return birth;
}
@Override
public String toString() {
return “Customers{” +
“id=” + id +
“, name='” + name + ‘’’ +
“, email='” + email + ‘’’ +
“, birth=” + birth +
‘}’;
}
}
①工具类(连接与关闭),即调用上面的Utils
②通用查询类
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.ArrayList;
import java.util.List;
/**
@Author: Yeman
@Date: 2022-01-13-20:45
@Description:
*/
public class Query {
public static List Query(Class clazz, String sql, Object… args) {
ArrayList ts = new ArrayList<>();
Connection conn = null;
PreparedStatement ps = null;
ResultSet res = null;
try {
//获取连接
conn = jdbcUtils.getSqlConnection();
//预编译sql语句,获取PreparedStatement实例
ps = conn.prepareStatement(sql);
//填充占位符
for (int i = 0; i < args.length; i++) {
ps.setObject(i + 1, args[i]);
}
//获取结果集
res = ps.executeQuery();
//获取结果集元数据
ResultSetMetaData metaData = res.getMetaData();
//获取列数
int columnCount = metaData.getColumnCount();
//处理结果集数据
while (res.next()){
T t = clazz.newInstance();
for (int i = 0; i < columnCount; i++) {
Object value = res.getObject(i + 1); //获取列值
String columnLabel = metaData.getColumnLabel(i + 1); //获取列的别名
//通过反射实现
Field field = clazz.getDeclaredField(columnLabel);
field.setAccessible(true);
field.set(t,value);
}
ts.add(t);
}
return ts;
} catch (Exception e) {
e.printStackTrace();
}finally {
//关闭资源
jdbcUtils.closeResource(conn,ps,res);
}
return null;
}
}
1、MySQL BLOB类型
MySQL中,BLOB是一个二进制大型对象,是一个可以存储大量数据的容器,它能容纳不同大小的数据。插入BLOB类型的数据必须使用PreparedStatement,因为BLOB类型的数据无法使用字符串拼接写的。
MySQL的四种BLOB类型(除了在存储的最大信息量上不同外,他们是等同的)
实际使用中根据需要存入的数据大小定义不同的BLOB类型。但需要注意的是,如果存储的文件过大,数据库的性能会下降。
如果在指定了相关的Blob类型以后,还报错:xxx too large,那么需要在mysql的安装目录下,打开my.ini文件最后加上 max_allowed_packet=16M
。修改my.ini文件之后,需要重新启动mysql服务才能生效。(找不到my.ini文件或者无法修改可以留言或者私信)
总结
谈到面试,其实说白了就是刷题刷题刷题,天天作死的刷。。。。。
为了准备这个“金三银四”的春招,狂刷一个月的题,狂补超多的漏洞知识,像这次美团面试问的算法、数据库、Redis、设计模式等这些题目都是我刷到过的
并且我也将自己刷的题全部整理成了PDF或者Word文档(含详细答案解析)
66个Java面试知识点
架构专题(MySQL,Java,Redis,线程,并发,设计模式,Nginx,Linux,框架,微服务等)+大厂面试题详解(百度,阿里,腾讯,华为,迅雷,网易,中兴,北京中软等)
算法刷题(PDF)
e,那么需要在mysql的安装目录下,打开my.ini文件最后加上 max_allowed_packet=16M
。修改my.ini文件之后,需要重新启动mysql服务才能生效。(找不到my.ini文件或者无法修改可以留言或者私信)
总结
谈到面试,其实说白了就是刷题刷题刷题,天天作死的刷。。。。。
为了准备这个“金三银四”的春招,狂刷一个月的题,狂补超多的漏洞知识,像这次美团面试问的算法、数据库、Redis、设计模式等这些题目都是我刷到过的
并且我也将自己刷的题全部整理成了PDF或者Word文档(含详细答案解析)
[外链图片转存中…(img-MIY2ESET-1715547538489)]
66个Java面试知识点
架构专题(MySQL,Java,Redis,线程,并发,设计模式,Nginx,Linux,框架,微服务等)+大厂面试题详解(百度,阿里,腾讯,华为,迅雷,网易,中兴,北京中软等)
[外链图片转存中…(img-HDPPKSPW-1715547538489)]
算法刷题(PDF)
[外链图片转存中…(img-5nSfJKWq-1715547538490)]