1.DCL
1.1 创建用户
-- 格式
creaet user '用户名'@'主机地址' identified by '新密码';
主机地址:localhost or 127.0.0.1
%:任意地址
密码可以为空
1.2 用户授权
-- 格式
grant 权限1,权限2,权限3... on 数据库名 to'用户名'@'主机地址' ;
权限:
creat, alter, drop , select update insert …
所有库.所有表(慎重)
数据库名.*【常用】
1.3 查看权限
-- 格式
show grants for '用户名'@'主机地址';
1.4 撤销授权
-- 格式
revoke 权限1,权限2,权限3... on 数据库名.表名 from '用户名'@‘主机地址’;
权限:
create later drop select update insert…
all:所有权限
所有库.所有表【慎重】
数据库.*【常用】
1.5删除用户
-- 格式
drop user ‘用户名’@‘主机地址’;
1.6 密码管理
a)超级管理员
-- 格式 要求在dos窗口下
mysqladmin -u用户名 -p password 新密码;
b)普通用户
--格式
set password for '用户名'@'主机地址'=password('新密码');
代码片段
-- 创建用户
CREATE USER 'tom'@'localhost' IDENTIFIED BY '123';
CREATE USER 'jerry'@'%' IDENTIFIED BY '123';
-- 用户授权
GRANT SELECT ON db_day03.* TO 'tom'@'localhost';
-- 查看权限
SHOW GRANTS FOR 'tom'@'localhost';
-- 撤销授权
REVOKE SELECT ON db_day03.* FROM 'tom'@'localhost';
-- 删除用户
DROP USER 'tom'@'localhost';
-- 修改普通用户
SET PASSWORD FOR 'jerry'@'%'=PASSWORD('789');
2.JDBC(重点)
2.1概述
JDBC: java数据库连接。
- 通过java代码来操作数据库
- 是java对关系型数据库提供的一套规范(接口),我们只需要学习接口的方法即可。
- 驱动: 实现类由数据库厂商提供(jar)
2.2 常用API
a) DriverManager
作用:指定java代码连接的数据库厂商
//注册驱动
//DriverManager.registerDriver(Driver mysql实现类);后续不用
**Class.forName(“包名.类名”); 会走这个类的静态代码块 **
//翻看com.mysql.jdbc.Driver源码,知道静态代码已经实现了注册驱动我们只需要把此类加载到内存即可
Class.forName("com.mysql.jdbc.Driver");
//获取连接
Connection connection=DriverManager.getConnection(String url,String username,String password);
/*
url:数据库连接的地址(非常固定)
jdbc:mysql://主机地址:端口号/数据库名
jdbc:mysql://localhost:3306/student2
jdbc:mysql://student2?chacterEncoding=utf-8
*/
注意:DriverManager.registerDriver(new com.mysql.jdbc.Driver());存在两方面的不足
1.硬编码,后期不易于程序扩展和维护
2.驱动被注册两次
使用Class.forName(“com.mysql.jdbc.Driver”);加载驱动,只会加载一次。
b) Connection
作用:将java代码与数据库建立连接通道
//创建语句执行者
public Statement createStatement();
//创建预编译语句执行者(进阶内容)
public PreparedStatement preparedStatemenrt(String sql);
c) Statement
作用:将java代码中的sql字符串发送给数据库并返回结果
//执行所有sql
public boolean execute();此方法可以执行任意sql语句。返回boolean值,表示是否返回ResultSet结果集。仅当执行select语句,且有返
回结果时返回true, 其它语句都返回false;
//执行dml
public int executeUpdate(); 返回影响行数
//执行dql
public ResultSet();返回查询结果集
d) ResultSet:
作用:用于接收数据库返回结果集
//指针下移
public boolean next();如果有记录返回ture,没有记录返回false,通常与while结合使用
//获取记录
public T getXXX(int 列位置 | String 列名);
特殊:
getString:获取所有类型,底层进行了转换。
2.3 初体验
需求:
在java控制台输出数据库查询的结果
步骤分析:
- 准备数据库和表
- 创建java工程
- 导入jar包
- 编写代码
/*
1.连接数据库
2.编写sql语句
3.创建语句执行者
4.发送sql语句,并接收返回结果
5.处理
6.关闭资源
*/
//连接数据库
// 1.1注册驱动
//DriverManager.registerDriver(new Driver()); 不用了!
Class.forName("com.mysql.jdbc.Driver");
//1.2 获取连接
Connection connection = DriverManager.getConnection
("jdbc:mysql://localhost:3306/student2", "root", "root");
//编写sql语句
String sql = "select * from user;";
//创建执行语句 statement
Statement statement = connection.createStatement();
//4.发送sql语句并返回结果
ResultSet resultSet = statement.executeQuery(sql);
//5.处理结果
while (resultSet.next()){
int id=resultSet.getInt("id");
String username = resultSet.getString("username");
String password = resultSet.getString("password");
System.out.println("一条记录的结果为:"+id+" "+username+" " +password+" ");
}
//关闭资源 后打开的先关闭
resultSet.close();;
statement.close();
connection.close();
2.3 练习(增删改查)
2.3.1 增
/@Test
public void test01() throws Exception {
//连接数据库
//1.1注册数据库
Class.forName("com.mysql.jdbc.Driver");
//1.2 获取连接
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/student2", "root", "root");
//2.编写sql语句
String sql = "insert into user values(null,'zhezhe','789')";
//3.创建语句执行者
Statement statement = connection.createStatement();
//4.发送sql数据并返回结果
int i = statement.executeUpdate(sql);
//5.处理结果
if (i>0){
System.out.println("新增成功!");
}else{
System.out.println("新增失败!");
}
//关闭资源
statement.close();
connection.close();
}
2.3.2 删除
@Test
public void test03() throws Exception {
//1. 连接数据库
//1.1 注册驱动
Class.forName("com.mysql.jdbc.Driver");
//1.2 获取连接
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/student2", "root", "root");
//2.编写sql语句
String sqln = "delete from user where id='4'";
//3.创建语句执行者
Statement statement = connection.createStatement();
//4.发送sql语句,并返回结果
int i = statement.executeUpdate(sqln);
//5.处理结果
if (i>0){
System.out.println("删除成功!");
}else{
System.out.println("删除失败!");
}
//6. 关闭资源
statement.close();
connection.close();
}
2.3.3 修改
@Test
public void test02() throws ClassNotFoundException, SQLException {
/*
1.连接数据库
2.编写sql语言
3.建立语句执行者
4.发送sql语句并接收返回结果
5.处理结果
6.关闭资源
*/
//1.连接数据库
//1.1 注册驱动
Class.forName("com.mysql.jdbc.Driver");
//1.2 获取连接
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/student2", "root", "root");
//2. 编写sql语句
String sql = "update user set password='567' where id='4'";
//3.创建执行者
Statement statement = connection.createStatement();
//发送sql语句,并接收返回结果
int i = statement.executeUpdate(sql);
//5.处理结果
if (i>0){
System.out.println("更新成功!");
}else{
System.out.println("更新失败!");
}
//6. 关闭资源
statement.close();
connection.close();
}
2.3.4 查询
@Test
public void test04() throws ClassNotFoundException, SQLException {
//1.连接数据库
//1.1注册驱动
Class.forName("com.mysql.jdbc.Driver");
//1.2 获取连接
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/student2", "root", "root");
//2.编写sql语句
String s = "select * from account ;";
//3. 创建语句执行者
Statement statement = connection.createStatement();
//4.执行sql语句
ResultSet resultSet = statement.executeQuery(s);
//5.处理结果
while (resultSet.next()){
int id = resultSet.getInt("id");
String name = resultSet.getString("user");
String balance = resultSet.getString("balance");
System.out.println(id+" "+name+" "+balance+" ");
}
//6.释放资源
resultSet.close();
statement.close();
}
2.5JDBC工具类
使用jdbc操作数据库,获取连接,关闭资源这些属于打吗的公共部分,抽取到工具类, 编写一次,多次使用,简化代码,提高效率
配置文件:
public class JDBCTools01 {
//配置文件信息
private static String jdbc_driver;
private static String jdbc_url;
private static String jdbc_user;
private static String jdbc_password;
static {
// 使用sun提供内置 工具类 ResourceBundle 专门用于加载src目录下的 properties配置文件
ResourceBundle resourceBundle = ResourceBundle.getBundle("jdbc");
jdbc_driver = resourceBundle.getString("jdbc_driver");
jdbc_url = resourceBundle.getString("jdbc_url");
jdbc_user = resourceBundle.getString("jdbc_user");
jdbc_password = resourceBundle.getString("jdbc_password");
}
//注册驱动
static {
/*try {
Class.forName("jdbc_driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}*/
try {
Class.forName(jdbc_driver);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//获取连接的方法
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(jdbc_url, jdbc_user, jdbc_password);
}
public static void closeResorce(ResultSet resultSet, Statement statement, Connection connection) {
closeResultSet(resultSet);
closeStatement(statement);
closeConnection(connection);
}
public static void closeResorce(Statement statement, Connection connection) {
closeStatement(statement);
closeConnection(connection);
}
private static void closeConnection(Connection connection) {
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
private static void closeStatement(Statement statement) {
if (statement != null) {
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
private static void closeResultSet(ResultSet resultSet) {
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
main方法
public class Demo01 {
public static void main(String[] args) {
// 搭建 异常处理框架 try catch finally
// 声明变量
Connection connection = null;
Statement statement = null;
try {
connection = JDBCTools01.getConnection();
statement = connection.createStatement();
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCTools01.closeResorce(statement,connection);
}
}
}
2.6 事务安全
需求: 用java代码去管理事务,模拟转账
/*
开启事务 关闭自动提交
public void setAutoCommit(boolean false);
提交事务
public void commit();
回滚事务
public void rollback();
*/
public class Demo01 {
public static void main(String[] args) {
//通过jdbc操作
//声明变量
Connection connection = null;
Statement statement = null;
try {
//获取连接
connection = JDBCTools01.getConnection();
//开启事务
connection.setAutoCommit(false);
//创建语句执行者
statement = connection.createStatement();
//扣钱
String s = "update account set balance=balance-100 where id='1'";
int i = statement.executeUpdate(s);
if (i > 0) {
System.out.println("yuqi扣钱成功!");
}
//八原加钱
s = "UPDATE account set balance=balance+100 where id='2'";
int i1 = statement.executeUpdate(s);
if (i1 > 0) {
System.out.println("巴元加钱成功");
}
//提交事务 try
connection.commit();
} catch (Exception e) {
e.printStackTrace();
//回滚事务 catch
try {
connection.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
}finally {
//关闭资源
JDBCTools01.closeResorce(statement,connection);
}
}
}
2.7案例:用户登录
需求: 模拟用户登录
public class Demo01 {
public static void main(String[] args) {
//1. 在控制台输入用户名和密码
Scanner scanner = new Scanner(System.in);
//提示
System.out.println("欢迎来到……");
System.out.println("请输出用户名:");
String username = scanner.nextLine();
System.out.println("请输入用户密码:");
String password = scanner.nextLine();
//2.根据输入的用户名和密码查询数据库 jdbc
//2.1 获取连接
Connection connection = null;
Statement statement = null;
ResultSet resultSet = null;
try {
connection = JDBCTools01.getConnection();
//2.2 编写sql代码
// String sql = "select * from user where username='" + username + "'and password='" + username + "'";
String sql = "select * from user where username = '" + username + "' and password = '" + password + "' ";
System.out.println(sql);
//2.3 创建执行者
statement = connection.createStatement();
//2.4 发送sql语句并接收返回结果
resultSet = statement.executeQuery(sql);
//2.5处理事件
if (resultSet.next()) {
System.out.println("登陆成功!");
} else {
System.out.println("登录失败!");
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
//2.6关闭资源
JDBCTools01.closeResorce(resultSet,statement,connection);
}
}
}