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文件或者无法修改可以留言或者私信)
2、向数据表中增(改)大数据类型
package jdbc;
import utils.jdbcUtils;
import java.io.File;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
/**
-
@Author: Yeman
-
@Date: 2022-01-13-22:13
-
@Description:
*/
public class Blob01 {
public static void main(String[] args) throws Exception {
//获取连接
Connection conn = jdbcUtils.getSqlConnection();
//预编译sql语句,获取PreparedStatement实例
String sql = “insert into customers(name,email,birth,photo) values(?,?,?,?)”;
PreparedStatement ps = conn.prepareStatement(sql);
//填充占位符
ps.setObject(1,“叶绿体”);
ps.setObject(2,“yelvti@163.com”);
ps.setObject(3,“2000-01-01”);
//即以流的形式读取图片文件后再添加到数据库中(增和改类似)
FileInputStream photo = new FileInputStream(new File(“a.jpg”));
ps.setObject(4,photo);
//执行
ps.execute();
//关闭连接
jdbcUtils.closeResource(conn,ps);
}
}
3、从数据库表中读取大数据类型
package jdbc;
import javabean.Customers;
import utils.jdbcUtils;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
/**
-
@Author: Yeman
-
@Date: 2022-01-13-22:34
-
@Description:这里以customer表为例,该表中有一photo图片类型数据
*/
public class Blob02 {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement ps = null;
结局:总结+分享
看完美团、字节、腾讯这三家的一二三面试问题,是不是感觉问的特别多,可能咱们真的又得开启面试造火箭、工作拧螺丝的模式去准备下一次的面试了。
开篇有提及我可是足足背下了Java互联网工程师面试1000题,多少还是有点用的呢,换汤不换药,不管面试官怎么问你,抓住本质即可!能读到此处的都是真爱
- Java互联网工程师面试1000题
而且从上面三家来看,算法与数据结构是必备不可少的呀,因此我建议大家可以去刷刷这本左程云大佬著作的 《程序员代码面试指南 IT名企算法与数据结构题目最优解》,里面近200道真实出现过的经典代码面试题。
- 程序员代码面试指南–IT名企算法与数据结构题目最优解
- 其余像设计模式,建议可以看看下面这4份PDF(已经整理)
- 更多的Java面试学习笔记如下,关于面试这一块,我额外细分出Java基础-中级-高级开发的面试+解析,以及调优笔记等等等。。。
以上所提及的全部Java面试学习的PDF及笔记,如若皆是你所需要的,那么都可发送给你!
Connection conn = null;
PreparedStatement ps = null;
结局:总结+分享
看完美团、字节、腾讯这三家的一二三面试问题,是不是感觉问的特别多,可能咱们真的又得开启面试造火箭、工作拧螺丝的模式去准备下一次的面试了。
开篇有提及我可是足足背下了Java互联网工程师面试1000题,多少还是有点用的呢,换汤不换药,不管面试官怎么问你,抓住本质即可!能读到此处的都是真爱
- Java互联网工程师面试1000题
[外链图片转存中…(img-7568Y2uh-1720113064753)]
而且从上面三家来看,算法与数据结构是必备不可少的呀,因此我建议大家可以去刷刷这本左程云大佬著作的 《程序员代码面试指南 IT名企算法与数据结构题目最优解》,里面近200道真实出现过的经典代码面试题。
- 程序员代码面试指南–IT名企算法与数据结构题目最优解
[外链图片转存中…(img-yp9wOiwa-1720113064754)]
- 其余像设计模式,建议可以看看下面这4份PDF(已经整理)
[外链图片转存中…(img-VhTaL5Y2-1720113064754)]
- 更多的Java面试学习笔记如下,关于面试这一块,我额外细分出Java基础-中级-高级开发的面试+解析,以及调优笔记等等等。。。
[外链图片转存中…(img-al0beDH4-1720113064755)]
以上所提及的全部Java面试学习的PDF及笔记,如若皆是你所需要的,那么都可发送给你!