【学习笔记】使用cmd命令/Java/python操作数据库MySQL的通用方法及代码展示

        针对较大规模的数据,可以使用数据库(Database)进行存储。数据库是基于数据结构来组织、存储和管理数据的仓库,每个数据库都有一个或多个不同的API用于创建、访问、管理、搜索和复制所存储的数据。目前,Oracle旗下的MySQL是最流行的关系型数据库管理系统,其具有体积小、性能高、开源免费等特点。
        在使用MySQL之前,需要下载和安装软件。由于Windows系统中安装MySQL的过程都是通过界面化操作进行的、较为简单,因此不进行过多阐述。在MySQL安装完成后,可以下载一款轻量级管理和设计数据库的工具Navicat。(本次示例中所用的MySQL版本为:MySQL Community Server 5.7)

前期准备

        1.安装MySQL软件以及Navicat软件。
        2.MySQL安装完毕后,为了便于在命令提示行cmd中进行使用,需要在系统变量的Path中添加MySQL的安装位置。(如:C:\Program Files\MySQL\MySQL Server 5.7\bin)
在这里插入图片描述

数据库的基本概念

数据库:用于存放多个数据表,将数据存储到数据表之前必须先建立数据库。
数据表:存放于数据库中,类似于Excel表格。
列:字段或属性,一列存放的是相同字段的内容。
行:元素或记录。
主键:数据表的唯一索引。
索引:数据库某数据表中一个排序的数据结构,以协助快速查询、更新数据表中的数据。
联合主键:数据表中的多个字段作为该数据表的主键。

SQL语句基础

- 使用cmd命令提示行操作MySQL

1.连接数据库
        在Windows系统的cmd或Linux环境中,连接数据库可使用如下命令:

mysql -u root -p

        其中root表示用户,根据安装MySQL设置的用户名而定。输入此命令后,还需要输入密码才可登录。(如果出现提示没有mysql命令即为未配置好环境变量;如果出现错误:ERROR 1045 (28000): Access denied for user ‘root’@‘localhost’ (using password: YES)即为密码错误)
        注意:连接进入数据库后,接下来输入的所有的命令都以“;”结束。
2.查看已有数据库及使用某数据库
        在MySQL中,可能包含多个已经创建好的数据库,可通过以下命令查看和使用已有的数据库。

show databases;   # 查看数据库
use crawler;   # 使用数据库

