java_mysql

27 篇文章 0 订阅

1.介绍 

        关系型数据库:(SQL)

                MySQL ,Oracle ,Sql Server,DB2,SQLLite

                通过表和表之间,行和列之间的关系进行数据的储存,学院信息表,考勤表……

        非关系型数据库:(NoSQL) Not Only

                Redis,MongDB

                非关系型数据库,对象储存,通过对象自身属性来决定。

        DBMS(数据库管理系统)

                 数据库管理软件,科学有效的管理数据,维护和获取 

2.基本命令 

  连接数据库

mysql -u root -p*****(密码,没空格)

 修改密码:

updata mysql.user set authentication_string=password('123456') where user='root' and Host = 'localhost';

刷新权限:

flush privileges

查看所有数据库

show databases

切换数据库:

use 数据库

查看数据库中的表

show tables

查看表中数据

describe 表名 

创建数据库

create database 表名

数据库语言有以下几种:

  • DDL 定义
  • DML 操作
  • DQL 查询
  • DCL 控制 

3,操作数据库

创建数据库---如果没有就创建

create databases if not exists 数据库名

删除数据库

drop database if exists gao;

创建表

 create table Gao(
         ID char(4) primary key, --这里的主键设置不要在后面写
         NAME char(4) not null

)charset=utf8;                        --设置编码格式

删除表

drop table if exists 表名;

显示表的结构

desc 表名;

修改表名

alter table 旧表名 rename as 新表命;

增加表的字段

alter table 旧表名 add 新表名 int(4);

修改表的字段

alter table 表名 modify 字段名 需要修改的约束/类型; --修改约束

alter table 表名 change 旧字段名 新字段名 字段类型;  --字段重命名

 删除表的字段名

alter table 表名 drop 字段名

4.数据类型

数据

  • tinyint 十分小的数据 1个字节
  • smallint 较小的数据 2个字节
  • mediumint 中等大小的数据 3个字节
  • int  标准整数 4个字节
  • bigint 较大的数据 8个字节
  • float 浮点数 4个字节
  • double 浮点数 8个字节
  • decimal 字符串形式的浮点数 金融计算的时候 使用

字符串

  • char 字符串固定大小的 0~255
  • varchar 可变字符串 0~65535  常用的变量 String
  • tinytext 微型文本 2^8-1
  • text 文本串 2^16-1 保存大文本

时间日期

  • data YYYY-MM-DD,日期格式
  • time HH:mm:ss 时间格式
  • datatime YYYY:MM-DD HH:mm:ss 最常用时间格式
  • timestamp 时间戳 1970.1.1 到现在的毫秒数
  • year 年份表示

null

  • 没有值,未知
  • NULL进行运算结果为NULL

5 数据管理

        5.1 DML语言(数据操作语言)

                5.1.1 插入

1.values 后可以有多个值用逗号隔开;

2.如字段名是键值,则键值不能重复;

3.字段名可以省略,直接写插入值

4.注意字段名/表名不能和关键字相同,可以用单引号区分

insert into 表名 ([字段名1,字段名2,字段名3……]) values('值1',‘值2’);

                5.1.2 修改

update 表名 set '字段名' = '修改值'  where 条件

                5.1.3删除

delete from '表名' where 条件

truncate 表名

                5.1.4 查询

          去掉重复

  select distinct 字段名 from 表名

          连表查询

 分页显示:

limit 起始页,页面大小 --(几条数据)

5.2 MD5 数据加密

        不可逆

update 表名 set 字段名 = (字段名) where id=1;--后面的是条件

6 事务

        6.1 事务介绍

原子性:

        要么一起成功,要么一起失败

一致性:

        事务前后的数据完整性要保证一致;

持久性:

        事务一旦提交则不可逆,被持久化到数据库中

隔离性:

        事务的隔离性是多个用户并发访问数据库时,数据库为每个用户开启的事务,不能被其他事务的操作数所干扰,事务之间要相互隔离;

不隔离所导致的问题

脏读:

        一个事务读取了另外一个事务未提交的数据

