1. JDBC
- 概念
- Java DataBase Connectivity
- 由Sun公司定义的一套可以操作所有关系型数据库的接口,各个数据库厂商实现这套接口,然后提供数据库驱动jar包。程序员使用这套接口操作数据库时,真正执行的代码是数据库驱动jar包中的实现类。
- 使用步骤
- 导入数据库驱动jar包
- 注册驱动
- 获取数据库连接对象
- 定义SQL语句
- 获取执行SQL语句的对象
- 执行SQL,接收返回结果
- 处理结果
- 释放资源
- 主要对象
- DriveManagement:驱动管理对象
- 注册驱动:告诉程序使用哪一个数据库驱动jar包
Class.forName("com.mysql.jdbc.Driver");- 实际上在com.mysql.jdbc.Driver类中存在静态代码块调用了DriveManagement类的registerDriver()方法
static { try { DriverManager.registerDriver(new Driver()); } catch (SQLException var1) { throw new RuntimeException("Can't register driver!"); } }
- 实际上在com.mysql.jdbc.Driver类中存在静态代码块调用了DriveManagement类的registerDriver()方法
- 获取数据库连接:
public static Connection getConnection(String url, String user, String password)- 参数
- url:连接的路径
- 格式:
jdbc:mysql://ip地址(域名):端口号/数据库名称 - 如果连接的是本机mysql服务器,并且mysql服务默认端口是3306,则url可以简写为:
jdbc:mysql:///数据库名称
- 格式:
- user:用户名
- password:密码
- url:连接的路径
- 参数
- 注册驱动:告诉程序使用哪一个数据库驱动jar包
- Connection:数据库连接对象
- 获取执行SQL语句的对象
- 获取Statement:
Statement createStatement() - 获取PreparedStatement:
PreparedStatement prepareStatement(String sql)
- 获取Statement:
- 管理事务
- 开启事务(在执行sql之前开启事务):
void setAutoCommit(boolean var1)调用该方法,传入参数false开启事务 - 提交事务(当所有sql都执行完提交事务):
void commit() - 回滚事务(在catch中回滚事务):
void rollback()
- 开启事务(在执行sql之前开启事务):
- 获取执行SQL语句的对象
- Statement:执行静态SQL语句的对象
boolean execute(String sql):可以执行任意的sql语句int executeUpdate(String sql):执行DML(insert、update、delete)语句、DDL(create,alter、drop)语句- 返回值为影响的行数,可以通过返回值判断SQL语句是否执行成功,若返回值>0,执行成功;否则,执行失败。
ResultSet executeQuery(String sql):执行DQL(select)语句
- ResultSet:结果集对象,用来封装查询结果
- boolean next(): 执行此方法后游标向下移动一行(游标默认位置在表头),然后判断当前行是否是否有数据,如果有数据,返回true;如果没有数据,返回false
- Xxx getXxx(参数):获取数据
- Xxx:数据类型
- 参数
- int:列的编号,从1开始
- String:列的名称
- PreparedStatement:执行预编译SQL语句的对象
- SQL注入问题:在拼接SQL时,使用一些SQL的特殊关键字参与字符串的拼接
- 登录时随便输入用户名,输入密码:a' or 'a' = 'a
- 使用Statement执行SQL语句时,
select * from user where username = 'najhuf' and password = 'a' or 'a' = 'a' - 这样就会成功登陆,造成了安全性问题
- 使用PreparedStatement对象执行SQL语句可以解决SQL注入问题
- 使用步骤
- 定义SQL语句时参数使用?作为占位符。例如:
String sql = "select * from user where username = ? and password = ?" - 获取执行预编译SQL语句的对象:
connection.preparedStatement(sql) - 为?赋值
preparedStatement.setXxx(参数1, 参数2)- 参数1:?的位置编号,从1开始
- 参数2:?的值
- 执行SQL语句
preparedStatement.executeUpdate()preparedStatement.executeQuery()
- 定义SQL语句时参数使用?作为占位符。例如:
- SQL注入问题:在拼接SQL时,使用一些SQL的特殊关键字参与字符串的拼接
- DriveManagement:驱动管理对象