JDBC
-
概念:
Java DataBase Connectivity,java
数据库连接,java语言操作数据库 -
JDBC本质:其实是官方定义的一套操作所有关系型数据库的规则,即接口.各个数据库产商去实现这个接口,提供数据库确定jar包.这套接口编程,真正执行的是驱动jar包的实现类
-
快速入门
- 步骤
- 将驱动jar包导入
- 复制jar包到lib目录下(目录自定义)
- 右键->Add as library
- 注册驱动
- 获取数据库连接对象
Connection
- 定义SQL语句
- 获取执行sql语句的对象
Statement
- 执行sql,接收返回结果
- 处理结果
- 释放资源
- 将驱动jar包导入
- 步骤
-
详解各个对象
-
DriverManager
:驱动管理对象- 功能
- 注册驱动:告诉程序该使用哪一个数据库驱动jar包(在
mysql-connection-java5.0
之后可以不需要注册驱动)-
static void registerDriver(Driver driver)
:注册用户给定的驱动程序DriverManager
. - 写代码时使用:
Class.forName("com.mysql.jdbc.Driver");
将该类加载入内存.通过查看源码发现,在com.mysql.jdbc.Driver
类中存在静态代码块.静态代码块在程序执行时自动执行,那么可以看到加载类时真正运行的是java.sql.DriverManager.registerDriver(new Driver());
这句话
static { try { java.sql.DriverManager.registerDriver(new Driver()); } catch (SQLException E) { throw new RuntimeException("Can‘t register driver!"); } }
-
- 获取数据库连接
-
static Connection getConnection(String url, String user, String password)
:尝试建立与给定数据库URL的连接。 - 参数
- url:指定连接的路径
- 语法:
jdbc : mysql://ip地址或域名:端口号/数据库名称
- 语法:
- user:用户名
- password:密码
- 细节:如果连接的是本机的mysql服务器,并且mysql的端口是默认的3306,那么url可以简写为
jdbc : mysql:///数据库名称
- url:指定连接的路径
-
- 注册驱动:告诉程序该使用哪一个数据库驱动jar包(在
- 功能
- Connection:数据库连接对象
- 功能
- 获取执行sql的对象
Statement createStatement()
PreparedStatement prepareStatement(String sql)
- 管理事务
- 开启事务:
void setAutoCommit(boolean autoCommit)
调用该方法,设置参数为false,即开启事务 - 提交事务:
void commit()
- 回滚事务:
void rollback()
- 开启事务:
- 获取执行sql的对象
- 功能
- Statement:执行sql的对象
- 执行sql
-
boolean execute(String sql)
:可以执行任意的sql. -
int executeUpdate(String sql):执行DML(insert,delete,update),DDL(create,alter,drop)
语句,返回值是影响的行数 -
ResultSet excuteQuery(String sql)
:执行DQL语句(select)- 返回一个结果集对象
-
- 执行sql
- ResultSet:结果集对象(也是一个资源,最终要释放)
- 封装查询结果.
-
boolean next()
:游标向下移动一行,判断当前是否是最后一行末尾(是否有数据),如果是,则返回false(没有数据),如果不是则返回true(有数据) - getXxx(参数):获取数据
- Xxx:代表数据类型,如
int getInt()
- 参数
- int:代表列的编号,从1开始
- String:代表列的名称.
- Xxx:代表数据类型,如
- 使用步骤
- 游标向下移动一行(游标最初位于第一条数据的上方)
- 判断是否有数据
- 获取数据
//循环判断游标是否是最后一行末尾 while (resultSet.next()){ int id=resultSet.getInt("id"); String name=resultSet.getString("name"); int balance=resultSet.getInt("balance"); System.out.println("id---"+id+"---name---"+name+"---balance---"+balance); }
-
- 练习:定义一个方法,查询emp表的数据将其封装为对象,然后装载集合,返回
- 定义一个employee类
- 定义一个方法,
public List<Emp> findAll()
- 实现方法
select * from emp;
- 封装查询结果.
-
PreparedStatement
:执行sql的对象- sql注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串拼接,会造成安全性问题
- 输入随便,密码输入a‘ or ‘a‘ = ‘a,成功查询
- 解决sql注入问题,使用PrepearedStatement对象
-
PreparedStatement
:用于执行预编译的SQL语句 - 预编译SQL:参数使用?作为占位符
- 使用方法
- 定义sql语句时,SQL的参数使用?作为占位符,例如:
select * from user where username = ? and password = ?
- 获取执行sql的语句的对象
(PreparedStatment):Connection.preparedStatment(String sql)
- 给?赋值:setXxx(参数1,参数2)
- 参数1:?的位置编号,从1开始
- 参数2:?的值
- 执行sql:接受返回结果,不需要传递SQL语句
- 定义sql语句时,SQL的参数使用?作为占位符,例如:
- 注意:后期都会使用
PreparedStatment
来完成增删改查的操作- 可以防止sql注入
- 效率更高
- sql注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串拼接,会造成安全性问题
-
-
总结
- 使用JDBC连接数据库的步骤
- 注册驱动:
Class.forName("com.mysql.jdbc.Driver");
- 定义sql语句:
String sql;
- 获取连接对象:
DriverManager.getConnection("jdbc : mysql://ip地址或域名:端口号/数据库名称", "账户", "密码");
- 获取sql的执行对象:
statement=connection.createStatement();
- 执行sql语句
-
statement.executeUpdate(sql)
; 执行DML(insert,delete,update),DDL(create,alter,drop)
语句,返回值是影响的行数 -
statment.excuteQuery(sql)
:执行DQL语句(select),返回一个ResultSet结果集合 -
statment.excute(sql)
:执行所有的sql语句,返回boolean值
-
- 处理结果
- 如果是遍历ResultSet,则循环判断resultSet.next(),封装一个对象,并使用集合接收
- 注册驱动:
- 使用JDBC连接数据库的步骤
抽取JDBC工具类:JDBCUtils
- 目的:简化书写
- 分析
- 注册驱动
- 抽取一个方法获取连接
- 不传递参数,使用配置文件jdbc.properties
- 抽取一个方法获取资源
JDBC控制事务
- 事务:一个包含多个步骤的业务操作,如果这个业务被事务管理,则这多个步骤要么同时成功,要么同时失败.
- 操作
- 开启事务
- 提交事务
- 回滚事务
- 使用Connection对象来管理事务
- 开启事务:
setAutoCommit(boolean autoCommit)
:调用该方法设置参数false,即开启事务- 在执行sql之前开启事务
- 提交事务:
commit()
- 当所有sql都执行完成后提交事务
- 回滚事务:
rollback()
- 在catch中回滚事务(异常处理时写一个Exception,抛出一个大的异常,无论出现什么情况都要回滚事务)
- 开启事务: