mysql学习,sql语句,jdbc,DBCP,c3p0相关配置(包括配置文件),工具类,测试类代码

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

模糊查询:比较运算符

运算符语法描述
NULLa is NULLa为空,则返回真
NOT NULLa is NOT NULLa不为空,则返回真
betweena between b and c在[b,c]中
Likea Like bSQL匹配,若a匹配b,则返回真
Ina 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

  1. 在工程下创建一个lib文件夹
  2. 将驱动复制到lib文件夹下
  3. 导入包[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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();

    }
}
  1. 加载驱动

    Class.forName("com.mysql.cj.jdbc.Driver");//固定写法
    //老版本可能是这样
    Class.forName("com.mysql.jdbc.Driver");//固定写法
    
  2. 设置用户信息

    //设置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;这行代码

  1. 连接成功就创建数据库的对象
  2. 创建sql的对象
  3. 写sql语句,让sql的对象去执行sql语句;
  4. 释放连接,从最近的开始释放

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&amp;characterEncoding=utf8&amp;useSSL=true&amp;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);
        }
    }
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值