不可重复读:

        在一个事务内读取表中的某行数据,多次读取结果不同,(不一定时错误,只是某些场合不对)

虚读(幻读):

是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致

6.2 事务的操作

mysql 是默认开启事务自动提交的

set autocommit = 0  --关闭自动提交

set autocommit = 1 --开启自动提交

手动处理事务

start transaction --一个事务开始,从这里之后的sql都在同一个事务内

手动提交

commit;

回滚

rollback; 事务出现错误,回滚会回到原来样子;

 设置保存点名(可有可无)

savepoint  保存点名字;

rollback to save 保存点名; --回滚到指定保存点

6.3 索引

        6.3.1 索引介绍

                索引(Index)是帮助MySQL高效获取数据的数据结构;

        6.3.2 索引的分类

  • 主键索引 (primary key)

                唯一标识,主键不可重复,只能有一个列作为主键

  • 唯一索引 (unique key)

                避免重复的列出现,可以重复,多个列都可标记为唯一索引

  • 常规索引 (key/index)

                默认的,index,key 关键字设置

  • 全文索引 (FullText)

                在特定的数据库引擎下才有,MylSAM

                快速定位数据

6.3.3 索引的使用

创建表时添加索引:

show index from 表名; --显示所有的索引信息

6.3.4 索引规则

  • 索引不是越多越好
  • 不要对进程变动数据加索引
  • 小数据量的表不加索引(500万上)
  • 索引一般加在常用来查询的字段上 

索引数据结构:

        Hash 类型的索引

        Btree : innoDB的默认数据结构

7.权限管理和备份

导出:mysqldump

mysqldump -h 主机 -u 用户名 -p 密码 数据库 表名 > 物理磁盘位置

导入:source

mysql -u用户名 -p 密码 库名 < 备份文件

8.JDBC

8.1.JDBC介绍

网盘下载JDBC,驱动 5.7.1

 提取码:tr8b

项目里创建文件lib,将JDBC驱动放到里面然后,右键add as library,然后点ok

package text;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class JdbcFirst {
    public static void main(String[] args) throws Exception {
        //加载驱动
        Class.forName("com.mysql.jdbc.Driver");
        // url
        /*
        * jdbc:mysql 数据库
        * 主机地址
        * 端口号
        * 数据库名
        * 参数useUnicode
        *    characterEncoding 字符集
        *    useSSL 加密方式
        * */
        String url = "jdbc:mysql://localhost:3306/gao?useUnicode=true&characterEncoding=utf8&useSSL=true";

        //用户信息
        String username = "root";
        String password = "密码";

        //连接成功,数据库对象 Connection 代表数据库
        Connection connection = DriverManager.getConnection(url,username,password);

        //Statement执行SQL的对象 PrepareStatement 执行sql对象
        Statement statement = connection.createStatement();

        //执行SQL的对象 去执行SQL,
        String sql = "select * from test1";

        //返回结果
        ResultSet resultSet = statement.executeQuery(sql);
        while (resultSet.next()){
            System.out.println("id" +" " + resultSet.getObject("id"));
            System.out.println("name" +" " + resultSet.getObject("name"));
            System.out.println("zi" +" " + resultSet.getObject("zijin"));
            System.out.println("=============================================");
        }

        //释放连接
        resultSet.close();
        statement.close();
        connection.close();
    }
}

8.2 statement对象

jdbc中的statement对象用向数据库发送SQL语句,像完成对数据库的增删改查,只需要通过这个对象向数据库发送增删改查

增删改 使用:Statement.executeUpdate()

查 使用:Statement.executeQuery();

8.3 工具类

src下的目录都可以通过反射拿到

在src目录下的创建file文件------db.properties

 配置文件

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/gao?useUnicode=true&characterEncoding=utf8&useSSL=true
username=root
password=Aaqwe123

工具类(通过反射获取配置文件信息)

package utils;

import java.io.InputStream;
import java.sql.*;
import java.util.Properties;

public class JdbcUtils {
    private static String driver = null;
    private static String url = null;
    private static String username= null;
    private static String password = null;

