JDBC
JDBC (Java DataBase Connectivityjava数 据库连接)是一种用于执行SQL语句的Java API。 JDBC是Java访问数据库的标准规范,可以为不同的关系型数据库提供统一访问, 它由一组用Java语言编写的接口和类组成。
JDBC需要连接驱动,驱动是两个设备要进行通信,满足一定通信数据格式,数据格式由设备提供商规定,设备提供商为设备提供驱动软件,通过软件可以与该设备进行通信。
JDBC核心类和接口
DriverManager:用于注册驱动
Connection:表示与数据库创建的连接
Statement/PrepareStatement:操作数据库sql语句的对象
ResultSet:结果集或一张虚拟表
需要先下载导入架构包
执行流程
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());//可以省略,因为内部已经设置好了。//2 获得连接Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/myDatabase","root","123456");//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();Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/myDatabase","root","123456");
}
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();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("登录失败!");}//当用户收益输入账号或密码时有可能会造成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();String sql = "select * from user where username = ? and password = ?";PreparedStatement preparedStatement = connection.prepareStatement(sql);preparedStatement.setObject(1, username);//设置第一个问号是usernamepreparedStatement.setObject(2, password);//设置第一个问号是passwordResuLtSet resultSet = preparedStatement.executeQuery();if(resultSet.next()){System.out.println("登录成功!");}else{System.out.println("登录失败!");}
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()