WEB_08【MySQL&JDBC】

特此说明:本文参考黑马程序员视频讲座
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
/*
第一部分:MySQL数据库基本操作

*/

SQL分类:

DDL(Data Definition Language):database,table,column,create,alter,drop,etc
DML(Data Manipulation Language):insert,delete,update,etc
DSDL(Data Storage Description Language)

DDL基本操作

首先,必须安装好MySQL,并配置好环境变量。

登录
这里写图片描述

创建及查看数据库
这里写图片描述
创建带有编码格式的数据库及查看数据库编码
这里写图片描述
删除数据库
这里写图片描述
切换数据库及查看当前使用哪个数据库
这里写图片描述
创建表及查看当前数据库有哪些表
这里写图片描述
查看表结构
这里写图片描述
删除表
这里写图片描述

技巧:这个表这样已经删除掉,如果想快速重新创建这个表的话,不需要重新打一遍代码,可以使用上下箭头键迅速恢复之前写的代码,进而重新创建出来这个表,下面将在此表的基础上继续做基本操作
修改表

添加一列
这里写图片描述
修改列类型
这里写图片描述
修改列名
这里写图片描述
删除列
这里写图片描述
改变表名
这里写图片描述
改变表编码
这里写图片描述

MySQL 数据类型及DML基本操作

在 MySQL 中,有三种主要的类型:文本、数字和日期/时间类型。
下面摘自http://www.w3school.com.cn/sql/sql_datatypes.asp
这里写图片描述
这里写图片描述
这里写图片描述

插入
这里写图片描述

提示:中文乱码问题!可以去C:\ProgramData\MySQL\MySQL Server 5.7下的my.ini文件里去改代码,也可以用命令行操作。
这里写图片描述
这里写图片描述

扫描二维码关注公众号,回复: 1940550 查看本文章

更新
这里写图片描述
这里写图片描述
删除
这里写图片描述
这里写图片描述
delete与truncate的区别:
delete删除记录,不清空anto_increment自增使用的编号,而truncate直接删除表,重新建表,auto_increment自增重新从1开始。delete删除的数据可以回滚找回,而truncate删除的数据找不回来了
这里写图片描述

这里写图片描述

查询操作

简单查询
这里写图片描述
这里写图片描述
这里写图片描述
条件查询
这里写图片描述
这里写图片描述
排序
这里写图片描述
聚合函数
sum(),avg(),max(),min(),count()
注意:聚合函数不统计null
这里写图片描述
这里写图片描述

分组
这里写图片描述

查询总结
注意下面的顺序!!!!

select 一般在的后面的内容都是要查询的字段
from 要查询到表
where
group by
having 分组后带有条件只能使用having
order by 它必须放到最后面

查询补充
假设数据库表共5条记录,分成3页,每页两条,那么查询第2页的两条记录的方式是,从(2-1)*2开始,limit 2,2,第一个2表示开始位置,后一个2表示个数。

这里写图片描述

===============================================================================
/*
*第二部分:JDBC(首先安装好Eclipse。)
*/
JDBC(Java DataBase Connectivity)就是Java数据库连接,说白了就是用Java语言来操作数据库。JDBC是用Java语言向数据库发送SQL语句。JDBC是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一的访问入口,JDBC由一组Java工具类和接口组成

图片来源自
这里写图片描述

Eclipse中更改编码方式如下:
这里写图片描述
Eclipse导入JDBC驱动包:
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

JDBC开发步骤

注册驱动
获得连接
获得语句执行者
执行SQL语句
处理结果
释放资源

API详解之【注册驱动】

让JDBC知道要使用的是哪个驱动。

    Class.forName("com.mysql.jdbc.Driver");

MySQL驱动包提供了实现类:com.mysql.jdbc,Driver
JDBC规范定义了驱动接口:java.sql.Driver,Ctrl+shift+T,输入Driver,导入源代码,可以查看Driver类的书写源码如下,

这里写图片描述
可以如下注册驱动:

DriverManager.registerDriver(new com.mysql.jdbc.Driver());

但是这样写,根据Driver类的源码可知,这样注册驱动,将注册两次,并且硬代码,不利于后期维护。

API详解之【获得链接】

Connection connection=DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb","root","123");

服务器的IP地址:localhost
MySQL的端口号:3306
数据库名称:mydb

url参数注意:
jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf8
useUnicode:指定这个连接数据库的过程中使用的字节集是Unicode
characterEncoding:指定java程序连接数据库的过程中,使用的字节集编码是utf-8,而MySQL写成utf8

*API详解之【获得语句执行】

String sql="insert into table_user(user_id,user_name,user_password) values('6','zhang','hi')";
Statement语句执行者代码:Statement statement=connection.createStatement();
//Connection最为重要的一个方法就是用来获取Statement对象
//Statement是用来向数据库发送SQL语句的,这样数据库就会执行发送过来的SQL语句