3.创建新的数据库及数据表
        在数据库创建完成后,可在数据库中进行建表。(如下图所示:在crawler数据库中创建carsales数据表,其中COMMENT用于解释说明某一字段,PRIMARY KEY用于标识主键)
        注意:数据表名carsales和键名month、sales需要引上反斜点“`”!
4.查看数据库中的数据表
        查看数据库中的数据表使用的是show命令。(如下图所示)
在这里插入图片描述
5.删除数据表

DROP TABLE carsales;
# 或
DROP TABLE IF EXISTS carsales;

6.向数据表中插入数据

INSERT INTO carsales VALUES ('2020-07-02', '500');
# 或
INSERT INTO carsales (month, sales) VALUES ('2020-07-02', '500');

7.查询数据表中的数据

# 查询所有数据
select * from carsales;
# 查询某列
select month from carsales;

在这里插入图片描述
8.更新数据库中的数据

update carsales set sales = '1000', month = '2020';   // 更改全部数据表值
update carsales set sales = '1000' where month = '2020';   // 基于month的值修改sales的值

在这里插入图片描述
9.删除数据表中的数据

delete from carsales where month = '2020'

JAVA操作数据库

过程模块

1.连接数据库

/**
 * Java操作数据库的简单示例
 *
 * @author hakutaku
 * @create 2020-07-02-10:10
 **/
public class MySQLConnections {
    private String driver = "";
    private String dbURL = "";
    private String user = "";
    private String password = "";
    private static MySQLConnections connection = null;

    private MySQLConnections() throws Exception {
        driver = "com.mysql.jdbc.Driver";   // 数据库驱动
        dbURL = "jdbc:mysql://数据库ip地址:端口号/crawler";   // JDBC的URL
        user = "用户名";   // 数据库用户名
        password = "密码";   // 数据库密码
        System.out.println("dbURL: " + dbURL);
    }

    public static Connection getConnection() {
        Connection conn = null;
        if (connection == null){
            try {
                connection = new MySQLConnections();   // 初始化连接
            } catch (Exception e){
                e.printStackTrace();
                return null;
            }
        }
        try{
            // 调用Class.forName()方法加载驱动程序
            Class.forName(connection.driver);
            // 建立数据库连接
            conn = (Connection) DriverManager.getConnection(connection.dbURL, connection.user, connection.password);
        } catch (Exception e){
            e.printStackTrace();
        }
        return conn;
    }

    public static void main(String[] args) {
        Connection con = getConnection();
        Statement stmt = null;
        try {
            stmt = con.createStatement();   // 创建Statement对象
        } catch (SQLException e) {
            e.printStackTrace();
        }
        System.out.println("成功连接到数据库!");
    }
}

在这里插入图片描述
        这里可以看到,数据库连接成功后出现了警告信息:
        Thu Jul 02 11:53:26 CST 2020 WARN: Establishing SSL connection without server’s identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn’t set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to ‘false’. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
        分析原因:高版本的MySQL必须指明是否需要进行SSL连接,否则会进行警告。
        解决方案:在MySQL定义的连接字符串URL(如:我的dbURL)中加入“?useSSL=true/false”。(?useSSL=true或?useSSL=false均可。)
在这里插入图片描述
2.操作数据库

		// 2.操作数据库
        // 为防止数据库中有数据,先删除数据表中的数据(抛出SQL异常)
        stmt.execute("delete from carsales");
        // 执行数据插入操作,忽略主键重复
        stmt.execute("insert ignore into carsales(month, sales) values ('2020-07-01', '5000')");
        stmt.execute("insert ignore into carsales(month, sales) values ('2020-07-02', '7200')");
        String sql = "select * from carsales";   // 要执行的sql
        // 查询操作
        ResultSet rs = stmt.executeQuery(sql);
        // 结果集
        while (rs.next()){
            // 输出1、2两列
            System.out.printf(rs.getString(1) + "\t");
            System.out.printf(rs.getString(2) + "\t");
            System.out.println();
        }

在这里插入图片描述
3.更新数据库

		stmt.addBatch("update carsales set sales = '1500' where month = '2020-07-01'");
        stmt.addBatch("update carsales set sales = '20' where month = '2020-07-02'");
        int number[] = stmt.executeBatch();   // 批处理
        System.out.println("执行的sql语句数目为:" + number.length);
        ResultSet rs1 = stmt.executeQuery("select * from carsales");
        System.out.println("更新后的结果为:");
        while (rs1.next()){   // 输出1、2两列
            System.out.printf(rs1.getString(1) + "\t");
            System.out.printf(rs1.getString(2) + "\t");
            System.out.println();
        }
        con.close();   // 关闭连接
    }

在这里插入图片描述
        

整体代码

package com.database;

import com.mysql.jdbc.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * Java操作数据库的简单示例
 *
 * @author hakutaku
 * @create 2020-07-02-10:10
 **/
public class MySQLConnections {
    private String driver = "";
    private String dbURL = "";
    private String user = "";
    private String password = "";
    private static MySQLConnections connection = null;

    private MySQLConnections() throws Exception {
        driver = "com.mysql.jdbc.Driver";   // 数据库驱动
        dbURL = "jdbc:mysql://数据库ip地址:端口号/crawler?useSSL=false";   // JDBC的URL
        user = "用户名";   // 数据库用户名
        password = "密码";   // 数据库密码
        System.out.println("dbURL: " + dbURL);
    }

    public static Connection getConnection() {
        Connection conn = null;
        if (connection == null){
            try {
                connection = new MySQLConnections();   // 初始化连接
            } catch (Exception e){
                e.printStackTrace();
                return null;
            }
        }
        try{
            // 调用Class.forName()方法加载驱动程序
            Class.forName(connection.driver);
            // 建立数据库连接
            conn = (Connection) DriverManager.getConnection(connection.dbURL, connection.user, connection.password);
        } catch (Exception e){
            e.printStackTrace();
        }
        return conn;
    }

    public static void main(String[] args) throws SQLException {
        // 1.连接数据库
        Connection con = getConnection();
        Statement stmt = null;
        try {
            stmt = con.createStatement();   // 创建Statement对象
        } catch (SQLException e) {
            e.printStackTrace();
        }
        System.out.println("成功连接到数据库!");

        // 2.操作数据库
        // 为防止数据库中有数据,先删除数据表中的数据(抛出SQL异常)
        stmt.execute("delete from carsales");
        // 执行数据插入操作,忽略主键重复
        stmt.execute("insert ignore into carsales(month, sales) values ('2020-07-01', '5000')");
        stmt.execute("insert ignore into carsales(month, sales) values ('2020-07-02', '7200')");
        String sql = "select * from carsales";   // 要执行的sql
        // 查询操作
        ResultSet rs = stmt.executeQuery(sql);
        // 结果集
        while (rs.next()){
            // 输出1、2两列
            System.out.printf(rs.getString(1) + "\t");
            System.out.printf(rs.getString(2) + "\t");
            System.out.println();
        }
        stmt.addBatch("update carsales set sales = '1500' where month = '2020-07-01'");
        stmt.addBatch("update carsales set sales = '20' where month = '2020-07-02'");
        int number[] = stmt.executeBatch();   // 批处理
        System.out.println("执行的sql语句数目为:" + number.length);
        ResultSet rs1 = stmt.executeQuery("select * from carsales");
        System.out.println("更新后的结果为:");
        while (rs1.next()){   // 输出1、2两列
            System.out.printf(rs1.getString(1) + "\t");
            System.out.printf(rs1.getString(2) + "\t");
            System.out.println();
        }
        con.close();   // 关闭连接
    }
}

Python操作数据库

        使用Python操作数据库,必须要先安装pyMySQL库,具体安装命令如下所示:

pip3 install pymysql

创建数据库

        查询MySQL版本号,并创建数据库spiders。

import pymysql

db = pymysql.connect(host='localhost', user='用户名', password='密码', port=3306)   # connect()方法声明一个mysql连接对象db
cursor = db.cursor()   # 获得mysql的操作游标,利用游标来执行SQL语句
cursor.execute('SELECT VERSION()')
data = cursor.fetchone()   # fechone()方法获得第一条数据(即版本号)
print('Database version: ', data)
cursor.execute("CREATE DATABASE spiders DEFAULT CHARACTER SET utf8")   # 执行创建数据库的操作(数据库名为spiders,默认编码为UTF-8)
db.close()

在这里插入图片描述

创建数据表及指定字段

import pymysql

# 创建数据库后,额外指定一个参数db找到所需操作的数据表
db = pymysql.connect(host='localhost', user='用户名', password='密码', port=3306, db='spiders')
cursor = db.cursor()   # 获得mysql的操作游标,利用游标来执行SQL语句
sql = 'CREATE TABLE IF NOT EXISTS students (id VARCHAR(255) NOT NULL, ' \
      'name VARCHAR(255) NOT NULL, age INT NOT NULL, PRIMARY KEY (id))'
cursor.execute(sql)
db.close()

        刷新Navicat,可发现数据表和字段创建成功。
在这里插入图片描述

操作数据库

        操作数据库涉及到了事务机制,任何更改操作都必须为一个事务。事务机制包括四个属性:原子性(A)、一致性(C)、隔离性(I)、持久性(D)。

1.操作数据库的通用写法

try:
	cursor.execute(sql)
	db.commit()   # 对于数据插入、更新、删除操作,都需要调用该方法才能生效
except:
	db.rollback()   # rollback()方法执行数据回滚,相当于什么都没有发生过

        其中,commit()方法和rollback()方法为事务的实现提供了支持,确保了事务的原子性和一致性。

2.插入数据库的通用方法

import pymysql

data = {
    'id': '20200702',
    'name': '二狗',
    'age': 20
}
db = pymysql.connect(host='localhost', user='用户名', password='密码', port=3306, db='spiders')
cursor = db.cursor()
table = 'students'
keys = ', '.join(data.keys())
values = ', '.join(['%s'] * len(data))
sql = 'INSERT INTO {table}({keys}) VALUES ({values})'.format(table=table, keys=keys, values=values)
try:
    if cursor.execute(sql, tuple(data.values())):
        print("Successful!")
        db.commit()   # 对于数据插入、更新、删除操作,都需要调用该方法才能生效
except:
    print("Failed!")
    db.rollback()   # rollback()方法执行数据回滚,相当于什么都没有发生过
db.close()

        通过str.join(sequence)方法,使用“, ”将字典的键和%s分别连接构造成独立的字符串keys和values。这样写的好处是SQL语句会根据字典动态构造,元组也动态构造,从而实现通用的插入方法。
在这里插入图片描述
        如此一来,我们便实现了传入一个字典来插入数据的方法,而不需要再去修改SQL语句和插入操作了。

3.更新数据库

sql = 'UPDATE students SET age = %s WHERE name = %s'
try:
    cursor.execute(sql, (25, '二狗'))
    db.commit()
except:
    db.rollback()
db.close()

        测试发现可根据name(二狗)修改年龄(age)。

4.插入更新数据库的通用方法(去重)

import pymysql

data = {
    'id': '20200702',
    'name': '二狗',
    'age': 20
}
db = pymysql.connect(host='localhost', user='用户名', password='密码', port=3306, db='spiders')
cursor = db.cursor()
table = 'students'
keys = ', '.join(data.keys())
values = ', '.join(['%s'] * len(data))
# ON DUPLICATE KEY UPDATE:若主键已经存在,则执行更新操作
sql = 'INSERT INTO {table}({keys}) VALUES ({values}) ON DUPLICATE KEY UPDATE'.format(table=table, keys=keys, values=values)
update = ', '.join([" {key} = %s".format(key=key) for key in data])   # 构造id = %s, name = %s, age = %s
sql += update   # 字符串拼接
try:
    if cursor.execute(sql, tuple(data.values())*2):
        print("Successful!")
        db.commit()   # 对于数据插入、更新、删除操作,都需要调用该方法才能生效
except:
    print("Failed!")
    db.rollback()   # rollback()方法执行数据回滚,相当于什么都没有发生过
db.close()

        在上述代码中,完整的SQL语句(即变量sql)构造出来是这样的:

INSERT INTO students(id, name, age) VALUES (%s, %s, %s) ON DUPLICATE KEY UPDATE id = %s, name = %s, age = %s

        因为有6个%s,所以在后面的execute()方法的第二个参数元组就需要乘以2变成原来的2倍。这样写的通用插入更新数据库的方法可以实现数据去重。

5.删除数据

import pymysql

db = pymysql.connect(host='localhost', user='用户名', password='密码', port=3306, db='spiders')
cursor = db.cursor()
table = 'students'
condition = 'age > 20'
sql = 'DELETE FROM {table} WHERE {condition}'.format(table=table, condition=condition)
try:
    cursor.execute(sql)
    db.commit()
except:
    db.rollback()
db.close()

        删除操作相对简单,直接使用DELETE语句即可,只是需要指定目标表名和删除条件。这里直接将删除条件当字符串来传递,以实现删除操作。

6.查询数据

import pymysql

db = pymysql.connect(host='localhost', user='用户名', password='密码', port=3306, db='spiders')
cursor = db.cursor()
sql = 'SELECT * FROM students WHERE age >= 20'
try:
    cursor.execute(sql)
    print("Count: ", cursor.rowcount)
    one = cursor.fetchone()
    print("One: ", one)
    results = cursor.fetchall()
    print("Results: ", results)
    print("Result Type: ", type(results))
    for row in results:
        print(row)
except:
    print("error")

        查询不需要再使用db的commit方法。在查询操作中,只需使用fetchone()方法和fetchall()方法即可实现数据查询功能。其中,fetchone()方法的内部有一个偏移指针用来指向查询结果,使用fetchone()取一次后指针便偏移到下一条数据,这样再次取数据便取到下一条了;fetchall()方法返回的是偏移指针指向的数据一直到结束的所有数据。
        因此,最好的查询数据的方法便是通过fetchone()方法+while循环来获取所有数据,随用随取,简单高效。

猜你喜欢

转载自blog.csdn.net/qq_42506411/article/details/107080062