- CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';
其中:
用户名:创建的用户名;
主机名:指定该用户在哪个主机上可以登录。若本地用户用localhost,若可从任意远程主机登录则可使用通配符%;
密码:该用户的登录密码,可以为空
用户在创建之后基本没有权限,需要授权:
- GRANT 权限1,权限2... ON 数据库名.表名 TO '用户名'@'主机名';
其中:
GRANT:授权关键字;
授予用户的权限:有SELECT(查看), INSERT(插入), UPDATE(修改)等。若授予全部权限使用ALL;
数据库名.表名:用户可操作哪个数据库的哪些表;全部的则用*
'用户名'@'主机名':给哪个用户授权。
- REVOKE 权限1,权限2... ON 数据库名.表名 TO '用户名'@'主机名';
其中:
GRANT:撤销授权关键字;其余含义与授权一致。
- SHOW GRANTS FOR '用户名'@'主机名';
- DROP USER '用户名'@'主机名';
需要使用MySQL自带的工具mysqladmin
mysqladmin -uroot -p password 新密码
#回车后输入老密码
注意:需要在未登录MySQL的情况下操作
另外这是在命令行中操作
- set password for '用户名'@'主机名' = password('新密码');
注意:1、需要登录MySQL的情况下操作;2、新密码要用引号括住
另外这是在命令行中操作
JDBC规范定义接口,数据库驱动由数据库厂商提供。
好处
JDBC会用到的包:java.sql、javax.sql、数据库驱动
JDBC四个核心对象
步骤:
add as library
,让模块关联jar包(选择model library,但智能在当前jar包中使用)- static void registerDriver(Driver driver); 向Driver driver注册指定驱动程序
两种注册方式:
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
不足:
1、硬编码,后期不易于程序扩展和维护
2、驱动被注册两次
3、更换驱动类的时候不好更换,需要修改源代码
Class.forName("com.mysql.jdbc.Driver");
特点:
1、使用forName()方法加载,走Driver类的静态代码块
2、驱动仅注册一次
3、虽然在JDK1.5后可以省略该语句,但是建议不省略,以防不兼容问题
- static Connection getConnection(String url, String user, String password); //连接到给定数据库URL并返回连接
其中:
String url:连接数据库的URL,格式为`协议名:自协议://服务器名或IP地址:端口号/数据库名?参数=参数值`,比如`jdbc:mysql://localhost:3306/test`
String user:数据库的账号
String password:数据库的密码
注意:
1、如果数据出现乱码需加上参数
?characterEncoding=utf8
;2、Connection实现类对象导包时要导sun公司的包
java.sql.Connection
接口中获得statement对象:
- Statement createStatement();
创建一个Statement对象来将SQL语句发送到数据库
Statement的方法:
- boolean execute(String sql);执行任意SQL语句。
返回值表示是否有返回ResultSet结果集。仅当执行select语句且有返回结果时返回true,其它语句返回false
2. 执行增删改SQL语句的方法:
- int executeUpdate(String sql);
根据执行的DML(INSERT、UPDATE、DELETE)语句,返回受影响的行数
- void close(); 关闭并释放资源
Q:statement对象使用完之后需要关闭,为何?它关闭了什么?
A:因为statement对象会占用数据库连接个数,而该连接数的数量是有限的,需要关闭该对象与数据库的连接,释放该连接数。
ResultSet
(结果集)用于保存执行查询SQL语句的结果。只能一行行取出,不能一次性取出所有数据。
执行查询SQL语句的方法
- ResultSet executeWQuery(String sql);
根据查询语句返回结果集,只能执行SELECT语句
ResultSet
需要使用到的方法:
- boolean next(); 将结果集的指针从当前位置下移一个单元,如可移动返回true,否则false
- xxx getXxx(String columnLabel);通过字段名获得对应的数据(columnLabel列名)
- xxx getXxx(int columnIndex);通过字段序号获得对应的数据(columnIndex列序号)
其中xxx指数据类型,有boolean、byte、short、long、float、double、String等
注意:ResultSet使用完毕后必须要关流
JDBC对单表数据增删改查步骤
需求:对单表数据增删改及查询操作
public class Notes01 {
public static void main(String[] args) throws Exception {
//加载驱动
Class.forName("com.mysql.jdbc.Driver");
//获取连接
String url = "jdbc:mysql:///test";
String user = "root";
String password = "root";
Connection connection = DriverManager.getConnection(url, user, password);
//获得sql运输器
Statement st = connection.createStatement();
//创建新表的SQL语句
String sql1 = "create table student(id int primary key,name varchar(10))";
boolean bo = st.execute(sql1);
System.out.println("sql1语句执行后返回值=" + bo);
//对数据库的表添加数据:
String sql2 = "insert into student(name) values('小明','小黄')";
int num2 = st.executeUpdate(sql2);
System.out.println("影响的行数:" + num2);
//对数据库的表删除数据
String sql3 = "delete from student where name = '小明'";
int num3 = st.executeUpdate(sql3);
System.out.println("影响的行数:" + num3);
//更新表中的数据
String sql4 = "update student set name = '小明' where name = '小黄'";
int num4 = st.executeUpdate(sql4);
System.out.println("影响的行数:" + num4);
//查询表中数据并返回
String sql5 = "select * from student;";
//获得结果集
ResultSet rs = st.executeQuery(sql5);
while (rs.next()) {
//取出数据
int id = rs.getInt("id");
String name = rs.getString("name");
System.out.println(id + "=" + name);
}
//关闭资源,先开后关,后开先关
rs.close();
st.close();
connection.close();
}
}
/*
自定义JDBC工具类
*/
public class JDBCUtils {
/*
之后会从配置文件读取信息,现在先用常量表示
*/
public static final String DRIVERCLASS = "com.mysql.jdbc.Driver";
public static final String URL = "jdbc:mysql:///test";
public static final String USER = "root";
public static final String PASSWORD = "root";
/*
由于每个人获取连接时都要加载驱动类,但驱动类只要加载一次便可,故使用静态代码块
*/
static {
try {
Class.forName(DRIVERCLASS);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//获取连接
public static Connection getConnection() {
Connection connection = null;
try {
connection = DriverManager.getConnection(URL, USER, PASSWORD);
return connection;
} catch (SQLException e) {
e.printStackTrace();
}
return connection;
}
//获取Statement
public static Statement getStatement(Connection connection) {
Statement statement = null;
try {
statement = connection.createStatement();
return statement;
} catch (SQLException e) {
e.printStackTrace();
}
return statement;
}
//释放资源
public static void close(ResultSet rs , Statement st , Connection con) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (st != null) {
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (con != null) {
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
Connection
接口中与事务有关的方法- void setAutoCommit(boolean autoCommit) throws SQLException;
false:开启事务,true:关闭事务
- void commit() throws SQLException; 提交事务
- void rollback() throws SQLException; 回滚事务
public class Notes02 {
public static void main(String[] args) throws SQLException {
Connection con = null;
try {
//获取连接
Class.forName("com.mysql.jdbc.Driver");
con= DriverManager.getConnection("jdbc:mysql:///test","root","root");
//开启事务
con.setAutoCommit(false);
//获得sql运输器
Statement st = con.createStatement();
//执行事务
String sql1 = "update account set money = money+500 where name ='小明';";
String sql2 = "update account set money = money-500 where name ='小黄';";
//提交语句
st.executeUpdate(sql1);
st.executeUpdate(sql2);
System.out.println("已成功执行事务");
} catch (Exception e) {
System.out.println("事务执行失败");
con.rollback();
}
}
}