一、第三方库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获取连接
...
} // 在此"关闭"连接