新年迈出Java后台服务器与数据库交互第一步2022最新通用Java8jdbc8连接mysql8数据库进行增删改查等基本操作详解(IDEA),jar包导入,图片等文件流,批量操作

文章目录

    • 一、JDBC下载与导入
    • 二、获取连接
    • 三、PreparedStatement类操作数据库
    • 四、操作BLOB类型字段(图片视频等)
    • 五、Batch批量插入
    • 🙆🏻‍♀️🙆🏻‍♀️文末最新版jdbc jar包下载 🙆🏻‍♀️🙆🏻‍♀️


一、JDBC下载与导入

1、jar包下载

👇👇👇划至文末有mysql-connector-java-8.0.27.jar的阿里云盘链接🔗,已经只留下有用的jar包文件了,下载即可用。

2、导入(IDEA)

①在工程下新建一个文件夹(可以命名为libs)
在这里插入图片描述

②将下载的jar包复制粘贴到该文件夹里面,然后右键该文件夹选择"Add as Library"
在这里插入图片描述


二、获取连接

1、创建配置文件jdbc.properties

配置信息如下:

user=用户(root)
password=数据库密码
url=jdbc:mysql://localhost:3306/test?useUnicode=true&character=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true
driverClass=com.mysql.cj.jdbc.Driver

说明:

url=jdbc:mysql://主机名称:mysql服务端口号/数据库名称?参数=&参数=

使用配置文件的好处:实现了代码和数据的分离,如果需要修改配置信息,直接在配置文件中修改,不需要深入代码;如果修改了配置信息,省去重新编译的过程。

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);}
}

三、PreparedStatement类操作数据库

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;}@Overridepublic 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 <T> List<T> Query(Class<T> clazz, String sql, Object... args) {ArrayList<T> 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;}
}

