操作所有数据库的方式
案例:
使用jdbc的工具类完成登录案例
使用jdbc的工具类完成转账案例
JDBC 概述
JDBC: Java DataBase Connectity ---- java数据库的连接
是一种专门用于执行SQL语句的Java API,可以为多种关系数据库提供统一的访问,它由一组用Java语言编写的接口组成
java代码要想操作各种数据库就得使用JDBC
JDBC的由来
JDBC规范定义接口,具体的实现由各大数据库厂商来实现 ,JDBC是Java访问数据库的标准规范。真正怎么操作
数据库还需要具体的实现类,也就是数据库驱动(第三方JAR包)。每个数据库厂商根据自家数据库方式编写好自己数据库的驱动。所以我们只需要会调用JDBC接口中的方法即可。数据库驱动由数据库厂商提供。
我们在用java代码操作数据库时只需要会使用JDBC接口中的方法即可,使用简单
初步案例-使用java代码对数据库进行数据插入
前提:操作哪个数据库就需要导入哪个数据库的驱动包
jdbc的使用步骤:
1.加载驱动
2.获取连接
3.编写sql
4.获取语句的执行者
5.执行sql并返回结果集
6.处理结果集
7.释放资源
JDBC API详解
DriverManager:类
方法作用:
1 加载驱动
static void registerDriver(Driver driver) 底层加载驱动了2次 不建议使用
反射: Class.forName("com.mysql.jdbc.Driver") 底层加载驱动了1次
2 获取数据库连接的对象
static Connection getConnection(String url, String user, String password);
Url:数据库的地址 固定格式:jdbc:要连的数据库://数据库地址:端口号/哪个数据库
user:数据库的用户名
Password:数据库的密码
如果数据出现乱码需要加上参数: ?characterEncoding=utf8,表示让数据库以UTF-8编码来处理数据。 如:
jdbc:要连的数据库://数据库地址:端口号/哪个数据库?characterEncoding=utf8
Connection:接口
方法作用:
1 可以获取执行SQL语句的对象(语句执行者)
Statement createStatement();获取语句的执行者 --今天用它 (不安全)
PreparedStatement prepareStatement();获取语句的执行者 --后天用它
2 操作事务
void setAutoCommit(boolean autoCommit) ; ---start Transaction
false:开启事务, ture:关闭事务(默认)
void commit(); ---commit
提交事务
void rollback(); ---rollback
回滚事务
Statement:接口
方法作用:
1 执行sql语句
executeUpdate() 执行的是增删改语句
返回值是int类型 代表受影响的行数
executeQuery() 执行的是查询语句
返回的值是ResultSet类型对象 称为:结果集对象
Resultset:接口
方法作用:
1 封装查询语句的结果集
next() 可以让指针向下移动一行 默认在第一行之前 返回值是boolean true:代表有数据 false: 代表没数据
2 获取结果集中每一行的数据
get类型(int 列的位置)
get类型(String 列名)
编写JDBC的工具类实现数据的增删改查
工具类:可以将一些重复的代码进行抽取封装,以便于复用,简化代码开发
通过上面代码的编写会发现每次去执行SQL语句都需要注册驱动,获取连接,以及释放资源。
发现很多重复的劳动,我们可以将重复的代码抽取出来定义一个工具类,直接调用方法,可以简化代码。
那么我们接下来定义一个JDBCUtils 类。把注册驱动,获取连接,以及释放资源的代码放到这个类的方法
中。以后直接调用该工具类的方法即可。
JDBC封装工具类
在日后开发过程中使用原生JDBC的场景很少见,主要是因为在应用中有大量重复的JDBC代码
所以需要我们去使用第三方基于JDBC的框架,如 mybatis hibernate ibaties 等
这里我们封装一个自定义工具类:
public class JDBCUtils {
static {
try {
// 加载驱动
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
// 获取连接的方法
public static Connection getConnection() throws ClassNotFoundException, SQLException {
// 获取连接
Connection connection = DriverManager.getConnection("jdbc:mysql:///db4", "root", "root");
return connection;
}
// 释放资源的方法
public static void closeZY(ResultSet rs, Statement st,Connection con){
// ResultSet资源
try {
if(rs!=null){
rs.close();
}
}catch (Exception e){
e.printStackTrace();
}
// Statement资源
try {
if(st!=null){
st.close();
}
}catch (Exception e){
e.printStackTrace();
}
// connection资源
try {
if(con!=null){
con.close();
}
}catch (Exception e){
e.printStackTrace();
}
}
}
JDBC操作事务
Connection:
void setAutoCommit(boolean autoCommit) ;
false:开启事务 ture:关闭事务(默认的)
void commit();
提交事务
void rollback();
回滚事务
ps:在使用手动事务时,必须要抓取异常,在catch块中进行回滚事务.
只要有事务,就必须try,catch捕捉处理 查询有没有事务都行
需求:使用JDBC的事务操作完成转账案例
// 模拟转账 只要涉及到事务就不能抛 一定要try catch
public void tranFer() throws SQLException, ClassNotFoundException {
Connection connection=null;
Statement statement =null;
try {
// 1 加载驱动
// 2 获取连接
connection = JDBCUtils.getConnection();
// 3 获取语句执行者
statement = connection.createStatement();
// 4 编写sql语句并执行
// 开启事务 (将mysql的自动提交变成手动提交)
//start transaction;=== connection.setAutoCommit(false)
connection.setAutoCommit(false);
// 减钱
statement.executeUpdate("update account set money=money-100 where name='jack'"); //手动提交
int i=1/0;
// 加钱
statement.executeUpdate("update account set money=money+100 where name='rose'"); //手动提交
// 手动提交
//commit;=== commit()
connection.commit();
}catch (Exception e){
e.printStackTrace();
// 数据回滚
connection.rollback();
}finally {
// 5 释放资源
JDBCUtils.closeZY(null,statement,connection);
}
}
模拟用户登录功能
需求:
我们在控制台输入用户名和密码,输入完用户名和密码后,获取输入的值,使用jdbc操作数据库,完成登录功能.
找到了:登录成功 找不到:用户名或密码错误
技术分析: jdbc 技术
代码实现:
创建用户表:
create table user (
id int primary key auto_increment,
name varchar(20),
password varchar(20)
);
insert into user values(null,"tom","111"),(null,"rose","222"),(null,"jack","333");
Java代码
public static void main(String[] args) throws SQLException, ClassNotFoundException {
// 1 操作控制台
Scanner scanner = new Scanner(System.in);
System.out.println("请输入用户名:");
// 2 获取控制台填写的用户名和密码
String name = scanner.nextLine();
System.out.println("请输入密码:");
String password = scanner.nextLine();
// 3 拿着用户名和密码使用jdbc做数据库的匹配
// 加载驱动
// 获取连接
Connection connection = JDBCUtils.getConnection();
// 获取语句执行者
Statement statement = connection.createStatement();
// 编写sql并执行
String sql="select * from user where name='"+name+"' and password='"+password+"'";
ResultSet resultSet = statement.executeQuery(sql);
// 处理结果街 (是否登录成功)
if(resultSet.next()){
// 找到了 恭喜你登录成功
System.out.println("恭喜你登录成功....");
}else {
// 没找到 用户名或密码错误
System.out.println("用户名或密码错误....");
}
// 释放资源
JDBCUtils.closeZY(resultSet,statement,connection);
}
总结
jdbc:是java提供的一套规范,java代码操作数据库的桥梁
java代码要想操作数据库一定得使用jdbc
jdbcTemplate
dbutils
mybatis
hibernate
jdbc的操作:固定步骤
1 加载驱动
2 获取连接
3 获取语句执行者
4 编写sql语句
5 执行sql语句
6 处理结果集 (查询特有)
7 释放资源
自定义了一个jdbc工具类: 把127这三个步骤抽到了工具类中,以便与复用
jdbc中的数据事务控制:Connection
setAUtoCommit(boolean) false:手动 true:自动
commmit() 手动提交
rollback() 数据回滚
ps:只要涉及事务就必须try catch
DCL(了解)
#DCL语句(了解)
#创建用户
#命令格式:CREATE USER ‘用户名’@‘主机地址’ IDENTIFIED BY ‘密码’;
CREATE USER ‘tom’@‘localhost’ IDENTIFIED BY ‘123’;
#默认没有任何权限 什么都做不了
#tom用户分配权限
#命令格式:GRANT 权限1, 权限2… ON 数据库名.表名 TO ‘用户名’@‘主机名’;
GRANT ALL ON db3.* TO ‘tom’@‘localhost’;
#查看权限
#命令格式 SHOW GRANTS FOR ‘用户名’@‘主机名’;
SHOW GRANTS FOR ‘tom’@‘localhost’
#撤销权限
#命令格式:REVOKE 权限1, 权限2… ON 数据库.表名 FROM ‘用户名’@‘主机名’;
REVOKE ALL ON db3.* FROM ‘tom’@‘localhost’;
#给普通用户修改密码
#特点:需要root用户先登录 再使用命令去修改普通用户的密码
#格式:set password for ‘用户名’@‘主机名’ = password(‘新密码’);
#删除用户
#命令格式:DROP USER ‘用户名’@‘主机名’;
DROP USER ‘tom’@‘localhost’;
#给root用户修改密码
#特点:不需要登录 直接操作命令即可
#格式:mysqladmin -uroot -p password 新密码