使用python操作MySQL

一、第三方库pymysql

复制代码
pip install pymysql

二、操作mysql

python 复制代码
import pymysql# 创建连接
# 需要传入一些参数:
# host是mysql所在的主机名或者是域名或者是ip地址
# port是mysql运行的端口号
# 命令行查询:ps -aux | grep mysql 找到MySQL运行的进程号
# 命令行查询:netstat -tnlp | grep mysql的进程号 找到MySQL的端口
# user 用户名
# passwd 密码
# db 指定要操作的数据库
conn = pymysql.connect(host='master', port=3306, user='root', passwd='123456',db='stu_test')

# 创建游标cursor
cur = conn.cursor()
# cur.execute("use stu_test") # 切换数据库
# 准备SQL语句
sql_str1 = '''
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'''

# 执行SQL语句
cur.execute(sql_str1)

# 如果有返回值 可以通过cursor进行获取
print(cur.fetchone())  # 获取一条数据
print('#' * 50)
print(cur.fetchall())  # 获取所有数据
print('#' * 50)
print(cur.fetchmany(10))  # 获取指定大小的数据数据

# 如果没有返回值,看后续自己处理

三、JDBC连接

Maven依赖

python 复制代码
<dependency>
	<groupId>mysql</groupId>
	<artifactId>mysql-connector-java</artifactId>
	<version>5.1.49</version>
</dependency>
python 复制代码
package com.shujia;

import java.sql.*;

public class MySQLJDBCDemo {
    public static void main(String[] args) throws Exception {
        // 1、加载驱动
        Class.forName("com.mysql.jdbc.Driver");

        // 2、创建连接
        Connection conn = DriverManager.getConnection("jdbc:mysql://master:3306/db1?useSSL=false","root","123456");

        // 3、创建Statement

        Statement st = conn.createStatement();

        // 4、通过Statement执行SQL
        ResultSet rs = st.executeQuery("select * from student");

        // 5、遍历ResultSet 获取返回的记录
        while (rs.next()) {
            int id = rs.getInt("id");
            String name = rs.getString("name");
            int age = rs.getInt("age");
            String gender = rs.getString("gender");
            String clazz = rs.getString("clazz");

            System.out.println(id+","+name+","+age+","+gender+","+clazz);
        }

        // 6、关闭连接
        st.close();
        conn.close();


    }
}

四、JDBC连接池

1.连接池是啥?

连接池是创建和管理一个连接的缓冲池的技术,这些连接准备好被任何需要它们的线程使用。 连接池用于提高在数据库上执行命令的性能。连接池本质上就是数据库连接的缓存。使用数据库连接时,如果池中有一个可用,它将使用该连接而不是重新建立另一个新的连接 ,用完后不是关闭它,而是将其放回池中。

2.为什么要用连接池?

  • 资源重用:由于数据库连接得以重用,避免了频繁创建,释放连接引起的大量性能开销。在减少系统消耗的基础上,另一方面也增加了系统运行环境的平稳性。
  • 更快的系统反应速度**:数据库连接池在初始化过程中,往往已经创建了若干数据库连接置于连接池中备用。此时连接的初始化工作均已完成。对于业务请求处理而言,直接利用现有可用连接避免了数据库连接初始化和释放过程的时间开销,从而减少了系统的响应时间。
  • 新的资源分配手段**:对于多应用共享同一数据库的系统而言,可在应用层通过数据库连接池的配置实现某一应用最大可用数据库连接数的限制避免某一应用独占所有的数据库资源。
  • 统一的连接管理:避免数据库连接泄露在较为完善的数据库连接池实现中,可根据预先的占用超时设定,强制回收被占用连接,从而避免了常规数据库连接操作中可能出现的资源泄露。

3.常见的数据连接池

4.各数据库连接池测试结论

  • 1:性能方面 HikariCP>Druid>tomcat-jdbc>dbcp>c3p0 。hikariCP的高性能得益于最大限度的避免锁竞争。

  • 2:druid功能最为全面,sql拦截等功能,统计数据较为全面,具有良好的扩展性。

  • 3:综合性能,扩展性等方面,可考虑使用druid或者hikariCP连接池。

  • 4:可开启prepareStatement缓存,对性能会有大概20%的提升。

5.HikariCP连接池的使用

官网地址:https://github.com/brettwooldridge/HikariCP

Maven依赖

python 复制代码
<dependency>
   <groupId>com.zaxxer</groupId>
   <artifactId>HikariCP</artifactId>
   <version>4.0.3</version>
</dependency>

连接池初始化

python 复制代码
// 配置
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://master:3306/db1");
config.setUsername("root");
config.setPassword("123456");
config.addDataSourceProperty("connectionTimeout", "1000"); // 连接超时:1秒
config.addDataSourceProperty("idleTimeout", "60000"); // 空闲超时:60秒
config.addDataSourceProperty("maximumPoolSize", "16"); // 最大连接数:16
config.addDataSourceProperty("useSSL", "false"); // 关闭使用SSL连接

// 创建连接池实例
DataSource ds = new HikariDataSource(config);

使用连接池

python 复制代码
try (Connection conn = ds.getConnection()) { // 通过ds获取连接
    ...
} // 在此"关闭"连接
相关推荐
TG:@yunlaoda360 云老大2 小时前
华为云国际站代理商VIAS主要有什么作用呢?
数据库·人工智能·华为云
回忆是昨天里的海2 小时前
Spring boot接入视图时的问题
mysql·mybatisplus·视图
云和数据.ChenGuang2 小时前
openeuler下的git指令集合
linux·运维·数据库·centos
一 乐2 小时前
养老院信息|基于springboot + vue养老院信息管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端
cike_y2 小时前
Mybatis之作用域(Scope)和生命周期-解决属性名和字段名不一致的问题&ResultMap结果集映射
java·开发语言·数据库·tomcat·mybatis
液态不合群2 小时前
【面试题】MySQL 中的索引数量是否越多越好?为什么?
android·数据库·mysql
imbackneverdie2 小时前
2025国自然资助率12.29%创新低!2026年如何用数据与AI“破局”?
数据库·人工智能·自然语言处理·aigc·ai写作·课题·国家自然科学基金
3824278272 小时前
python:mysql数据库
数据库·python·mysql
小宇的天下2 小时前
Calibre DESIGNrev DRC/LVS启动和准备文件(10-1)
服务器·数据库·oracle