JDBC概述
JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API。JDBC是Java访问数据库的标准规范,可以为不同的关系刑数掘库提供统一访问,它由一组用Java语言编写的接口和类组成。
JDBC需要连接驱动,驱动是两个设备要进行通信,满足一定通信数据格式,数据格式由设备提供商规定,设备提供商为设备提供驱动软件,通过软件可以与该设备进行通信。
JDBC入门案例
JDBC核心类和接口
DriverManager:注册驱动
Connection:表示与数据库创建的连接
Statement/PrepareStatement:操作数据库sql语句的对象
ResultSet:结果集或一张虚拟表
执行流程
JDBC入门案例
代码编写
public class JdbcDemol {
public static void main(String[ ] args) throws Exception {
//注意:使用JDBC规范,采用都是java.sq1包下的内容
//1、注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2、获得连接
String url = "jdbc:mysql://localhost:3306/mydb16_jdbc";
Connection conn = DriverManager.getConnection(url,"root","123456");
//3、获得执行sq1语句的对象
Statement stmt = conn.createStatement() ;
//4、执行SQL语句
ResultSet rs = stmt.executeQuery("select * from student");
while(resultSet.next()){//获取每一行数据
//获取每一列数据
// int sid = resultSet.getInt("sid");
int sid = resultSet.getInt(1);
// String sname = resultSet.getString("sname");
String sname = resultSet.getString(2);
// int age = resultSet.getInt("age");
int age = resultSet.getInt(3);
System.out.println(sid + "\t" + sname + "\t" + age);
}
public class JdbcDemo01 {
public static void main(String[] args) throws SQLException {
//1:注册驱动
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
//2:获取连接
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb16_jdbc");
//3:执行sql
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery("select * from student");
//4:处理结果集
while(resultSet.next()){//获取每一行数据
/∥获取每一列数据
int sid = resultSet.getInt("sid");
String sname = resultSet.getString("sname");
int age = resultSet.getInt("age");
System.out.println(sid + "\t" + sname + "\t" + age);
}
另一种处理结果集方式如下:
while(resultSet.next()){//获取每一行数据
//取每一列数据
for (int i= 1;i
System.out.print(resultSet.getObject(i)+"\t");
System.out.println();
}
//3:执行sql
Statement statement = connection.createStatement();
//3.1增加数据
// int rows1=statement.executeUpdate("insert into student values(NULL,'鲁智深',40)");
//3.2修改数据
//int rows2= statement.executeUpdate("update student set age= 48 where sname='武松");
//3.3删除数据
int rows3= statement.executeUpdate("delete from student where sname ='鲁智深'");
System.out.println(rows3);
JDBC的SQL注入
SQL注入:用户输入的内容作为了SQL语句语法的一部分,改变了原有SQL真正的意义。
使用预编译可以解决这一问题,他会将输入的东西都变成参数,将单引号双引号都进行转义
//2:获取连接
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb16_jdbc", "root')
//3:执行sql
Statement statement = connection.createStatement():
String sql = "select * from user where username = "+username+" and password = "+password+"";
ResultSet resultSet = statement.executeQuery(sql);
用户名密码随便输入,后面加上 'or' 1=1 就可以成功登录,sql就注入了
String sql = "select * from user where username = ? and password = ? ";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.set0bject(1,username);
preparedStatement.setObject(2,password);
ResultSet resultSet = preparedStatement.executeQuery();
采用预处理方式就不会存在sql注入,因为他会把输入的信息整体当成密码,不会影响sql的整体功能
select * from user where username = 'ddd' and password ='+owow''or''1=1'; --将整体当成密码
MySQL的pymysql操作
PyMySQL是一个纯Python实现的MySQL客户端库,支持兼容Python 3,用于代替MySQLdb。
import pymysql
conn = pymysql.connect(host='localhost', port=3306, user='root',password='123456',database='mydb17_pymysql', charset='utf8')
#获取游标
cursor = conn.cursor()
执行S QL语句 返回值就是S QL语句在执行过程中影响的行数
sql = "select * from student;"
row_count = cursor.execute(sql)
print("S QL语句执行影响的行数%d"% row_count)
#取出结果集中一行返回的结果是一行
print(cursor.fetchone())
#取出结果集中的所有数据
返回一行数据
for line in cursor.fetchall():
print(line)
#关闭游标
cursor.close()
#关闭连接
conn.close()
PyMySQL是一个纯Python实现的MySQL客户端库,支持兼容Python 3,用于代替MySQLdb。
#取出结果集中一行返回的结果是一行
#print(cursor.fetchone())
#取出结果集中的所有数据
返回一行数据
for line in cursor.fetchall():
print(line)
#关闭游标
cursor.close()
#关闭连接
conn.close()