MySQL的JDBC操作、pymysql操作

本文介绍了JavaJDBC的基本概念、执行流程,包括注册驱动、建立连接、使用Statement和PreparedStatement执行SQL,以及如何防止SQL注入。还提到了PyMySQL作为MySQL客户端库的使用示例。
摘要由CSDN通过智能技术生成

JDBC

        JDBC (Java DataBase Connectivityjava数 据库连接)是一种用于执行SQL语句的Java API。 JDBC是Java访问数据库的标准规范,可以为不同的关系型数据库提供统一访问, 它由一组用Java语言编写的接口和类组成。

        JDBC需要连接驱动,驱动是两个设备要进行通信,满足一定通信数据格式,数据格式由设备提供商规定,设备提供商为设备提供驱动软件,通过软件可以与该设备进行通信。

JDBC核心类和接口

        DriverManager:用于注册驱动

        Connection:表示与数据库创建的连接

        Statement/PrepareStatement:操作数据库sql语句的对象

        ResultSet:结果集或一张虚拟表

        需要先下载导入jar包

执行流程

1:注册驱动

        DriverManager.registerDriver (驱动);

2:建立与数据库服务器的连接

        DriverManager.getConnection(ip ,端口 ,数据库 ,用户名 ,密码);

3:将sql指令发送给服务器执行

        Statement / Preparedstatement executeUpdate () / executeQuery ()

        Statement是初级的,Preparedstatement是较为高级的。executeUpdate () 执行增删该,executeQuery ()执行查询。

4:处理服务器返回的结果

        1:返回行数rows

        2:返回一张表(结果集) ResultSet

5:释放资源

        close();

public class JdbcDemo {
    public static void main (String[] args) throws Exception {
        //使用JDBC规范,采用都是java.sql包下的内容

        //1 注册驱动
        DriverManager.registerDriver(new com.mysql.jabc.Drive());
        //MySQL5之后的驱动包,可以省略注册驱动的步骤

        //2 获得连接
        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/myDatabase","root","123456");//当连接的是本机且端口号为默认的3306时localhost:3306可以省略不写

        //3 执行SQL语句
        Statement statement = connection.createStatement();
        ResultSet resultSet = statement.executeQuery("select name ,id from table");//查询数据
        int rows = statement.executeLargeUpdate("insert into table values(3, Name3)'");//添加数据,返回值是影响了几行数据。引号中的SQL语句还可以是增删改的语句。

        //4 处理结果
        while (resultSet.next()){
            int id = resultSet.getInt("id");
            String name = resultSet.getString("name");
            System.out.println(id + " " + name);
            //列名也可以换成数字,从1开始。
        }
        
        //5 关闭连接
        resultSet.close();
        statement.close();
        connection.close();
    }
}

结果集优化

获取表的列数

ResultSetMetaData resultSetMetaData = resultSet.getMetaData();

int coLumnCount = resultSetMetaData.getCoLumnCount();

处理结果便可用下列方式

while (resultSet.next()){
    for(int i = 1; i >= coLumnCount; i++){
        System.out.print(resultSet.getObject(i) + "\t");
    }
    System.out.println();
}

SQL注入

        用户输入的内容作为了SQL语句语法的一部分,改变了原有SQL真正的意义。

 示例

public static void main(String[] args) throws SQLException {
    //用户输入用户名和密码,判断是否能够登录
    Scanner scanner = new Scanner(System.in);
    System.out.printLn("请输入用户名:");
    String username = scanner.nextLine();
    System.out.print1n("请输入密码:");
    String password = scanner.nextLine();

    Connection connection = DriverManager.getConnection("jdbc:mysql:///myDatabase","root","123456");
    Statement statement = connection.createStatement();
    String sql = "select * from user where username = '" + username + "' and password = ' " + password + "'";
    ResultSet resultSet = statement.executeQuery(sql);
    if(resultSet.next()){
        System.out.println("登录成功!");
    }else{
        System.out.println("登录失败!");
    }
    resultSet.close();
    statement.close();
    connection.close();
    //当用户收益输入账号或密码时有可能会造成SQL注入。
}

不用createStatement可以解决上列问题,用connection.prepareStatement()进行预处理即可。

public static void main(String[] args) throws SQLException {
    Scanner scanner = new Scanner(System.in);
    System.out.printLn("请输入用户名:");
    String username = scanner.nextLine();
    System.out.print1n("请输入密码:");
    String password = scanner.nextLine();

    Connection connection = DriverManager.getConnection("jdbc:mysql:///myDatabase","root","123456");
    String sql = "select * from user where username = ? and password = ?";
    PreparedStatement preparedStatement = connection.prepareStatement(sql);

    preparedStatement.setObject(1, username);//设置第一个问号是username
    preparedStatement.setObject(2, password);//设置第一个问号是password
    ResuLtSet resultSet = preparedStatement.executeQuery();
    if(resultSet.next()){
        System.out.println("登录成功!");
    }else{
        System.out.println("登录失败!");
    }
    resultSet.close();
    preparedStatement.close();
    connection.close();
}

pymysql

        PyMySQL是一个纯Python实现的MySQL客户端库,支持兼容Python3,用于代替MySQLdb。

        以管理员身份打开命令行窗口,输入pip install PyMySQL可以下载qymysql

查询操作

# 导入模块
import pymysql

#获取MySQL连接
conn = pymysql.connect(host = 'localhost', port = 3306; user= 'root', password= '123456', database= 'myDatabase', charset='utf8')

# 获取游标
cursor = conn.cursor()

# 执行SQL语句 返回值就是SQL语句在执行过程中影响的行数
sqL = "select * from student;"
row_count = cursor.execute (sql)
print("SQL语句执行影响的行数%d" %row_count)

# 取出结果集中一行 返回的结果是一行
# print(cursor.fetchone())

# 取出结果集中的所有数据 返回一行数据
for line in cursor.fetchall():
    print(line)

# 关闭游标
cursor.close()

# 关闭连接
conn.close()

增删改操作

import pymysql
conn = pymysql.connect(host = 'localhost', port = 3306; user= 'root', password= '123456', database= 'myDatabase', charset='utf8')
cursor = conn. cursor()

# 插入数据
# sql = "insert into student values(%s, %S, %S)"
# data = (4, '晁盖', 34)
# cursor.execute(sql, data) #sql和data之间以","隔开

# 修改数据
# sql = "update student set sname = %s where sid = %s"
# data = ('李道',4)
# cursor.execute(sql, data)

# 删除数据
# sql = "delete from student where sid = %s"
# data = (4)
# cursor.execute(sql, data)

conn.commit() # 提交,不然无法保存插入或者修改的数据!!!

cursor.close()
conn.close()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值