1. JDBC基本概念
2. 快速入门
3. 对JDBC中各个接口和类详解
JDBC:
1. * 概念:Java DataBase Connectivity Java数据库连接。Java语言操作数据库
* JDBC本质:其实是官方(sun公司) 定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以
使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。
2. 快速入门:
* 步骤:
1. 导入驱动jar包 mysql-connector-java-5.1.27-bin.jar
1. 复制mysql-connector-java-5.1.27-bin.jar到目录的libs目录下
2. 右键--->Add As Library
2. 注册驱动
3. 获取数据库连接对象 Connection
4. 定义sql
5. 获取执行sql语句的对象 Statement
6. 执行sql,接受返回结果
7. 处理结果
8. 释放资源
* 代码实现
// 1.导入驱动jar包
// 2. 注册驱动
Class.forName("com.mysql.jdbc.Driver");
// 3.获取数据库连接对象
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db2", "root", "123456");
// 4.定义一个sql语句
String sql = "update account set balance = 500 where id = 1";
// 5. 获取执行sql的对象 Statement
Statement stmt = conn.createStatement();
// 6. 执行sql
int count = stmt.executeUpdate(sql);
// 7. 处理结果
System.out.println(count);
// 8.释放资源
stmt.close();
conn.close();
3. 详解各个对象:
1. DriverManager:驱动管理对象
* 功能:
1. 注册驱动:告诉程序该使用哪一个数据库驱动
static void registerDriver(Driver driver):注册与给定的驱动程序 DriverManager
写代码使用: Class.forName("com.mysql.jdbc.Driver");
通过查看源码发现:在com.mysql.jdbc.Driver类中存在静态代码块
注意:mysql5之后的驱动jar包可以省略注册驱动的步骤
2. 获取数据库连接
* 方法 static Connection getConnection(String url,String user, String password)
* 参数:
* url:指定连接的路劲
* 语法:jdbc:mysql://ip地址(域名):端口号/数据库名称
* 例子:jdbc:mysql://localhost:3306/db2
* 细节:如果连接的是本机的mysql服务器,并且mysql服务默认端口是3306,则url可以简写为:jdbc:mysql:///数据库名称
* user:用户名
* password:密码
2. Connection:数据库连接对象
1. 功能:
1.获取执行sql的对象
* Statement createStatement()
* PreparedStatement prepareStatement(String sql)
2. 管理事务
* 开启事务:setAutoCommit(boolean autocommit):调用该方法设置参数为false,即开启事务
* 提交事务:commit()
* 回滚事务:roolback()
3. Statement(用于执行静态SQL语句并返回其生成的结果的对象):执行sql的对象
1. 执行sql
1. boolean execute(String sql):可以执行任意的sql了解
2. int executeUpdate(String sql):执行的是DML(增删改)语句、DDL(create,alter,drop)语句
* 返回值:影响的行数,可以通过这个影响的行数可以判断DML语句是否返回成功 返回值>0的则成功,反之失败
3. ResultSet executeQuery(String sql): 执行DQL(select) 语句
2. 练习:
1. account表添加一条记录
2. account表修改一条记录
3. account表删除一条记录
4. ResultSet:结果集对象,封装查询结果
*. boolean next():游标向下移动一行,判断当前行是否是最后一行末尾(是否有数据),如果是则返回false,如果不是则返回ture
* getXxx(参数):获取数据
* Xxx:代表数据类型 如:Int getInt() String getString()
* 参数:
1. Int:代表列的标号,从1开始 如:getString(1)
2. String:代表列名称 如:getDouble("balance")
* 注意:
* 使用步骤:
1. 游标向下移动一行
2. 判断是否有数据
3. 获取数据
* 练习:
*定义一个方法, 查询emp表的数据将其封装为对象,然后装载集合,返回
1. 定义一个emp 的类
2. 定义一个方法 public List<Emp> findAll(){}
3. 实现方法 select * from emp
5. PreparedStatement: 执行sql的对象
1. sql注入问题:在拼接sql时,有一些sql 的特殊关键字参与字符串的拼接。会造成安全性的问题
1. 输入用户名随便,输入密码
2. 解决sql注入问题:使用PreparedStatement对象来解决
3. 预编译sql:参数使用?作为占位符
4. 步骤:
1. 导入驱动jar包 mysql-connector-java-5.1.27-bin.jar
2. 注册驱动
3. 获取数据库连接对象 Connection
4. 定
* 注意:sql的参数使用?作为占位符。如:select * from user where username = ? and password = ?;
5. 获取执行sql语句的对象 PreparedStatement Connection.prepareStatement(String sql)
6. 给?赋值:
* 方法: setXxx(参数1,参数2)
* 参数1: ?的位置编号从1开始
* 参数2:?的值
7. 执行sql,接受返回结果
8. 处理结果
9. 释放资源
5. 注意:后期都会使用PreparedStatement来完成增删改查的所有操作
1. 可以防止sql注入
2. 效率更高
抽取JDBC工具类:JDBCUtils
* 目的:简化书写
* 分析:
1. 注册驱动也抽取
2. 抽取一个方法获取连接对象
* 需求:不想传递参数(麻烦),还得保证工具类的通用性
* 解决:配置文件
jdbc.properties:
url=
user=
password=
3. 抽取一个方法释放资源
* 练习:
* 需求:
1. 通过键盘录入用户名和密码
2. 判断用户是否登录成功
* select * from user where username = '' and password = '';
* 如果这个sql有查询结果则成功,反之则失败
* 步骤:
1. 创建数据库表user
CREATE table user(
id int primary key auto_increment,
username VARCHAR(32),
PASSWORD VARCHAR(32)
);
SELECT * from user;
INSERT INTO user VALUES(null,'张三','123456')
INSERT INTO user VALUES(null,'李四','12345')
## JDBC控制事务
1. 事务:一个包含多个步骤的业务操作。如果这个业务操作被事务管理,则这多个步骤要么同时成功,要么同时失败。
2. 操作:
1. 开启事务
2. 提交事务
3. 回滚事务
3. 使用Connection对象来管理事务
* 开启事务:setAutoCommit(boolean autocommit):调用该方法设置参数为false,即开启事务
* 提交事务:commit()
* 回滚事务:roolback()
* 代码演示:
public static void main(String[] args) {
Connection conn = null;
PreparedStatement ps1 = null;
PreparedStatement ps2 = null;
try {
//1.获取连接
conn= JDBCUtils.getConection();
//开启事务
conn.setAutoCommit(false);
//2.写要运行的sql语句
//2.1 张三 -500
String sql1 = "update account set balance = balance-? where id = ?";
//202 李四 +500
String sql2 = "update account set balance = balance+? where id = ?";
//获取执行sql的对象
ps1 = conn.prepareStatement(sql1);
ps2 = conn.prepareStatement(sql2);
//给占位符赋值
ps1.setDouble(1,500);
ps1.setInt(2,1);
ps2.setDouble(1,500);
ps2.setInt(2,2);
//运行sql,不需要传递参数
ps1.executeUpdate();
//手动制造异常
int i = 3/0;
ps2.executeUpdate();
//如果没有错误就提交事务
conn.commit();
} catch (SQLException throwables) {
//一旦出现异常错误就一定会进入catch中处理异常,这样我们可以在这里进行事务的回滚
try {
if(conn!=null){
conn.rollback();
}
} catch (Exception e) {
e.printStackTrace();
}
throwables.printStackTrace();
}finally {
JDBCUtils.close(null,ps1,conn);
JDBCUtils.close(null,ps2,null);
}
}