mysql基础--jdbc、pymysql增删改查、登录验证

1 mysql的JDBC操作

概述

  • JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API。JDBC是Java访问数据库的标准规范,可以为不同的关系型数据库提供统一访问,它由一组用Java语言编写的接口和类组成。
  • JDBC需要连接驱动,驱动是两个设备要进行通信,满足一定通信数据格式,数据格式由设备提供商规定,设备提供商为设备提供驱动软件,通过软件可以与该设备进行通信。

JDBC核心类和接口

  • DriverManager:用于注册驱动
  • Connection:表示与数据库创建的连接
  • Statement/PrepareStatement: 操作数据库sql语句的对象
  • ResultSet: 结果集或一张虚拟表

执行流程

在这里插入图片描述

1.1 jdbc实现查询
public class JdbcDemo1 {
    public static void main(String[] args) throws Exception {
        // 注意:使用JDBC规范,采用都是 java.sql包下的内容
        //1 注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //2 获得连接
        String url = "jdbc:mysql://localhost:3306/mydb16_jdbc";
        Connection conn = DriverManager.getConnection(url, "root", "123456");
        //3获得执行sql语句的对象
        Statement stmt = conn.createStatement();
        //4执行SQL语句
        ResultSet rs = stmt.executeQuery("select * from student");

        //5处理结果集
        while(rs.next()){
            // 获得一行数据
            Integer cid = rs.getInt("sid");
            String cname = rs.getString("sname");
            Integer age = rs.getInt("age");
            System.out.println(cid + " , " + cname);
        }
        //6释放资源
        rs.close();
        stmt.close();
        conn.close();
    }

上述结果集处理需要知道有哪些列,可以对其进行改进:

//获取列数
        ResultSetMetaData metaData = rs.getMetaData();
        int columnCount = metaData.getColumnCount();

        //结果集优化方法
        while (rs.next()){
            for(int i = 1;i<columnCount;i++){
                System.out.print(rs.getObject(i)+"\t");
            }
            System.out.println();
        }
1.2 jdbc增删改
package com;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

public class updata {
    public static void main(String[] args) throws Exception {
        //注册驱动
        Class.forName("com.mysql.jdbc.Driver");

        //获得连接
        String url = "jdbc:mysql://localhost:3306/stu";
        Connection conn = DriverManager.getConnection(url, "root", "123123");

        //执行sql
        Statement statement = conn.createStatement();
        int rows = statement.executeUpdate("insert into users values(5,'wangx','1111')");

        System.out.println(rows);
        statement.close();
        conn.close();
    }

}
1.3 实现用户登录(只实现用户自定义输入实现)
  • 普通版,可能会出现错误判断
public class jdbc_con {
    public static void main(String[] args) throws Exception {

        //注册驱动
        Class.forName("com.mysql.jdbc.Driver");


        Scanner sc = new Scanner(System.in);
        System.out.println("请输入用户名");
        String name = sc.nextLine();
        System.out.println("请输入密码");
        String pswd = sc.nextLine();


        //获得连接
        String url = "jdbc:mysql://localhost:3306/stu";
        Connection conn = DriverManager.getConnection(url, "root", "123123");

        //获得执行SQL语句的对象
        Statement stmt = conn.createStatement();

        //执行sql语句

        //通过字符串形式拼接 这种方式,用户输入不规范可能会改变sql语法
        ResultSet rs = stmt.executeQuery("select * from users where realName='"+name+"' and loginPwd='"+pswd+"'");

        
        if(rs.next())
        {System.out.println("登陆成功");}
        else
        { System.out.println("登陆失败");}

        //释放资源
        rs.close();
        stmt.close();
        conn.close();


    }
}

出现这种情况;

在这里插入图片描述

改进版,通过sql注入改进sql执行方式

package com;


import java.sql.*;
import java.util.Scanner;

public class jdbc_con_imp {
    public static void main(String[] args) throws Exception {
        //注册驱动
        Class.forName("com.mysql.jdbc.Driver");

        Scanner sc = new Scanner(System.in);
        System.out.println("请输入用户名");
        String name = sc.nextLine();
        System.out.println("请输入密码");
        String pswd = sc.nextLine();


        //获得连接
        String url = "jdbc:mysql://localhost:3306/stu";
        Connection conn = DriverManager.getConnection(url, "root", "123123");


        //改进方法 sql注入
        String sql = "select * from users where realName=? and loginPwd=?";
        PreparedStatement preparedStatement = conn.prepareStatement(sql);
        preparedStatement.setObject(1,name);
        preparedStatement.setObject(2,pswd);

        //执行sql语句
        ResultSet rs = preparedStatement.executeQuery(sql);

        if(rs.next())
        {System.out.println("登陆成功");}
        else
        { System.out.println("登陆失败");}

        //释放资源
        rs.close();
        preparedStatement.close();
        conn.close();


    }
}

完美解决该问题

在这里插入图片描述

2 mysql的pymysql操作

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

代码实现

2.1 pymysql查询
import pymysql
 
#获取MySQL连接
conn = pymysql.connect(host='localhost', port=3306, user='root',password='123456',database='mydb17_pymysql', 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()
2.2 pymysql增删改
import pymysql
 
#获取MySQL连接
conn = pymysql.connect(host='localhost', port=3306, user='root',password='123456',database='mydb17_pymysql', 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()
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()
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值