四、操作BLOB类型字段(图片视频等)

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;ResultSet res = null;InputStream is = null;FileOutputStream os = null;try {conn = jdbcUtils.getSqlConnection();String sql = "select id,name,email,birth,photo from customers where id = ?";ps = conn.prepareStatement(sql);ps.setObject(1,16);res = ps.executeQuery();while (res.next()){int id = res.getInt("id");String name = res.getString("name");String email = res.getString("email");Date birth = res.getDate("birth");Customers customers = new Customers(id, name, email, birth);System.out.println(customers);//以二进制流的形式读取下来写到本地Blob photo = res.getBlob("photo");is = photo.getBinaryStream();os = new FileOutputStream("zhuyin.jpg");byte[] buffer = new byte[1024];int len = 0;while ((len = is.read(buffer)) != -1){os.write(buffer,0,len);}}} catch (Exception e) {e.printStackTrace();}finally {try {if (is != null) is.close();} catch (IOException e) {e.printStackTrace();}try {if (os != null) os.close();} catch (IOException e) {e.printStackTrace();}jdbcUtils.closeResource(conn,ps,res);}}
}

五、Batch批量插入

1、批量执行SQL语句

当需要成批插入或者更新记录时,可以采用Java的批量更新机制,这一机制允许多条语句一次性提交给数据库批量处理。通常比单独提交处理具有更高的效率。

JDBC 的批量处理语句包括下面三个方法:
addBatch(String):添加需要批量处理的SQL语句或参数;
executeBatch():执行批量处理语句;
clearBatch():清空缓存的数据。

2、高效的批量插入

mysql服务器默认是关闭批量处理的,我们需要通过一个参数,让mysql开启批处理的支持。即将 ?rewriteBatchedStatements=true 补充在配置文件jdbc.properties的 url 的参数位置。

举例:向数据表goods中插入20000条数据

package jdbc;import utils.jdbcUtils;import java.sql.Connection;
import java.sql.PreparedStatement;/*** @Author: Yeman* @Date: 2022-01-14-12:09* @Description: 批量操作*/
public class goods {public static void main(String[] args) {Connection conn = null;PreparedStatement ps = null;try {long begin = System.currentTimeMillis();//获取连接conn = jdbcUtils.getSqlConnection();//设置为不可自动提交conn.setAutoCommit(false);//预编译sql语句,获取PreparedStatement实例String sql = "insert into goods(name) value(?)";ps = conn.prepareStatement(sql);//填充占位符,使用Batch积攒要执行的sqlfor (int i = 1; i <= 1000000; i++) {ps.setString(1, "name" + i);//攒sqlps.addBatch();//执行(这里设置为每5000条执行一次)if (i % 5000 == 0){ps.executeBatch();//清空ps.clearBatch();}}//使其提交conn.commit();long end = System.currentTimeMillis();System.out.println("花费的时间为:" + (end - begin));} catch (Exception e) {e.printStackTrace();}finally {//关闭连接jdbcUtils.closeResource(conn,ps);}}
}

🙆🏻‍♀️🙆🏻‍♀️文末最新版jdbc jar包下载 🙆🏻‍♀️🙆🏻‍♀️

点击最新版jdbc jar包下载(阿里云盘)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

最优化理论与算法笔记

最优化理论与算法笔记

Win32编程之基于MATLAB与VC交互的多项式回归

运行环境 Matlab R2018b x64 or x32 Visual Studio 2017 企业版 程序预览 文末有完整程序代码下载地址,有任何问题欢迎留言,谢谢点赞哟! 程序功能描述 矩阵运算是大多数科学运算的必要工具。通常情况下,Matlab是实现矩阵运算的最佳工具,但是大多数Matlab运算都是基于d…

隔离区别对待?如何捆绑?Java中的jdbc数据库事务及其隔离级别

文章目录一、数据库事务简介二、JDBC事务处理三、事务的ACID属性四、数据库的隔离级别五、设置隔离级别一、数据库事务简介 事务&#xff1a;一组逻辑操作单元&#xff0c;使数据从一种状态变换到另一种状态。 事务处理&#xff08;事务操作&#xff09;&#xff1a;保证所有…

基于VS的连连看小游戏

运行环境 Matlab R2018b x64 or x32 Visual Studio 2017 企业版 程序预览 目前功能只开发了基本模式,也即是基本的连连看功能和帮助功能,文末有完整程序代码下载地址,有任何问题欢迎留言,谢谢点赞哟! 重要设计步骤和思路以及实现如下所示。 设计思路 类设计

idea使用c3p0数据库连接池无法加载配置文件xml,配置文件放置的位置

注意&#xff1a;要把c3p0-config.xml文件放在输出的文件夹里面&#xff0c;即放在out里面&#xff0c;而不是放在src里面。&#xff08;如下图&#xff09; 至于配置文件怎么写&#xff0c;可以参考其他经验教程&#xff0c;这里不再赘述。

自适应滤波实例之系统辨识

实验模型 x(n):随机信号,服从N(0,1)分布 h(n):未知的系统响应(由5阶FIR低通滤波器模拟) h=[0.2,0.5,0.7,-0.5,0.2]; d(n):期望信号,d(n)=x(n)*h(n) 目标:根据接收端接收信号r(n)(此时即为期望信号d(n))和训练序列x’(n)求未知的h(n) LMS实验结果 设自适应滤波器…

jdbc数据库连接池C3P0和Druid德鲁伊,Java与MySQL数据库交互

文章目录一、 连接池的必要性二、数据库连接池技术三、多种开源的数据库连接池四、C3P0数据库连接池五、Druid&#xff08;德鲁伊&#xff09;数据库连接池六、C3P0和Druid驱动jar包一、 连接池的必要性 在使用开发基于数据库的web程序时&#xff0c;传统的模式基本是按以下步…

使用Spring Boot构建REST Web服务

本教程提供了有关如何使用Spring Boot构建Restfull Web服务的分步指南。 先决条件&#xff1a; Eclipse IDE&#xff08;最新版本&#xff09; Maven的4 Java 1.8 1.创建Maven Web项目 打开eclipse&#xff0c;然后创建一个新的Maven Web项目&#xff0c;并将其命名为Spri…

Apache-DBUtils实现CRUD操作,已封装的API实现jdbc对数据库进行操作

文章目录一、Apache-DBUtils简介二、主要API的使用1、DbUtils类2、QueryRunner类3、ResultSetHandler接口及实现类三、Apache-DBUtils驱动下载一、Apache-DBUtils简介 commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库&#xff0c;它是对JDBC的简单封装&#xff0c…

自适应滤波实例之系统逆辨识(以及系统零极点对逆辨识效果的影响分析)

实验模型 x(n):随机信号,服从N(0,1)分布 h(n):未知的系统响应(由10阶FIR低通滤波器模拟) h=[0.03,-0.04,0.06,-0.2,-0.5,0.75,0.37,0.24,0.01,0.06]; d(n):期望信号,d(n)=x(n)*h(n) 目标:根据接收端接收信号r(n)和训练序列x’(n) (此时即为期望信号d(n)),求未知…

卡尔曼滤波实例之系统逆辨识

实验模型 x(n):随机信号,服从N(0,1)分布 h(n):未知的系统响应(由10阶FIR低通滤波器模拟) h=[0.03,-0.04,0.06,-0.2,-0.5,0.75,0.37,0.24,0.01,0.06]; d(n):期望信号,d(n)=x(n)*h(n) 目标:根据接收端接收信号r(n)和训练序列x’(n) (此时即为期望信号d(n)),求未知…

static和瞬态_具有瞬态属性的视图对象的钝化和激活

static和瞬态在应用程序模块的钝化/激活周期内&#xff0c;框架也将钝化并激活视图对象。 通常&#xff0c;框架保存有关VO状态&#xff0c;当前行&#xff0c;绑定变量值等的信息。 但是没有数据。 激活视图对象后&#xff0c;将重新执行VO的查询&#xff0c;并重新获取数据。…

你是不是已经超纲了?一文解决JavaWeb中要求的HTML,是什么样的?

文章目录一、正经的开始 &#x1f469;&#x1f3fb;&#x1f469;&#x1f3fb;&#x1f469;&#x1f3fb;二、HTML简介1、HTML“化简为繁”2、超文本“醉翁之意”3、标记“画地为牢”4、永远的HelloWorld5、HTML文件“解衣”6、HTML“潜规则”三、使用HTML展示文章1、标题“…

自适应滤波实例之噪声抵消

实验模型 s(n)是立体声音乐信号,fs=8kHz,平均功率为0.0047; v(n)是零均值高斯白噪声,方差为1; h(n)是由5阶FIR低通滤器模拟,带宽为[0, 0.35fs]; 目标:d(n)中包含音乐信号s’(n)和白噪声v’(n),v’(n)为v(n)经过系统h(n)后的输出,则x(n)=v(n)与v’(n)具有相关性,利…

初学JavaWeb,前端css要不要了解一下啊?一文学会JavaWeb中css的简单应用

文章目录一、设置CSS样式二、CSS代码语法三、CSS选择器四、css文档手册分享关于JavaWeb中的HTML&#xff1a;《你是不是已经超纲了&#xff1f;一文解决JavaWeb中要求的HTML&#xff0c;是什么样的&#xff1f;》 一、设置CSS样式 有三种设置方式。 1、在HTML标签内设置&#…

堆栈图解CSAPP Bomb Lab实验解析

CSAPP Bomb Lab 实验解析 Bomblab是csapp的第二个配套实验&#xff0c;该实验提供了一个bomb二进制文件和一个bomb.c源文件&#xff0c;我们的目标是运行bomb并按照提示一步步输入字符串&#xff0c;直到完成整个拆炸弹的流程。但是源文件中只提供了部分代码&#xff0c;所以我…

初学JavaWeb需要的前端js,JavaScript是什么样的?

文章目录一、JavaScript简介二、HelloWorld三、JavaScript基本语法四、DOM五、JavaScript事件驱动六、网页制作完全手册分享关于HTML和css详见&#xff1a;《JavaWeb中的HTML和css》 一、JavaScript简介 1、起源 1995年&#xff0c;JavaScript由Netscape公司的Brendan Eich在网…

踩坑+排雷新版IDEA2021.1创建配置Javaweb项目并部署在Tomcat容器,完整详细

前些天发现了十分不错的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;没有广告&#xff0c;分享给大家&#xff0c;大家可以自行看看。&#xff08;点击跳转人工智能学习资料&#xff09; 微信公众号&#xff1a;创享日记 发送&#xff1a;tomcat 获取…

微机原理实验1:字符串匹配程序实验

一、实验目的 1&#xff0e;掌握分支程序的设计方法。 2&#xff0e;熟悉在PC机上建立、汇编、链接、调试和运行8086汇编程序的过程。 二、实验内容 1&#xff0e;比较两个字符串STRING1和STRING2所含的字符是否相同&#xff0c;若相同则显示‘Match’&#xff0c;否则显示‘…

终于让Web前端和Tomcat(Java服务器)和MySQL(数据库)连在一起了

文章目录一、先在Web前端来个表单二、添加Tomcat依赖三、引入jdbc和dbutils四、编写Servlet类五、关联模块《踩坑排雷新版IDEA2021.1创建配置Javaweb项目并部署在Tomcat容器》 一、先在Web前端来个表单 如图在web项目目录下创建一个html文件。 文件内容可以参考如下。 <!D…