    static {
        try{
            InputStream in = JdbcUtils.class.getClassLoader().getResourceAsStream("db.properties");
            Properties properties =new Properties();
            properties.load(in);
            driver = properties.getProperty("driver");
            url = properties.getProperty("url");
            username = properties.getProperty("username");
            password = properties.getProperty("password");
            Class.forName(driver);
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    //获取连接
    public static Connection getConnection() throws Exception{
        return DriverManager.getConnection(url,username,password);
    }
    //释放资源
    public static void release(Connection conn, Statement st, ResultSet rs){
        if (rs!=null){
            try{
                rs.close();
            }catch (SQLException e){
                e.printStackTrace();
            }
        }
        if (st!=null){
            try {
                st.close();
            }catch (SQLException e){
                e.printStackTrace();
            }
        }
        if (conn!=null){
            try{
                conn.close();
            }catch (SQLException e){
                e.printStackTrace();
            }
        }
    }
}

使用:

package utils;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class TestInstert {
    public static void main(String[] args) {
        Connection conn = null;
        Statement st =null;
        ResultSet rs = null;

        try {
            conn = JdbcUtils.getConnection();//获取数据库连接
            st = conn.createStatement();//获得SQL的执行对象
            String sql = "insert into test1(id,name,zijin)"+"values(4,'gao',11)";
            int i = st.executeUpdate(sql);
            if (i>0){
                System.out.println("插入成功");
            }
        }catch (SQLException e){
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JdbcUtils.release(conn,st,rs);
        }
    }
}

8.4 SQL注入

例如:输入用户名和密码时

输入:‘or ’ 1 = 1

输入:‘or ’ 1 = 1

可以直接盗取到服务器里所有的,账号密码

原因是判断语句:

select * from user

where 'name' = 账号 and password = 密码;

问题解决:使用安全的PreparedStatement对象

可以防止SQL注入并且效率更高;

预编译SQL

package utils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class TestInsert_prepareStatement {
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement st = null;
        try{
            conn = JdbcUtils.getConnection();
            //和Statement写法区别
            //使用? 占位符代替参数
            String sql = "insert into test1(id,name,zijin) values(?,?,?)";
            st = conn.prepareStatement(sql);//预编译,先写sql,不执行
            //手动给参数赋值
            st.setInt(1,5);//第一个数为第几个?(占位符)第二个为参数
            st.setString(2,"prepare");
            st.setInt(3,1111111);
            //注意:sql.Date    数据库的时间
            //     util.Date   java时间
            int i = st.executeUpdate();
            if (i>0){
                System.out.println("插入成功!");
            }
        }catch (SQLException e ){
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JdbcUtils.release(conn,st,null);
        }
    }
}

8.5 IDEA连接数据库

 如果右侧没有database,在左下角有个标志点一下

 如果出现not found jdbc 这个事没安装数据库驱动,可以导入或者安装,我这个时直接提示了,可以直接点download

然后会进入下面页面

 连接成功!

8.6 IDEA操作事务

package test;

import utils.JdbcUtils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class ShiWu {
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement st = null;
        ResultSet rs = null;
        try {
            conn = JdbcUtils.getConnection();
            //关闭数据库的自动提交,自动会开启事务
            conn.setAutoCommit(false);//开启事务

            String sql1 = "update test1 set zijin = zijin-10 where id = 1";
            st = conn.prepareStatement(sql1);
            st.executeUpdate();

            String sql2 = "update test1 set zijin = zijin+10 where id = 2";
            st = conn.prepareStatement(sql2);
            st.executeUpdate();

            conn.commit();
            System.out.println("成功");
        } catch (SQLException e) {
           try{
               conn.rollback();
           }catch (SQLException ee){
               ee.printStackTrace();
           }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            JdbcUtils.release(conn,st,rs);
        }
    }
}

8.7 数据库连接池

        数据库连接——>释放十分浪费资源

池化技术:准备一些预选的资源,过来就连接预先准备好的

最小连接数,最大连接数,等待超时

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值