MySQL学习
1.命令行连接
create database school(数据库名称); -- 创建一个数据库
show databases; -- 查看所有数据库
use school; -- 切换数据库 use 数据库名
show tables; -- 展示数据库中所有的表;
describe student; -- 查看数据库表中的所有信息,describe 表名
-- 单行注释
/*
多行注释;
1
2
*/
2. 操作数据库
2.1操作数据库
1、创建数据库
CREATE DATABASE [IF NOT EXISTS] school; --[]中可选;如果数据库中没有school,则创建该数据库
2、删除数据库
DROP DATABASE [IF EXISTS] test1;
3、使用数据库
-- tab键上面,如果你的表名或者字段名是一个特殊字符,要加上``
USE `school`;
2.2创建数据库表
-- 创建一个学生表(student)。
-- 有学号id,姓名name。登陆密码pwd。性别sex,出生日期birthday,家庭住址address
-- 使用英文(),表名和字段名尽量使用``括起来
CREATE TABLE IF NOT EXISTS `student`(
`id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
`name` VARCHAR(10) NOT NULL DEFAULT '匿名' COMMENT '姓名',
`pwd` VARCHAR(20) NOT null DEFAULT '123456' comment '登陆密码',
`sex` varchar(10) not null default '男' comment '性别',
`birthday` datetime DEFAULT NULL COMMENT '生日',
`address` VARCHAR(100) DEFAULT NULL COMMENT '家庭住址',
PRIMARY KEY(id)
)ENGINE=INNODB DEFAULT CHARSET=utf8
格式
CREATE TABLE [IF NOT EXISTS] `表名`(
`字段名` 列类型 [属性][索引][注释],
`字段名` 列类型 [属性][索引][注释],
`字段名` 列类型 [属性][索引][注释],
......
`字段名` 列类型 [属性][索引][注释],
)[表类型][字符集设置][注释]
show create database school; -- 查看创建数据库的语句
show create table student; -- 查看创建表的语句
DESC student; -- 查看表的结构
2.3修改数据库表
修改
-- 修改表名 ALTER TABLE 旧表名 RENAME AS 新表名
ALTER TABLE teacher RENAME AS teacher1;
-- 增加表的字段 ALTER TABLE 表名 ADD `字段名` 列属性
ALTER TABLE teacher1 ADD `age` INT(2);
-- 修改表的字段(重命名,修改约束)
-- ALTER TABLE 表名 MODIFY 字段名 新的列约束
-- ALTER TABLE 表名 CHANGE 旧字段名 新字段名 新的约束
ALTER TABLE teacher1 MODIFY age VARCHAR(3); -- 修改约束
ALTER TABLE teacher1 CHANGE age age1 VARCHAR(4); -- 字段重命名
-- 删除表的字段 ALTER TABLE 表名 DROP 字段名
ALTER TABLE teacher1 DROP age1;
删除
-- 删除表,如果表存在再删除 DROP TABLE [IF EXISTS] 表名
DROP TABLE if EXISTS teacher1;
3.MySQL数据管理
3.1DML语言
增加 INSERT
删除
修改
3.2添加
-- 语法 INSERT INTO `表名`([字段1,字段2,字段3....]) VALUES ('值1'),('值2'),....
-- 往表中插入一个数据
INSERT INTO `student`(`name`,`pwd`) VALUES ('李四','aaaaa')
-- 往表中插入多个数据
INSERT INTO `student`(`name`,`pwd`,`birthday`,`sex`)
VALUES('李四','bbbbas','2001-01-21 19:42:35','女'),('王五','b151231','2010-10-21 19:42:35','男')
-- 如果省略字段名,就要一一对应
INSERT INTO `student` VALUES('19','王麻子','basda','女','1995-09-22 10:28:14','湖北工业')
- 要插入的数据要用’'括住
- 字段和字段之间使用英文,隔开
3.3修改
-- 语法 UPDATE 表名 SET 字段1 = 新值,字段2=新值,..... [WHERE 条件]
UPDATE `student` SET `name`='肖天凤' WHERE `id` = 1;
-- 如果不加条件,会全部更改
UPDATE `student` SET `name`='长江7号' ;
-- 可以一次修改多个值,通过,隔开
UPDATE `student` SET `name`='肖天凤',`sex`='女',`address`='司马脸' WHERE `id` = 4;
-- 设置多个条件
UPDATE `student` SET `name`='肖天凤' WHERE `id`=2 AND `sex`='女'
条件
操作符 | 含义 | 范围 | 结果 |
---|---|---|---|
= | 等于 | ||
<>或!= | 不等于 | ||
> | |||
< | |||
>= | |||
<= | |||
BETWEEN … AND … | 在某个范围里内 | [] | |
AND | && | ||
OR | || |
3.4删除
-- DELETE删除语法 DELETE FROM 表名 WHERE 条件,即删除满足该条件的行
DELETE FROM `student` WHERE id=10
-- 不写条件就删除所有的数据(不建议)不影响自增
DELETE FROM `teacher`
-- 删除所有数据。自增归0
TRUNCATE TABLE `teacher`
4.DQL语句(最重要)
4.1查询语句
-- 查询全部的学生 语法 SELECT 字段1,字段2,字段3,......(全部则为*) FROM 表名
SELECT * FROM `student`
-- 查询指定字段
SELECT `Sno`,`Sname` FROM `student`
-- 取别名,AS关键字 SELECT FROM 字段 [AS 别名] FROM 表名[AS 别名] 可以给字段起别名,也可以给表起别名
SELECT `Sno` AS 学号,`Sname` AS 姓名 FROM `student` AS s
-- 函数 CONCAT(a,b)
SELECT CONCAT('姓名:',`Sname`) AS 新名字 FROM `student`
4.2查询结果去重 distinct
-- 查询哪些同学参加了考试,去重操作 DISTINCT关键字
-- 查询全部的考试成绩
SELECT * FROM `sc`
-- 查询有哪些同学参加了考试
SELECT `Sno` AS 学号 FROM `sc`
-- 发现重复数据,去重
SELECT DISTINCT `Sno` AS 学号 FROM `sc`
4.3where条件子句
逻辑运算符
运算符 | 语法 | 描述 |
---|---|---|
AND && | a AND b a&&b | 逻辑与,两个为真,结果为真 |
OR || | a OR b a||b | 逻辑或,一个为真即为真 |
NOT ! | NOT a !a | 逻辑非,真为假,假为真 |
SELECT `Sno`,`grade` FROM `sc`
-- 查询成绩在80到90之间的
-- AND &&
SELECT `Sno`,`grade` FROM `sc` WHERE grade>=80 AND grade<=90
SELECT `Sno`,`grade` FROM `sc` WHERE grade>=80 && grade<=90
-- 模糊查询(区间) BETWEEN
SELECT `Sno`,`grade` FROM `sc` WHERE grade BETWEEN 80 AND 95
-- 查询成绩小于70分或者大于90分的
-- OR
SELECT `Sno`,`grade` FROM `sc` WHERE grade<=70 OR grade>=90
-- 查询学号不是9512101的所有成绩
SELECT `Sno`,`grade` FROM `sc` WHERE NOT Sno=9512101
模糊查询:比较运算符
运算符 | 语法 | 描述 |
---|---|---|
NULL | a is NULL | a为空,则返回真 |
NOT NULL | a is NOT NULL | a不为空,则返回真 |
between | a between b and c | 在[b,c]中 |
Like | a Like b | SQL匹配,若a匹配b,则返回真 |
In | a in (a1,a2,a3,…) | 假设a在a1,或者a2,或者a3…中则返回真 |
-- 查询姓刘的同学
-- like 结合%(代表0到任意个字符) _(代表一个字符)
SELECT `Sno`,`Sname` FROM `student` WHERE Sname LIKE '王%'
-- 查询王姓同学,后面只有一个字
SELECT `Sno`,`Sname` FROM `student` WHERE Sname LIKE '王_'
-- 查询王姓同学,后面只有两个字
SELECT `Sno`,`Sname` FROM `student` WHERE Sname LIKE '王__'
-- 查询名字中间有小字的同学
SELECT `Sno`,`Sname` FROM `student` WHERE Sname LIKE '%小%'
-- IN(具体的一个值到多个值)
SELECT `Sno`,`Sname` FROM `student` WHERE age IN (19,20)
4.4联表查询
-- 联表查询
-- 语法
/*
SELECT 要查询的字段
FROM 来自哪张表 别名a
通过连接(RIGHT JOIN,LEFT JOIN,INNER JOIN) 要连接的表 别名b
ON 两个表中相等的地方(eg:a.c=b.c)
可以接着连接多个表,只要找出想等条件
*/
SELECT sb.Sno,Sname,Cname,grade
FROM student s
RIGHT JOIN sc sb
ON s.Sno=sb.Sno
INNER JOIN course c
ON sb.Cno=c.Cno
4.5分页和排序
排序
-- 排序
/*
升序:ASC 降序:DESC
语法:ORDER BY 通过什么排,怎么排
*/
SELECT sb.Sno,Sname,Cname,grade
FROM student s
RIGHT JOIN sc sb
ON s.Sno=sb.Sno
INNER JOIN course c
ON sb.Cno=c.Cno
WHERE Cname='高等数学'
ORDER BY grade DESC
分页
/*
分页
语法:LIMIT 起始值,页面大小
*/
SELECT sb.Sno,Sname,Cname,grade
FROM student s
RIGHT JOIN sc sb
ON s.Sno=sb.Sno
INNER JOIN course c
ON sb.Cno=c.Cno
ORDER BY grade DESC
LIMIT 0,5
4.6子查询
WHERE(嵌套一个子条件)
4.7分组和过滤
-- 分组和过滤
-- 语法:
-- GROUP BY 字段名(通过什么分组)
-- HAVING 过滤条件
5.MySQL函数
5.1聚合函数
函数名 | 描述 |
---|---|
COUNT() | 计数 |
SUM() | 求和 |
AVG() | 平均值 |
Min() | 最小值 |
Max() | 最大值 |
5.2MD5加密
CREATE TABLE testMD5(
id INT(4) NOT NULL,
pwd VARCHAR(100) NOT NULL,
`name` VARCHAR(50) NOT NULL,
PRIMARY KEY(id)
)ENGINE=INNODB DEFAULT CHARSET=utf8
INSERT INTO testMD5 VALUES(1,'123456','zhangsan'),(2,'123456','lisi'),(3,'123456','wangwu')
INSERT INTO testMD5 VALUES(4,MD5('123456'),'wangmazi')
6、JDBC
6.1、数据库驱动
mysql-connector-java-8.0.22.zip
- 在工程下创建一个lib文件夹
- 将驱动复制到lib文件夹下
- 导入包[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DJjCc3rt-1625107130024)(C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\image-20210630160800171.png)]
6.2、第一个JDBC程序
package com.yyds.test;
import java.sql.*;
public class Demo {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//1.加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");//固定写法
//2.用户信息和url
String url = "jdbc:mysql://localhost:3306/school?useUnicode=true&characterEncoding=utf8&useSSL=true" +
"&serverTimezone=GMT%2B8";
String username = "root";
String password = "123456";
//3.连接成功,创建数据库对象 Connection代表数据库
Connection cont = DriverManager.getConnection(url, username, password);
//4.执行sql的对象 Statement 执行sql的对象
Statement st = cont.createStatement();
//5.执行sql的对象 去 执行sql,可能存在结果,查看结果
String sql = "SELECT * FROM student";
ResultSet rs = st.executeQuery(sql);//执行这条sql,返回一个结果集rs,封装了我们全部查询出来的结果
while (rs.next()){
System.out.println("id="+rs.getObject("Sno"));
System.out.println("name="+rs.getObject("Sname"));
System.out.println("sex="+rs.getObject("sex"));
System.out.println("age="+rs.getObject("age"));
System.out.println("dept="+rs.getObject("dept"));
System.out.println("=====================================");
}
//6.释放连接
rs.close();
st.close();
cont.close();
}
}
-
加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");//固定写法 //老版本可能是这样 Class.forName("com.mysql.jdbc.Driver");//固定写法
-
设置用户信息
//设置url,固定格式,useUnicode=true 可以使用中文;characterEncoding=utf8 使用utf8编码集;useSSL=true 使用安全 //连接;serverTimezone=GMT%2B8 String url = "jdbc:mysql://localhost:3306/school?useUnicode=true&characterEncoding=utf8&useSSL=true &serverTimezone=GMT%2B8"; String username = "root";//设置登录账号 String password = "123456";//设置登录密码
报这种错误是系统时间错误,就需要在url后面加上serverTimezone=GMT%2B8;这行代码
- 连接成功就创建数据库的对象
- 创建sql的对象
- 写sql语句,让sql的对象去执行sql语句;
- 释放连接,从最近的开始释放
6.3、JDBC中的对象解释
URL
String url = "jdbc:mysql://localhost:3306/school?useUnicode=true&characterEncoding=utf8&useSSL=true &serverTimezone=GMT%2B8";
//mysql -- 3306
//协议://主机地址:端口号/数据库名?参数1&参数2&参数3.....
Statement执行sql对象
statement.execute();//可以执行所有的sql,速度较慢
statement.executeQuery();//执行查询操作,返回ResultSet
statement.executeUpdate();//执行插入,修改,删除操作,返回一个受影响的行数
ResultSet b把返回值封装成一个结果集
//获取指定类型
resultSet.getObject();//不知道返回值类型时使用
//知道返回值类型时
resultSet.getString();
resultSet.getInt();
resultSet.getFloat();
resultSet.getDouble();
resultSet.getDate();
//遍历
resultSet.next();//移动到下一行
resultSet.previous();//移动到上一行
resultSet.beforeFirst();//移动到第一行
resultSet.afterLast();//移动到最后一行
resultSet.absolute(int row);//移动到指定行
6.4、防止SQL注入,使用PreparedStatement对象
Connection conn = DriverManager.getConnection(url, username, password);
//先写SQL语句,条件用?表示
String sql = "SELECT * FROM `student` WHERE `Sname`=? AND `sex`=?";
//申请preparedStatement对象,执行sql语句预执行
PreparedStatement st = conn.prepareStatement(sql);
//给?赋值,第一个参数是角标,即第几个?,第二个参数是要给他赋的值是什么类型就用对应的set
st.setString(1,"李勇");
st.setString(2,"男");
//执行sql语句,返回结果
ResultSet rs = st.executeQuery();
6.5、数据库连接池
1、池化技术
准备一些预先的资源,过来就连接预先准备好的
开源数据源
DBCP,C3P0
需要的jar包下载地址DBCP,c3p0连接池所需要的包-MySQL文档类资源-CSDN下载
2、DBCP连接池
需要用到的jar包
commons-dbcp2-2.8.0
下载地址DBCP – Download Apache Commons DBCP
commons-pool2-2.10.0
下载地址Pool – Download Apache Commons Pool
注意:当使用MySQL8.0时,需要导入5个jar包,除了上面两个还需要加入以下两个包
commons-collections4-4.4
下载地址:Collections – Download Apache Commons Collections
commons-logging-1.2
下载地址:
配置文件dbcpconfig.properties
#连接设置
#MySQL8.0以上的版本要写成 com.mysql.cj.jdbc.Driver
driverClassName=com.mysql.jdbc.Driver
#这里的?写自己要连接的数据库
url=jdbc:mysql://localhost:3306/?
#输入自己的账号的密码
username=root
password=root
#<!-- 初始化连接 -->
initialSize=10
#最大连接数量
maxActive=50
#<!-- 最大空闲连接 -->
maxIdle=20
#<!-- 最小空闲连接 -->
minIdle=5
#<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 -->
maxWait=60000
#JDBC驱动建立连接时附带的连接属性属性的格式必须为这样:[属性名=property;]
#注意:"user" 与 "password" 两个属性会被明确地传递,因此这里不需要包含他们。8.0以上版本要加入一条serverTimezone=UTC
connectionProperties=useUnicode=true;characterEncoding=utf8;useSSL=true
#指定由连接池所创建的连接的自动提交(auto-commit)状态。
defaultAutoCommit=true
#driver default 指定由连接池所创建的连接的事务级别(TransactionIsolation)。
#可用值为下列之一:(详情可见javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE
defaultTransactionIsolation=READ_UNCOMMITTED
方法类编写
import org.apache.commons.dbcp2.BasicDataSourceFactory;
import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
public class Utils_DBCP {
private static DataSource dataSource = null;
static {
try {
InputStream in =Utils_DBCP.class.getClassLoader().getResourceAsStream("dbcpconfig.properties");
Properties properties = new Properties();
properties.load(in);
//创建数据源 工厂模式 -->创建
dataSource = BasicDataSourceFactory.createDataSource(properties);
} catch (Exception e) {
e.printStackTrace();
}
}
//获取连接
public static Connection getConnection() throws SQLException {
return dataSource.getConnection();//从数据源中获取连接
}
//释放连接
public static void release(Connection conn,PreparedStatement st,ResultSet rs) throws SQLException {
try {
if(rs!=null){
rs.close();
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
try {
if(st!=null){
st.close();
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
try {
if(conn!=null){
conn.close();
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
测试类编写
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class Demo {
public static void main(String[] args) throws SQLException {
Connection conn = null;
PreparedStatement st = null;
try {
conn = Utils_DBCP.getConnection();
String sql = "insert into student(Sno,Sname,`sex`,`age`,`dept`) value (?,?,?,?,?)";
st = conn.prepareStatement(sql);
st.setString(1,"1234567");
st.setString(2,"王麻子");
st.setString(3,"女");
st.setInt(4, 21);
st.setString(5,"软件工程");
int i = st.executeUpdate();
if(i>0){
System.out.println("插入成功了");
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
Utils_DBCP.release(conn,st,null);
}
}
}
3、c3p0连接池
需要的java包
c3p0-0.9.2 mchange-commons-java-0.2.3
配置文件编写
<?xml version="1.0" encoding="UTF-8" ?>
<c3p0-config>
//默认的配置
<default-config>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/school?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=UTC</property>
<property name="driverClass">com.mysql.cj.jdbc.Driver</property>
<property name="user">root</property>
<property name="password">123456</property>
<property name="acquireIncrement">3</property>
<property name="initialPoolSize">10</property>
<property name="minPoolSize">2</property>
<property name="maxPoolSize">10</property>
</default-config>
</c3p0-config>
工具类编写
import com.mchange.v2.c3p0.ComboPooledDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class Utils_c3p0 {
private static DataSource dataSource = null;
static {
try {
//xml文件不需要读取,直接加载,如果配置文件自己命名了括号里面就写自己命名的配置,不写就使用默认配置
dataSource = new ComboPooledDataSource();
} catch (Exception e) {
e.printStackTrace();
}
}
//获取连接
public static Connection getConnection() throws SQLException {
return dataSource.getConnection();//从数据源中获取连接
}
//释放连接
public static void release(Connection conn, PreparedStatement st, ResultSet rs) throws SQLException {
try {
if(rs!=null){
rs.close();
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
try {
if(st!=null){
st.close();
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
try {
if(conn!=null){
conn.close();
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
测试类
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class Demo_c3p0 {
public static void main(String[] args) throws SQLException {
Connection conn = null;
PreparedStatement st = null;
try {
conn = Utils_c3p0.getConnection();
String sql = "insert into student(Sno,Sname,`sex`,`age`,`dept`) value (?,?,?,?,?)";
st = conn.prepareStatement(sql);
st.setString(1,"12345678");
st.setString(2,"王麻子");
st.setString(3,"女");
st.setInt(4, 21);
st.setString(5,"软件工程");
int i = st.executeUpdate();
if(i>0){
System.out.println("插入成功了");
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
Utils_DBCP.release(conn,st,null);
}
}
}
public static void main(String[] args) throws SQLException {
Connection conn = null;
PreparedStatement st = null;
try {
conn = Utils_c3p0.getConnection();
String sql = "insert into student(Sno,Sname,`sex`,`age`,`dept`) value (?,?,?,?,?)";
st = conn.prepareStatement(sql);
st.setString(1,"12345678");
st.setString(2,"王麻子");
st.setString(3,"女");
st.setInt(4, 21);
st.setString(5,"软件工程");
int i = st.executeUpdate();
if(i>0){
System.out.println("插入成功了");
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
Utils_DBCP.release(conn,st,null);
}
}
}