Java和MySQL的连接和操作(JDBC)

article/2025/8/21 6:00:27

一、数据库的连接

1. 引入JDBC驱动程序

1.1 如何获取驱动程序

驱动程序由数据库提供商提供下载。
MySQL 的驱动下载地址:http://dev.mysql.com/downloads/
依次点击 Connector/J -> Platform Independent ,如然后下载下面那个
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.2 如何在Java project 项目应用中添加数据库驱动 jar

① 把下载好的mysql-connector-j-8.0.31.jar拷贝到该项目中
在这里插入图片描述
ps:这里的lib文件夹是自己创建的(也可不创建)

② 然后点击Add as Library -> OK,把其添加到项目类路径下
在这里插入图片描述
这样就表示成功了

2. 连接操作

2.1 方式一:

@Testpublic void testConnection1() throws SQLException {//获取Driver实现类对象Driver driver = new com.mysql.cj.jdbc.Driver();//jdbc:mysql协议//localhost:ip地址//3306: 默认端口//student_attendance_system: 数据库名称String url = "jdbc:mysql://localhost:3306/student_attendance_system";Properties info = new Properties();//将用户名和密码封装在Propertyinfo.setProperty("user", "root");info.setProperty("password", "0915");Connection conn = driver.connect(url, info);System.out.println(conn);}

2.2 方式二:队方式一的迭代(目的:为了使程序不出现第三方的API,使得程序有更好的移植性)

@Testpublic void testConnection2() throws Exception {//1.获取Driver实现类对象Class clazz = Class.forName("com.mysql.cj.jdbc.Driver");Driver driver = (Driver) clazz.newInstance();//2. 提供数据库连接String url = "jdbc:mysql://localhost:3306/student_attendance_system";//3. 提供连接需要的用户名和密码Properties info = new Properties();info.setProperty("user", "root");info.setProperty("password", "0915");//4. 获取连接Connection conn = driver.connect(url, info);System.out.println(conn);}

2.3 方式三:使用DriverManager替换Driver

@Testpublic void testConnection3() throws Exception {//1. 获取Driver实现类对象Class clazz = Class.forName("com.mysql.cj.jdbc.Driver");Driver driver = (Driver) clazz.newInstance();//2. 提供3个类的基本信息String url = "jdbc:mysql://localhost:3306/student_attendance_system";String user = "root";String password = "0915";//注册驱动DriverManager.registerDriver(driver);//获取连接Connection conn =  DriverManager.getConnection(url, user, password);System.out.println(conn);}

2.4 方式4:可以只加载,不用显示的注册驱动(Driver)

@Testpublic void testConnection4() throws Exception {//1. 提供3个类的基本信息String url = "jdbc:mysql://localhost:3306/student_attendance_system";String user = "root";String password = "0915";//2. 加载DriverClass clazz = Class.forName("com.mysql.cj.jdbc.Driver"); //也可以省略,因为META-INF/service的java.sql.Driver已经做过了//相较于方式三,可以省略如下操作:
//        Driver driver = (Driver) clazz.newInstance();//注册驱动
//        DriverManager.registerDriver(driver);//获取连接Connection conn =  DriverManager.getConnection(url, user, password);System.out.println(conn);}

2.5 方式五:将数据库连接需要的4个基本信息声明在配置文件中,通过读取配置文件的方式,获取连接

这里要在src文件夹下建立一个文件(jdbc.properties),可以其他名字,然后在该文件下输入数据库连接需要的属性
ps:一般连数据库用这种方式

文件内容:

driver=com.mysql.cj.jdbc.Driver 
url=jdbc:mysql://localhost:3306/test
user=root
password=0915

连接代码:

@Testpublic void testConnection5() throws Exception {// 1. 读取配置文件的4个信息InputStream is = SqlConnectionTest.class.getClassLoader().getResourceAsStream("src/jdbc.properties");Properties pros = new Properties();pros.load(is);String user = pros.getProperty("user");String password = pros.getProperty("password");String url = pros.getProperty("url");String driver = pros.getProperty("driver");//2. 加载驱动Class.forName(driver);Connection conn = DriverManager.getConnection(url, user, password);System.out.println(conn);}

3. 拓展

一般在项目中,数据库连接用一个工具类来会更好,这样只要在用的时候,直接调用就好了。

工具类:

package src.Util;import src.SqlConnectionTest.SqlConnectionTest;import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;/*** @author XiaoQ* @create 2022-12-11 19:26*/
public class JDBCUtils {/*** @Description 获取数据库的连接* @return Connection* @author XiaoQ* @date 2022/12/11 20:22*/public static Connection getConnection() throws Exception {// 1. 读取配置文件的4个消息InputStream is = SqlConnectionTest.class.getClassLoader().getResourceAsStream("src/jdbc.properties");Properties pros = new Properties();pros.load(is);String user = pros.getProperty("user");String password = pros.getProperty("password");String url = pros.getProperty("url");String driver = pros.getProperty("driver");//2. 加载驱动Class.forName(driver);//3. 获取连接Connection conn = DriverManager.getConnection(url, user, password);return conn;}/*** @Description 关闭连接和Statement* @return* @author XiaoQ* @date 2022/12/11 20:25*/static public void closeResource(Connection conn, Statement ps){try {if(ps != null)ps.close();} catch (SQLException e) {throw new RuntimeException(e);}try {if(conn != null)conn.close();} catch (SQLException e) {throw new RuntimeException(e);}}/*** @Description 关闭连接、Statement、ResultSet* @return * @author XiaoQ* @date 2022/12/12 1:51*/static public 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();}}
}

二、数据库的操作

1. 数据库的增、删、改操作

1.1 普通的增加操作

@Testpublic void insertTest(){Connection conn = null;PreparedStatement ps = null;try {// 1. 读取配置文件的4个消息InputStream is = SqlConnectionTest.class.getClassLoader().getResourceAsStream("src/jdbc.properties");Properties pros = new Properties();pros.load(is);String user = pros.getProperty("user");String password = pros.getProperty("password");String url = pros.getProperty("url");String driver = pros.getProperty("driver");//2. 加载驱动Class.forName(driver);//3. 获取连接conn = DriverManager.getConnection(url, user, password);
//        System.out.println(conn);//4. 预编译sql语句,返回PreparedStatement的实例String sql = "insert into stu values(?, ?, ?)";ps = conn.prepareStatement(sql);//5. 填充占位符ps.setString(1, "2001");ps.setString(2, "小黑");ps.setString(3, "89");//6. 执行sql语句ps.execute();} catch (Exception e) {throw new RuntimeException(e);} finally {//7. 资源关闭try {if(ps != null)ps.close();} catch (SQLException e) {throw new RuntimeException(e);}try {if(ps != null)conn.close();} catch (SQLException e) {throw new RuntimeException(e);}}}

1.2 使用工具类后普通的修改操作

工具类JDBCUtils具体细节上面有

 @Testpublic void updateTest(){Connection conn = null;PreparedStatement ps = null;try {//获取数据库连接conn = JDBCUtils.getConnection();//预编译sql语句,返回PreparedStatementString sql = "update stu set name = ? where id = ?";ps = conn.prepareStatement(sql);//填充占位符ps.setString(1, "小小");ps.setObject(2, "1003");//执行操作ps.execute();} catch (Exception e) {e.printStackTrace();} finally {//关闭资源JDBCUtils.closeResource(conn,ps);}}

1.3 通用操作(增、删、改)

操作

public static void update(String sql, Object ...args){Connection conn = null;PreparedStatement ps = null;try {//获取数据库连接conn = JDBCUtils.getConnection();//预编译sql语句,返回PreparedStatementps = conn.prepareStatement(sql);//填充占位符for(int i = 0; i < args.length; i++){ps.setObject(i + 1, args[i]);}//执行操作ps.execute();} catch (Exception e) {e.printStackTrace();} finally {//关闭资源JDBCUtils.closeResource(conn,ps);}}

测试

@Testpublic void commonUpdateTest(){//增加操作String sql = "insert into stu values(?, ?, ?)";update(sql, "1005", "小达", 89);//修改操作sql = "update stu set name = ? where id = ?";update(sql, "小朱", "1005");//删除操作sql = "delete from stu where id = ?";update(sql, "1005");}

2. 数据库的查询操作

2.1 对一个表的普通查询操作(基础不好或初学者用这个就够了,这个比较简单且比较好理解)

public void test1() {Connection conn = null;PreparedStatement ps = null;ResultSet resultSet = null;try {//获取数据库的连接conn = JDBCUtils.getConnection();//预编译sql语句String sql = "select * from stu where id = ?";ps = conn.prepareStatement(sql);//填充占位符ps.setObject(1, "2066");//执行,并返回结果集resultSet = ps.executeQuery();if(resultSet.next()){//获取列值String id = resultSet.getString(1); //获取第一个字段String name = resultSet.getString(2); //获取第二个字段int score = resultSet.getInt(3); //获取第三个字段//把列值封装到Student对象中Student stu = new Student(id, name, score);System.out.println(stu);}} catch (Exception e) {e.printStackTrace();} finally {//关闭连接JDBCUtils.closeResource(conn, ps, resultSet);}}

2.2 对一个表的通用查询操作

注意:针对于表的字段于类的属性名不相同的情况:

  1. 必须在声明sql语句时,使用类的属性名来给字段起别名
  2. 使用ResultSetMetaData时,需要用getColumnLabel()来替换getCoulmnName(),获取列的别名
    说明:如果sql语句没有给字段起别名,那么gewtColumnLabel()得到就是列名

操作

 public Student queryForStu(String sql, Object ...args) {Connection conn = null;PreparedStatement ps = null;ResultSet rs = null;try {//获取数据库连接conn = JDBCUtils.getConnection();//sql语句的预处理ps = conn.prepareStatement(sql);//占位符填充for(int i = 0; i < args.length; i++){ps.setObject(i + 1, args[i]);}//执行,并返回结果集rs = ps.executeQuery();//获取结果集的元数据ResultSetMetaData rsmd = rs.getMetaData();//通过ResultSetMetaData获取结果集的列数int columnCount = rsmd.getColumnCount();if(rs.next()){Student stu = new Student();for(int i = 0; i < columnCount; i++){//获取列值Object columnValue = rs.getObject(i + 1);//getColumnName: 获取列的列名//getColumnLabel: 获取列的别名(推荐用这个,因为如果没查询起别名的,那么别名就是字段名)String columnName = rsmd.getColumnName(i + 1);//给stu对象指定的columnName属性,赋值为columnValue,通过反射//注意:如果该表的字段(这里指stu表)不和该类(这里指Student类)的属性对应相同,那么sql查询语句就要给//      查询的字段起别名,防止反射后报错Field field = Student.class.getDeclaredField(columnName);//void setAccessible(boolean flag)//为反射对象设置可访问标志。flag为true表明屏蔽java语言的访问检查,使得对象的私有属性也可以被查询和设置field.setAccessible(true);//访问不符合访问权限对象的成员属性field.set(stu, columnValue);}return stu;}} catch (Exception e) {e.printStackTrace();} finally {JDBCUtils.closeResource(conn, ps, rs);}return null;}

测试

@Testpublic void testQueryForStu(){String sql = "select * from stu where id = ?";Student student = queryForStu(sql, "2066");System.out.println(student);sql = "select name from stu where id = ?";student = queryForStu(sql, "2001");System.out.println(student);}

2.3 针对不同表的查询,返回一条纪录(泛型)

操作:

/*** @Description 针对不同表的通用查询,返回一条记录* @return T* @author XiaoQ* @date 2022/12/12 0:50*/public <T> T getInstance(Class<T> clazz, String sql, Object ...args) {Connection conn = null;PreparedStatement ps = null;ResultSet rs = null;try {//获取数据库连接conn = JDBCUtils.getConnection();//sql语句的预处理ps = conn.prepareStatement(sql);//占位符填充for(int i = 0; i < args.length; i++){ps.setObject(i + 1, args[i]);}//执行,并返回结果集rs = ps.executeQuery();//获取结果集的元数据ResultSetMetaData rsmd = rs.getMetaData();//通过ResultSetMetaData获取结果集的列数int columnCount = rsmd.getColumnCount();if(rs.next()){T t = clazz.newInstance();for(int i = 0; i < columnCount; i++){//获取列值Object columnValue = rs.getObject(i + 1);//getColumnName: 获取列的列名//getColumnLabel: 获取列的别名(推荐用这个,因为如果没查询起别名的,那么别名就是字段名)String columnName = rsmd.getColumnLabel(i + 1);//给stu对象指定的columnName属性,赋值为columnValue,通过反射//注意:如果该表的字段(这里指stu表)不和该类(这里指Student类)的属性对应相同,那么sql查询语句就要给//      查询的字段起别名,防止反射后报错Field field = clazz.getDeclaredField(columnName);//void setAccessible(boolean flag)//为反射对象设置可访问标志。flag为true表明屏蔽java语言的访问检查,使得对象的私有属性也可以被查询和设置field.setAccessible(true);//访问不符合访问权限对象的成员属性field.set(t, columnValue);}return t;}} catch (Exception e) {e.printStackTrace();} finally {JDBCUtils.closeResource(conn, ps, rs);}return null;}

测试

@Testpublic void test(){String sql = "select * from stu where id = ?";Student student = getInstance(Student.class, sql, "1001");System.out.println(student);sql = "select t_id id, t_name name, salary from teacher where t_id = ?";Teacher teacher = getInstance(Teacher.class, sql, "4563");System.out.println(teacher);}

2.4 针对不同表的通用查询,返回多条记录(泛型)

操作

/*** @Description 对不同表的通用查询,返回多条记录* @return List<T>* @author XiaoQ* @date 2022/12/12 1:00*/public <T>List<T> getForList(Class<T> clazz, String sql, Object ...args){Connection conn = null;PreparedStatement ps = null;ResultSet rs = null;try {//获取数据库连接conn = JDBCUtils.getConnection();//sql语句的预处理ps = conn.prepareStatement(sql);//占位符填充for(int i = 0; i < args.length; i++){ps.setObject(i + 1, args[i]);}//执行,并返回结果集rs = ps.executeQuery();//获取结果集的元数据ResultSetMetaData rsmd = rs.getMetaData();//通过ResultSetMetaData获取结果集的列数int columnCount = rsmd.getColumnCount();//创建集合对象ArrayList<T> list = new ArrayList<T>();while (rs.next()){T t = clazz.newInstance();//处理结果集一行数据中的每一列:给t对象指定的属性赋值for(int i = 0; i < columnCount; i++){//获取列值Object columnValue = rs.getObject(i + 1);//getColumnName: 获取列的列名//getColumnLabel: 获取列的别名(推荐用这个,因为如果没查询起别名的,那么别名就是字段名)String columnName = rsmd.getColumnLabel(i + 1);//给stu对象指定的columnName属性,赋值为columnValue,通过反射//注意:如果该表的字段(这里指stu表)不和该类(这里指Student类)的属性对应相同,那么sql查询语句就要给//      查询的字段起别名,防止反射后报错Field field = clazz.getDeclaredField(columnName);//void setAccessible(boolean flag)//为反射对象设置可访问标志。flag为true表明屏蔽java语言的访问检查,使得对象的私有属性也可以被查询和设置field.setAccessible(true);//访问不符合访问权限对象的成员属性field.set(t, columnValue);}list.add(t);}return list;} catch (Exception e) {e.printStackTrace();} finally {JDBCUtils.closeResource(conn, ps, rs);}return null;}

测试

@Testpublic void test1(){String sql = "select * from stu";List<Student> list = getForList(Student.class, sql);list.forEach(System.out::println);sql = "select t_id id, t_name name, salary from teacher where salary < ?";List<Teacher> list1 = getForList(Teacher.class, sql, 1000);list1.forEach(System.out::println);}

http://chatgpt.dhexx.cn/article/VbHZsd3r.shtml

相关文章

Java连接MySQL数据库具体操作

一&#xff0c;主要分为5个步骤 1&#xff0c;获取驱动 首先下载自己mysql版本的jar包 下载地址&#xff1a;MySQL :: Download Connector/J 将下载好的jar包复制到jdk的安装目录下的jre下的lib下的ext目录下 mysql.5及以下的版本获取驱动是Class.forName("com.mysql.jdb…

MySQL学习(五)JDBC 使用java操作数据库

目录 1.JDBC基本原理 2.数据库驱动包的导入&#xff08;环境配置&#xff09; 3.JDBC的使用步骤 4.JDBC的常用接口和抽象类 5.核心小结&#xff1a; 1.JDBC基本原理 现在&#xff0c;要使用java操作数据库&#xff0c;则我们的项目的构建或者说代码的组成增加为了三方&…

Java JDBC操作MySQL

DBMS里有多个数据库&#xff0c;每个库中又有多张表。 客户端有命令终端(DoS)、SQLyog、Java等。 Mysql数据库、普通表的本质仍然是文件。 表的一行称为一条记录&#xff0c;对应Java中的一个对象。 SQL语句的分类为 1、DDL数据定义语言 create 表、库 2、DML 数据操作语言 in…

Java对MySQL数据库进行操作【java】

数据库几乎是每一个应用型的程序都会用到&#xff0c;学会如何高效操作数据库也是开发一个重点。今天我总结了具体的操作步骤以及注意点。Java访问数据库主要用的方法是JDBC&#xff0c;它是java语言中用来规范客户端程序如何来访问数据库的应用程序接口&#xff0c;提供了诸如…

Java 中使用 MySql以及一些Mysql 基本的命令

Linux mint 环境下配置 mysql 打开终端输入 sudo apt-get install mysql-server,回车即可安装 mysql&#xff0c;当然如果你想使用最新的 mysql&#xff0c;可以去官方下载并且配置&#xff0c;教程网上有很多&#xff0c;就不再赘述。 安装完成之后&#xff0c;在终端中输入…

【java对MySQL的操作详解】java学习之增查

文章目录 前言一&#xff0c;封装JDBC二&#xff0c;增2.1&#xff0c;UserDAO.java2,2&#xff0c;UserServier.java2,3&#xff0c;userUI.java添加用户 三&#xff0c;查3.1&#xff0c;UserUI伪iu3.2&#xff0c;UserServier.java3.3&#xff0c;UserDAO.java END 前言 具…

在Java中操作MySQL(JDBC)

准备工作 ideamysql 官方的 jdbc 驱动 先在 idea 中建立一个新的 java 工程 直到这一步之前&#xff0c;一直按下一步就行了 把名字改改直接 finish 在这个工程下面建立一个名字为 lib 的空文件夹 去官方下载依赖的包 https://dev.mysql.com/downloads/connector/j/ 选…

java操作mysql数据库

java操作mysql数据库 学习到数据库操作这一章&#xff0c;遇到了很多问题&#xff0c;只能说无论什么时候&#xff0c;用什么工具来操作数据库&#xff0c;都不是一件简单的事情。 简单记录一下 数据库连接 先看代码界面 要连接数据库&#xff0c;首先需要导入mysql依赖包&…

用Java操作MySQL

用Java操作MySQL目录 一、创建数据库1、建库2、建表 二、开始准备jdbc1、导入mysql驱动jar包2、开始写jdbc代码 三、那就运行吧附&#xff1a;最终代码DBUtilMaindb.properties 一、创建数据库 打开Navicat&#xff08;我用的是DataGrip&#xff09;的查询控制台 1、建库 sq…

c++ opencv 身份证OCR识别:前期数据训练库准备(tesseractOCR)

前言&#xff1a;本文已经在个人博客更新排版和讲解【传送门】 整个教程已经在有道云写好了&#xff0c;在博客要重新把每个图片再上传一次有点累&#xff0c;先截了图直接看吧&#xff01;如果有需要有提供word版本可以下载 https://download.csdn.net/download/stopping5/11…

身份证正反面识别,身份证扫描识别,二代身份证OCR识别,OCR极速识别身份证所有信息正反面均可。离线无需联网,极速秒扫。

项目说明 极速识别二代身份证、驾驶证、护照 (无需联网&#xff0c;离线秒扫&#xff0c;极速识别)身份证所有信息, 包含姓名、性别、出生年月、详细地址&#xff0c;正反面。不需要联网即可离线识别身份证所有信息包括新疆少数民族身份证&#xff0c;识别速度快&#xff0c;识…

如何对接身份证OCR?

【身份证OCR文字识别】身份证OCR识别-身份证识别-身份证-OCR文字-身份证OCR文字-身份证OCR-身份证OCR图像识别【最新版】_图像识别_身份证识别_OCR-云市场-阿里云 身份证OCR免费体验 Java代码如下 public static void main(String[] args) {String host "https://idcar…

实名二代身份证OCR识别

在银行、信用社、航空、保险、电信等部门单位办理手续或证件时&#xff0c;常需要身份证件&#xff0c;但业务人员手工录入速度慢、办公效率太低是一大亟需解决的问题&#xff0c;通常要先通过扫描或拍照&#xff0c;来获取身份证上面的头像&#xff0c;然后再手工填写用户的身…

Opencv实现身份证OCR识别

Opencv 配置IDEA可参考&#xff1a;https://blog.csdn.net/zwl18210851801/article/details/81075781 opencv位置&#xff1a; OpencvUtil类&#xff1a; package com.x.common.utils;import org.opencv.core.*; import org.opencv.core.Point; import org.opencv.imgcodecs.…

身份证OCR实名认证接口

人工智能&#xff0c;身份证&#xff0c;OCR实名验证 一、接口介绍 自动识别及快速提取二代居民身份证正反面所有字段&#xff0c;包括姓名、性别、民族、出生日期、住址、身份证号、签发机关、有效期限&#xff0c;实时联网核查校验是否一致。对URL网络图片或base64信息进行…

身份证OCR识别SDK

一、身份证OCR识别SDK应用背景 随着Android、IOS智能手机的普及&#xff0c;5G通信技术的发展&#xff0c;移动互联迎来了爆发式增长&#xff0c;越来越多的公司都推出了自己的移动APP、小程序等应用。这些应用多数都涉及到个人身份证信息的输入认证&#xff08;即实名认证&…

阿里云智能身份证OCR文字识别

智能身份证OCR文字识别 做的项目里面涉及到了身份证识别输入的真实姓名与身份证号码是否匹配功能&#xff0c;于是在阿里云接了智能身份证OCR文字识别API&#xff0c;登录阿里云找到对应的产品&#xff0c;如下图 购买使用然后生成对应的APPcode。 使用的demo有蛮多&#xff0c…

如何用 身份证OCR 接口进行快速开发

最近公司项目有一个身份证文字识别的小需求&#xff0c;想着如果用现成的API就可以大大提高开发效率&#xff0c;在网上的API商店搜索了一番&#xff0c;发现了 APISpace&#xff0c;它里面的身份证OCR非常符合我的开发需求。 身份证OCR&#xff0c;传入身份证照片&#xff0c…

离线身份证OCR识别

离线身份证ocr识别简介 离线身份证ocr识别SDK可支持Android、iOS主流移动操作系统&#xff0c;android平台提供jar包&#xff0c;ios提供静态库.a文件。APP集成离线身份证ocr识别SDK后&#xff0c;用户采用手机、平板电脑对身份证进行拍摄识别即可自动识别身份证信息。 离线身…

身份证OCR识别

本文章来源于自己的学习图像处理以及识别过程中的一些经验&#xff0c;开发了一个OCR识别身份证程序&#xff0c;此程序虽不够完美但有一定的参考价值&#xff0c;CSDN上本人也将提供源代码&#xff0c;对身份证OCR识别整个过程的一个梳理。 程序依赖库&#xff0c;OpenCV3.20…