JDBC基本概念
Java DataBase Connectivity Java 数据库连接
JDBC本质:其实是官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这个接口,提供数据库驱动jar包。我么可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包的实现类(多态的调用)
快速入门
步骤
- 导入驱动jar包
- 复制jar包到项目的libs目录下
- 右键–>add As Library
- 注册驱动
- 获取数据库连接对象 Connection
- 定义sql语句
- 获取执行sql语句的对象 Statment
- 执行sql,接受返回结果
- 处理结果
- 释放资源
详解各个对象
- Drivermanager:驱动管理对象
- 注册驱动:告诉程序该使用哪一个数据驱动库jar
static void registerDriver(Driver driver):注册与给定的驱动程序 Drivermanager
- 写代码使用:Class.forName(“com.mysql.jdbc.Driver”);
- 通过查看源码发现:在com.mysql.jdbc.Driver类中存在静态代码块
- 获取数据库连接:
- 方法:static Connection getConnection(String url, String user, String password)
- 参数:
- url:指定的连接路径
- 语法:jdbc:mysql://ip地址(域名):端口号/数据库名称
- 例子:jdbc:mysql://localhost:3306/db3
- user: 用户名
- password:密码
- url:指定的连接路径
static {
try{
java.sql.Drivermanager.registerDriver(new Driver);
}catch(SQL Excepetion E){
throw new RuntimeException("Can't register driver");
}
}
- Connection:数据库连接对象
- 功能:
- 获取执行sql的对象
- Statement creatStatement()
- PreparedStatement prepareStatement(String sql)
- 管理事务:
- 开启事务: setAutoCommit(boolean autoCommit):调用该方法设置参数为false,即开启事务
- 提交事务:commit()
- 回滚事务:rollback()
- 获取执行sql的对象
- 功能:
- Statement:执行sql的对象
- 执行sql
- boolean execute(String sql):可以执行任意的sql 了解
- int executeUpdate(String sql):执行DML(insert,update,delete)语句, DDL(create,alter,drop)语句
- 返回值:影响的次数,可以通过这个影响的行数判断DML语句是否执行成功 返回值>0 则执行成功,反之,则失败
- ResultSet executeQuery(String sql) :执行DQL(select)语句
- 练习
- account表 添加一条记录
- account表 修改记录
- account表 删除一条记录
- 执行sql
- ResultSet:结果集对象,封装查询结果的
- next() :游标向下移动一行,判断当前行是否是最后一行末尾(是否有数据),如果是则返回false如果不是,则返回true
- getXxx(参数):获取数据
- Xxx代表数据类型 如getInt():返回int值
- 参数:
- int:代表列的编号 如 getString(1),【编号从1开始】
- String:代表列的名称 如:getDouble(“balance”)
- 注意:
- 使用步骤:
- 游标向下一行
- 判断是否有数据
- 获取数据
- 使用步骤:
while(rs.next()){
int id = rs.getInt(1);
String name = rs.getString("name");
double balance = rs.getDouble(3):
System.out.println(id+"-----"+name+"---"+ balance);
}
- PreparedStatement:执行sql对象(子接口)
-
SQL注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接。会造成安全问题
- 输入用户名随便,输入密码:a’ or ‘a’ = 'a (有or就会是true 通过验证)
- sql: select * from user where username = ‘fhshjd’ and password = ‘a’ or ‘a’ = ‘a’
-
解决sql注入问题:使用PreparedStatement对象来解决
-
预编译的SQL:参数使用?作为占位符
-
步骤:
- 导入驱动jar包
- 注册驱动
- 获取数据库连接对象 Connection
- 定义sql
- 注意: sql的参数使用?作为占位符。如:select * from user where username =? and password = ?
- 获取执行sql语句的对象 PreStatement Connection.preparedStatement(String)
- 给?赋值
- 方法: setXxx(参数1, 参数2)
- 参数1:?的位置编号 从1开始
- 参数2:?的值
- 方法: setXxx(参数1, 参数2)
- 执行sql,接受返回结果,不需要传递sql语句
- 处理结果
- 释放资源
-
注意:后期都会使用PreparedStatement来完成增删改查的所有操作
- 可以防止SQL
- 效率更高
-
抽取JDBC工具类:JDBCUtils
- 目的:简化书写
- 分析:
- 注册驱动也抽取
- 抽取一个方法获取连接对象
- 需求:不想传递参数(麻烦),还得保证工具类的通用性
- 解决:
- jdbc.properties
- url =
- user =
- password =
- jdbc.properties
使用JDBC控制事务
转账过程
- 获取连接
- 开启事务
- setAutoCommit(boolean autoCommit):调用该方法设置参数为false,即开启事务
- 定义SQL
- 张三减500,李四加500
- 获取执行对象
- 设置参数(给占位符?赋值)
- 执行SQL语句
- 提交事务(在catch中执行回滚操作,判断conn是否为null,抓一个大异常)
- commit()
- 当所有sql都执行完提交事务