JDBC
1.DCL(介绍)
1.1创建用户:
CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码'; 关键字说明:
1. `用户名`:将创建的用户名2. `主机名`:指定该用户在哪个主机上可以登陆,如果是本地用户可用localhost,如果想让该用户可以从任意远程 主机登陆,可以使用通配符%
3. `密码`:该用户的登陆密码,密码可以为空,如果为空则该用户可以不需要密码登陆服务器
具体的操作:
-- 1.创建用户 identified by 为用户设置密码
-- user1用户只能在localhost这个IP登录mysql服务器
CREATE USER 'user1'@'localhost' IDENTIFIED BY '123';
‐‐ user2用户可以在任何电脑上登录mysql服务器
CREATE USER 'user2'@'%' IDENTIFIED BY '123';
1.2授权用户
授权格式:GRANT 权限1, 权限2... ON 数据库名.表名 TO '用户名'@'主机名'; 关键字说明.
1. `GRANT` 授权关键字
2. 授予用户的权限,如`SELECT`,`INSERT`,`UPDATE`等。如果要授予所的权限则使用`ALL`
3. `数据库名.表名`:该用户可以操作哪个数据库的哪些表。如果要授予该用户对所有数据库和表的相应操作权限则 可用*表示,如`*.*`
4. `'用户名'@'主机名'`: 给哪个用户授权
具体的操作:
1.1给luliang用户分配对test这个数据库操作的权限
GRANT CREATE,ALTER,DROP,INSERT,UPDATE,DELETE,SELECT ON test.* TO 'luliang'@'localhost';
1.2给luliang用户分配对所有的数据库操作的权限。
CRANT ALL ON *.* TO 'luliang'@'localhost';
1.3撤销授权
REVOKE ALL ON test.* FROM 'user1'@'localhost';
具体操作:
撤销luliang用户对test操作的权限。
REVOKE ALL ON test.*FROM 'luliang'@'localhost';
1.4查看权限
SHOW GRANTS FOR '用户名'@'主机名';
查看luiang用户的权限
SHOW GREATS FOR 'luliang'@'localhost';
1.5删除用户
DROP USER '用户名'@'主机名';
具体的操作:
DROP USER 'luliang'@'localhost';
1.6修改用户名
修改管理员密码
mysqladmin -uroot -p password 新密码 -- 新密码不需要加上引号
注意:需要在未登录MySql的情况下的操作
具体操作:
mysqlamdin -uroot -p password 123456
输入老密码
1.7修改普通用户密码
set password for 'luliang'@'localhost'=password('666666');
JDBC处理MysSQL中的用户:
JDBC的概念:
JDBC:是有Sun公司提供的一套的规范的(接口),由一推数据。
客户端操作MySQL数据库的方式
1. 使用第三方客户端来访问MySQL:SQLyog、Navicat、SQLWave、MyDB Studio、EMS SQL Manager for MySQL
2. 使用MySQL自带的命令行方式
3. 通过Java来访问MySQL数据库,
什么是JDBC: Java Data Base Connectivity (Java数据库连接) JDBC是Java访问数据库的 标准规范
JDBC的作用:JDBC是用于执行SQL语句的Java API(Java语言通过JDBC可以操作数据库)
JDBC的由来:
jdbc的好处;
建立与数据库的连接。
向数据库发起查询请求。
处理数据库返回结果。
JDBC的快速入门:
步骤:
1.注册驱动
2.获取连接
3.创建SQL执行平台
4.执行SQL语句
5.处理结果
6.释放资源
代码演示:
package com.luliang.JDBC;
import org.junit.Test;
import java.sql.*;
public class Demo01 {
@Test
public void select() throws Exception {
//1.注册驱动
/*
1. 注册驱动
任意数据库的类都是java.sql.Driver的实现类,要注册的也是接口的实现类
记住:MySql的驱动类名是:com.mysql.jdbc.Driver
如何注册:
不推荐的方式:DriverManager.registerDriver(new com.mysql.jdbc.Driver());有问题:
注册了2次
硬编码问题
推荐的方式:Class.forName("com.mysql.jdbc.Driver"); 把指定名称的类加载到JVM内存中
本质是使用了反射技术
*/
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接
/*
2.获取连接
连接对象:java.sql.Connection
如何获取连接对象:
DriverManager.getConnection(url, username, password)
url:数据库连接地址。JDBC规定了url的写法 由三部分组成,三部分之间使用英文冒号连接
第一部分:协议名,固定值jdbc
第二部分:子协议,通常是数据库的类型,比如:MySql的写法是mysql
第三部分:数据库的具体地址,由数据库厂商自行决定的,不同数据库的写法不同。MySql的写法:
//数据库的ip:数据库的端口/database的名称 比如://192.168.18.18:3306/heima63
连接本机、默认端口的MySql,可以简写成:///heima63
username:数据库的登录名
password:数据库的密码
*/
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/lu", "root", "root");
//3.创建SQL执行平台
/*
3.创建SQL执行平台
SQL执行平台:是JDBC规范提供了,专门用来执行SQL语句的一个对象 java.sql.Statement
获取的方式:connection.createStatement()
*/
Statement statement = connection.createStatement();
//4.执行SQL语句
/*
执行SQL语句
执行DQL语句:statement.executeQuery(sql),返回:ResultSet,查询的结果集
DQL:查询数据
1.查询所有的数据:select*from 表明
2.查询指定的列:select 字段1,字段2,..from 表名;
3.查询处理null值:select if null (字段,默认值) from 表名;
4.查询并计算:select 字段1+字段2,.....from 表面;
执行DML语句:statement.executeUpdate(sql),返回:int,表示影响的行数
执行任意语句:statement.execute(sql),返回:boolean, 如果执行的是查询,返回true;否则返回false
*/
ResultSet resultSet = statement.executeQuery("SELECT *FROM emp ");
//int resultSet = statement.executeUpdate("INSERT INTO student4(id,name,price) VALUES (NULL ,'luliang2',1000000)"); //返回值为:
//5.处理结果
while (resultSet.next()){
String name = resultSet.getString("name");
String gender = resultSet.getString("gender");
double salary = resultSet.getDouble("salary");
Date join_date = resultSet.getDate("join_date");
int dept_id = resultSet.getInt("dept_id");
System.out.println("姓名:"+name+", 工资:"+salary+", 年龄:"+join_date+", 学号:"+dept_id+",性别:"+gender);
}
//System.out.println("影响行数:" + resultSet);
//6.释放资源
//释放资源。顺序:ResultSet=>Statement=>Connection
resultSet.close();
statement.close();
connection.close();
}
}
next用法:
JDBC常用的API
Connection接口:
package com.luliang.lianxi;
import com.luliang.JDBCbao.JdbcUtils;
import com.luliang.JDBCbao.JdbcUtils1;
import java.sql.Connection;
import java.sql.Statement;
/*
面试题: 什么时候,需要把 setAtuoCommit设为 false?
答: 当有多个dml 同时执行,将其看做一个整体提交,则使用 事务管理 ,
则需要把 setAutoCommit 设为false;
*/
public class Demo05 {
public static void main(String[] args) throws Exception{
//1.加载驱动,获取连接
Connection connection = JdbcUtils1.getConnection();
//2.开启事务把事务设置不自动提交
connection.setAutoCommit(true);//设置这个不自动提交事务就是数据库的数据没有影响
//3.创建sql对象(Statement / PreparedStatement /CallableStatement)
Statement statement = connection.createStatement();
//4.通过statement向数据库发出sql命令
//对emp表进行操作: 把SMITH 的sal -10 给 KING sal+10
int i = statement.executeUpdate("UPDATE emp SET salary=salary+10000 WHERE NAME ='孙悟空'");
System.out.println("影响的行数:"+i);
//5.关闭资源
statement.close();
connection.close();
}
}
当有多个dml 同时执行,将其看做一个整体提交,则使用 事务管理 ,则需要把 setAutoCommit 设为false;
Statement接口和PreparedStatement的区别
后者的效率比前者高,在使用PreparedStatement对象执行SQL命令时,命令被数据库进行编译和解析,然后被放到命令缓冲区,然后,每当执行同一个PreparedStatement对象时,它就会被解析一次,但不会被再次编译。在缓冲区中可以返现预编译的命令,并且可以重新使用。如果insert、update、delete ,最好使用PreparedStatement,在有大量用户的企业级应用软件中,经常会重复执行相同的SQL命令,使用PreparedStatement对象带来的编译次数的减少能够提高数据库的总体性能。
ResuilSet接口:
说明:在默认的情况下,我们的rs结果集,只能向前移动,这样rs结果就不能复用,如果希望复用,则可以这样做:
package com.luliang.lianxi;
import com.luliang.JDBCbao.JdbcUtils1;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
/*
ResultSet 的可选项有:
resultSetType - 结果集类型,
它是 ResultSet.TYPE_FORWARD_ONLY、
ResultSet.TYPE_SCROLL_INSENSITIVE 或 ResultSet.TYPE_SCROLL_SENSITIVE 之一
resultSetConcurrency - 并发类型;
它是 ResultSet.CONCUR_READ_ONLY 或 ResultSet.CONCUR_UPDATABLE 之一
*/
public class Demo07 {
public static void main(String[] args) throws Exception{
//查询
//1.注册驱动,获取连接
Connection connection = JdbcUtils1.getConnection();
//2,创建SQL执行平台
Statement statement = connection.createStatement();
//执行SQL语句
//假设我们希望resultSet结果,可以滚动(可以向前,也可以向后)
ResultSet resultSet = statement.executeQuery("SELECT *FROM emp");
while (resultSet.next()){
System.out.println(resultSet.getString("name"));
}
System.out.println("---------------");
resultSet.beforeFirst();
while (resultSet.next()){
System.out.println(resultSet.getString("name"));
}
}
}
JDBC的增删改查:
增:代码演示
package com.luliang.lianxi;
import com.luliang.JDBCbao.JdbcUtils;
import com.luliang.JDBCbao.JdbcUtils1;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
//插入
public class Demo02 {
public static void main(String[] args) {
Connection connertion = null;
try {
connertion = JdbcUtils1.getConnection();
} catch (Exception e) {
e.printStackTrace();
}
//创建SQL执行的平台
Statement statement = null;
try {
statement = connertion.createStatement();
} catch (SQLException e) {
e.printStackTrace();
}
//执行SQL语句
//执行DML语句:statement.executeUpdate(sql),返回值:int,表示影响的行数
try {
int i = statement.executeUpdate("INSERT INTO product1(id,pname,price)VALUES (null,'陆良1',100000.00)");
System.out.println("处理结果:"+i);
} catch (SQLException e) {
e.printStackTrace();
}
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
connertion.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
删:代码演示
package com.luliang.lianxi;
import com.luliang.JDBCbao.JdbcUtils;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
//删除
public class Demo04 {
public static void main(String[] args) {
Connection connertion = JdbcUtils.getConnertion();
//创建SQL执行平台
Statement statement=null;
try {
statement = connertion.createStatement();
//执行SQL语句
// 执行DML语句:statement.executeUpdate(sql),返回值:int,表示影响的行数
int i = statement.executeUpdate("DELETE FROM product1 WHERE id=5");
//处理SQL语句
System.out.println("执行后的结果:"+i);
//关闭资源流
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}finally {
try {
connertion.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
改:代码演示
package com.luliang.lianxi;
import com.luliang.JDBCbao.JdbcUtils;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
//修改
public class Demo03 {
public static void main(String[] args) {
Connection connertion = JdbcUtils.getConnertion();
Statement statement = null;
//创建SQL平台
try {
statement = connertion.createStatement();
//执行SQL语句
int i = statement.executeUpdate("UPDATE product1 SET price=price+10000 WHERE id=1 ");
System.out.println("执行影响后的:"+i);
} catch (SQLException e) {
e.printStackTrace();
}finally {
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
connertion.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
查:
package com.luliang.lianxi;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
//查询
public class Demo01 {
public static void main(String[] args) throws Exception{
//注册驱动
Class.forName("com.mysql.jdbc.Driver");
//获取连接
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/javaee","root","root");
//创建SQL执行平台
Statement statement = connection.createStatement();
//执行SQL语句
//执行DQL语句:statement.executeQuery(sql),返回值:ResultSet,是查询的结果集对象
ResultSet resultSet = statement.executeQuery("SELECT *FROM employee");
//处理结果
while (resultSet.next()){
System.out.println("id:"+resultSet.getInt("id")+
",姓名:"+resultSet.getString("name")+", 密码:"+resultSet.getString("PASSWORD")
);
}
//释放资源
resultSet.close();
statement.close();
connection.close();
}
}
JDBC的工具类封装:
==JDBC的事务管理==
事务管理相关的API
事务管理的方法,都是由Connection对象提供的:
开启事务:
connection.setAutoCommit(false)
提交事务:
connection.commit()
回滚事务:
connection.rollback()
事务管理的步骤:
try{
//1.注册驱动
//2.获取连接
//===开启事务=== 只要在执行SQL之前开启即可
//3.创建SQL执行平台
//4.执行SQL语句
//5.处理结果
//===关闭事务:提交事务=== 只要在释放资源之前,关闭事务即可
}catch(Exception e){
//===关闭事务:回滚事务===
}finally{
//6.释放资源
}
JDBC的实现登录案例:
分析:
1.使用数据库保存的用户的账号和密码
2.让用户输入账号和密码
3.使用SQL根据用户的账号和密码去数据库查询数据
4.如果查询到数据,说明登录失败。
代码演示:
package com.luliang.DengLu;
import com.luliang.JDBCbao.JdbcUtils1;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Scanner;
/*
1. 使用数据库保存用户的账号和密码
2. 让用户输入账号和密码
3. 使用SQL根据用户的账号和密码去数据库查询数据
4. 如果查询到数据,说明登录成功
5. 如果查询不到数据,说明登录失败
*/
public class Demo01 {
public static void main(String[] args) throws Exception{
//1.编写代码让用户输入
Scanner scanner = new Scanner(System.in);
System.out.println("请你输入用户名:");
String name = scanner.nextLine();
System.out.println("请你输入密码:");
String password=scanner.nextLine();
//2.使用SQL根据用户的账号和密码去数据库查询数据
//2.1注册驱动,获取连接
Connection connection = JdbcUtils1.getConnection();
//2.2创建SQL执行平台
Statement statement = connection.createStatement();
//2.3执行SQL语句
String resultSet1="SELECT *FROM user WHERE name='"+name+"' AND password='"+password+"'";
// 如果查询到数据,说明登录成功,如果查询不到数据,说明登录失败
ResultSet resultSet = statement.executeQuery(resultSet1);
//判断
if(resultSet.next()){
//能进来查询到了数据
String pname = resultSet.getString("name");
System.out.println("欢迎你登陆:"+pname);
}else {
//查询不到数据,说明登陆失败
System.out.println("账号密码错误....");
}
//关闭资源流
resultSet.close();
statement.close();
connection.close();
}
}