void executeUpdate(String sql):执行更新操作(insert、update、delete等)
ResultSet executeQuery(String sql):执行查询操作,数据库在执行查询后会把查询结果,查询结果就是ResultSet;
boolean execute(String sql);执行select语句返回true,执行其他语句返回false,如果返回true,需要使用getResultSet()获得查询结果,如果返回false,需要使用getUpdateCount()获得影响的行数
ResultSet对象表示查询结果集,只有在执行查询操作后才会有结果集的产生。结果集是一个二维的表格,有行有列。操作结果集要学习移动ResultSet内部的“行光标”,以及获取当前行上的每一列上的数据:

API详解之【处理结果集】*

rs.next();
rs.getInt(1);

ResultSet中提供了下面的方法:
boolean next():使“行光标”移动到下一行,并返回移动后的行是否存在;
XXX getXXX(int col):获取当前行指定列上的值,参数就是列数,列数从1开始,而不是0。(XXX代表Object,String,int,double等)
API详解之【释放资源】*
先得到的后关闭

rs.close();
statement.close();
connection.close();

实例演练(登录验证)

数据库:
这里写图片描述

package cn.jdbc.test;

import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;

import org.junit.Test;

import com.mysql.jdbc.Connection;
import com.mysql.jdbc.Statement;

public class LoginTest {

    @Test
    public void loginTest() {
        try {
            login("j","12");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    /**
     * 用户登录方法
     * @param user_name
     * @param user_password
     * @throws ClassNotFoundException
     * @throws SQLException
     */

    public void login(String user_name,String user_password) throws ClassNotFoundException, SQLException {
        //1.注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //2.获得链接
        Connection connection=(Connection) DriverManager.getConnection("jdbc:mysql://localhost:3306/web_08","root","123");
        //3.创建执行sql语句的对象
        Statement statement=(Statement) connection.createStatement();
        //4.书写SQL语句
        String sql="select * from table_user where "+"user_name='"+user_name+"' and user_password='"+user_password+"'";
        //5.执行SQL语句
        ResultSet resultSet=statement.executeQuery(sql);
        //6.处理结果集
        if(resultSet.next()) {
            System.out.println("恭喜您,"+user_name+"登录成功!");
            System.out.println(sql);
        }
        else {
            System.out.println("账号或密码错误!");
        }

        if(resultSet!=null){
            resultSet.close();
        }
        if(statement!=null) {
            statement.close();
        }
        if(connection!=null) {
            connection.close();
        }

    }
}

这里写图片描述

问题发现:
更改上面测试代码,我们发现这个问题,如下图片
这里写图片描述
这里写图片描述
这个问题就是由于书写SQL语句时候使用拼接问导致的注入问题,为了解决这个问题,使用预处理的方法,如下login2方法,上述问题可以解决。

package cn.jdbc.test;

import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.swing.text.html.HTMLDocument.HTMLReader.ParagraphAction;

import org.junit.Test;

import com.mysql.jdbc.Connection;
import com.mysql.jdbc.PreparedStatement;
import com.mysql.jdbc.Statement;

public class LoginTest {

    @Test
    public void loginTest() {
        try {
            login2("j'or's","12");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    /**
     * 用户登录方法
     * @param user_name
     * @param user_password
     * @throws ClassNotFoundException
     * @throws SQLException
     */

    public void login(String user_name,String user_password) throws ClassNotFoundException, SQLException {
        //1.注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //2.获得链接
        Connection connection=(Connection) DriverManager.getConnection("jdbc:mysql://localhost:3306/web_08","root","123");
        //3.创建执行sql语句的对象
        Statement statement=(Statement) connection.createStatement();
        //4.书写SQL语句
        String sql="select * from table_user where "+"user_name='"+user_name+"' and user_password='"+user_password+"'";
        //5.执行SQL语句
        ResultSet resultSet=statement.executeQuery(sql);
        //6.处理结果集
        if(resultSet.next()) {
            System.out.println("恭喜您,"+user_name+"登录成功!");
            System.out.println(sql);
        }
        else {
            System.out.println("账号或密码错误!");
        }

        if(resultSet!=null){
            resultSet.close();
        }
        if(statement!=null) {
            statement.close();
        }
        if(connection!=null) {
            connection.close();
        }

    }

    public void login2(String user_name,String user_password) throws ClassNotFoundException, SQLException {
        //1.注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //2.获得链接
        Connection connection=(Connection) DriverManager.getConnection("jdbc:mysql://localhost:3306/web_08","root","123");
        //3.创建执行sql语句的对象
        String sql="select * from table_user where user_name=? and user_password=?";
        //4.创建预处理对象
        PreparedStatement preparedStatement=(PreparedStatement) connection.prepareStatement(sql);
        //5.设置参数(给占位符),参数从1开始,setXXX根据参数的类型定
        preparedStatement.setString(1, user_name);
        preparedStatement.setString(2, user_password);
        //6.执行查询操作
        ResultSet resultSet = preparedStatement.executeQuery();
        if(resultSet.next()) {
            System.out.println("恭喜您,"+user_name+"登录成功!");
            System.out.println(sql);
        }
        else {
            System.out.println("账号或密码错误!");
        }

        if(resultSet!=null){
            resultSet.close();
        }
        if(preparedStatement!=null) {
            preparedStatement.close();
        }
        if(connection!=null) {
            connection.close();
        }

    }
}

猜你喜欢

转载自blog.csdn.net/ccnuacmhdu/article/details/80327408
今日推荐