3分钟掌握Potrace:从位图到矢量的免费转换神器
2026/7/26 13:50:36
在后端开发中,MySQL 作为主流关系型数据库,其与编程语言的高效连接是数据交互的核心。本文将详细讲解 Java 和 Python 两种语言操作 MySQL 的完整流程,从基础连接、SQL 执行,到连接池优化(重点解析 HikariCP 和 Druid),帮你轻松搞定数据库交互需求。
Python 通过pymysql库实现与 MySQL 的交互,语法简洁,适合快速开发和脚本编写。
首先安装第三方依赖库:
bash
运行
pip install pymysqlPython 操作 MySQL 的核心步骤为:创建连接→创建游标→执行 SQL→处理结果→关闭资源,完整示例如下:
python
运行
import pymysql # 1. 创建数据库连接 # 核心参数:主机地址、端口、用户名、密码、目标数据库 conn = pymysql.connect( host='localhost', # 本地主机可填'localhost',远程需填IP port=3306, # MySQL默认端口3306 user='root', # 数据库用户名 passwd='123456', # 数据库密码 db='stu_test' # 要操作的数据库名称 ) # 2. 创建游标(用于执行SQL语句) cursor = conn.cursor() try: # 3. 执行SQL语句(查询示例) sql = ''' SELECT t1.sid, t1.sname, t2.score FROM ( SELECT sid, sname FROM Student WHERE sid IN ( SELECT t1.sid FROM (SELECT sid, score FROM SC WHERE cid = '01') t1 LEFT JOIN (SELECT sid, score FROM SC WHERE cid = '02') t2 ON t1.sid = t2.sid WHERE t1.score > IFNULL(t2.score, 0) ) ) t1 LEFT JOIN SC t2 ON t1.sid = t2.sid ''' cursor.execute(sql) # 执行SQL # 4. 处理查询结果 print("获取单条数据:", cursor.fetchone()) # 取1条结果 print("-" * 50) print("获取剩余所有数据:", cursor.fetchall()) # 取剩余全部结果 print("-" * 50) print("获取指定条数数据:", cursor.fetchmany(10)) # 取指定数量结果 # 增删改操作需提交事务 # sql_insert = "INSERT INTO Student(sid, sname) VALUES ('001', '张三')" # cursor.execute(sql_insert) # conn.commit() # 提交事务 # conn.rollback() # 异常时回滚 except Exception as e: print("SQL执行失败:", str(e)) finally: # 5. 关闭资源(先关游标,再关连接) cursor.close() conn.close()conn.commit()提交事务,否则修改不生效;conn.rollback()回滚事务,避免数据不一致;fetchone()/fetchall()/fetchmany(n)需按需使用。Java 通过 JDBC(Java Database Connectivity)规范实现与 MySQL 的连接,是 Java 操作数据库的标准方式,适用于企业级应用开发。
添加 MySQL 驱动依赖(Maven 项目):
xml
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.49</version> <!-- 稳定版本,适配多数场景 --> </dependency>JDBC 操作分为 6 步:加载驱动→创建连接→创建执行器→执行 SQL→处理结果→关闭资源,完整示例:
java
运行
package com.shujia; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; public class MySQLJDBCDemo { public static void main(String[] args) throws Exception { // 1. 加载MySQL驱动(MySQL 5.x版本驱动类) Class.forName("com.mysql.jdbc.Driver"); // 2. 创建数据库连接 // URL格式:jdbc:mysql://主机:端口/数据库名?参数 String url = "jdbc:mysql://localhost:3306/db1?useSSL=false"; String username = "root"; String password = "123456"; Connection conn = DriverManager.getConnection(url, username, password); // 3. 创建Statement执行器(用于执行SQL语句) Statement st = conn.createStatement(); // 4. 执行查询SQL,返回结果集 String sql = "SELECT * FROM student"; ResultSet rs = st.executeQuery(sql); // 5. 遍历结果集 while (rs.next()) { int id = rs.getInt("id"); // 按列名获取int类型 String name = rs.getString("name");// 按列名获取String类型 int age = rs.getInt("age"); String gender = rs.getString("gender"); String clazz = rs.getString("clazz"); System.out.printf("%d,%s,%d,%s,%s%n", id, name, age, gender, clazz); } // 6. 关闭资源(逆序关闭:ResultSet→Statement→Connection) rs.close(); st.close(); conn.close(); } }useSSL=false:关闭 SSL 连接,避免开发环境 SSL 验证报错;ResultSet需通过rs.next()移动指针,初始指针在第一条数据前;try-with-resources自动关闭。传统 JDBC 每次操作数据库都要创建和关闭连接,存在两大问题:
| 连接池 | 核心特点 | 性能排名 | 适用场景 |
|---|---|---|---|
| HikariCP | 轻量高效,锁竞争少,SpringBoot2 默认推荐 | 1 | 追求高性能的企业级应用 |
| Druid | 功能全面,支持 SQL 监控、拦截,扩展性强 | 2 | 需要监控和扩展的复杂应用 |
| tomcat-jdbc | Tomcat 内置,配置简单,稳定性好 | 3 | Tomcat 部署的 Web 应用 |
| DBCP | Apache 出品,Tomcat 早期使用,功能基础 | 4 | 简单应用,不追求极致性能 |
| C3P0 | 历史悠久,代码复杂,性能较差 | 5 | legacy 系统兼容 |
xml
<dependency> <groupId>com.zaxxer</groupId> <artifactId>HikariCP</artifactId> <version>4.0.3</version> <!-- 稳定版本 --> </dependency>java
运行
import com.zaxxer.hikari.HikariConfig; import com.zaxxer.hikari.HikariDataSource; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; public class HikariCPDemo { public static void main(String[] args) { // 1. 配置连接池参数 HikariConfig config = new HikariConfig(); config.setJdbcUrl("jdbc:mysql://localhost:3306/db1?useSSL=false"); config.setUsername("root"); config.setPassword("123456"); // 核心配置 config.setConnectionTimeout(1000); // 连接超时:1秒 config.setIdleTimeout(60000); // 空闲超时:60秒 config.setMaximumPoolSize(16); // 最大连接数:16(根据CPU核心数调整) config.setMinimumIdle(4); // 最小空闲连接数:4 // 2. 创建连接池实例 HikariDataSource dataSource = new HikariDataSource(config); // 3. 获取连接并操作数据库(try-with-resources自动关闭资源) try (Connection conn = dataSource.getConnection()) { String sql = "SELECT name, age FROM student WHERE id = ?"; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setInt(1, 1); // 预处理SQL,避免SQL注入 ResultSet rs = pstmt.executeQuery(); if (rs.next()) { System.out.println("姓名:" + rs.getString("name") + ",年龄:" + rs.getInt("age")); } } catch (Exception e) { e.printStackTrace(); } } }xml
<dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.2.16</version> </dependency>java
运行
import com.alibaba.druid.pool.DruidDataSource; import java.sql.Connection; import java.sql.ResultSet; import java.sql.Statement; public class DruidDemo { public static void main(String[] args) throws Exception { // 1. 配置连接池 DruidDataSource dataSource = new DruidDataSource(); dataSource.setUrl("jdbc:mysql://localhost:3306/db1?useSSL=false"); dataSource.setUsername("root"); dataSource.setPassword("123456"); dataSource.setMaxActive(16); // 最大连接数 dataSource.setMinIdle(4); // 最小空闲连接 dataSource.setMaxWait(1000); // 最大等待时间 dataSource.setValidationQuery("SELECT 1"); // 连接校验SQL // 2. 获取连接 Connection conn = dataSource.getConnection(); Statement st = conn.createStatement(); ResultSet rs = st.executeQuery("SELECT * FROM student LIMIT 5"); // 3. 处理结果 while (rs.next()) { System.out.println(rs.getString("name")); } // 4. 关闭资源 rs.close(); st.close(); conn.close(); // 归还连接到池,并非真正关闭 } }cursor.execute("INSERT INTO Student VALUES (%s, %s)", ('002', '李四'));PreparedStatement替代Statement,预处理 SQL 提升性能并防注入。finally块强制关闭游标和连接;try-with-resources自动关闭Connection/Statement/ResultSet。掌握以上内容,即可应对大部分开发场景中的 MySQL 操作需求,从简单脚本到企业级应用都能游刃有余。