JavaEE_day08_MySQL单表&JDBC

一、对数据库的操作:

进入sql:

打开命令提示符,输入以下命令:

mysql  -u [username] -p [password]
  1. 创建一个库:
//方式一
create database 库名;
//方式二
create database 库名 character set 编码;
  1. 查看数据库:
//查看所有数据库
show databases;
//查看带有编码的数据库
show create database web08_01;
JavaEE_day08_MySQL单表&JDBC_第1张图片
Paste_Image.png
  1. 删除一个库:
drop database 库名;
JavaEE_day08_MySQL单表&JDBC_第2张图片
Paste_Image.png
  1. 使用库:
use 库名;
  1. 查看当前正在操作的库:
select database();
JavaEE_day08_MySQL单表&JDBC_第3张图片
Paste_Image.png

二、对数据库表的操作:

  1. 创建一张表:
create table 表名(
    字段名   类型(长度)    [约束],
    字段名   类型(长度)    [约束],
    字段名   类型(长度)    [约束]
);
JavaEE_day08_MySQL单表&JDBC_第4张图片
Paste_Image.png
  1. 查看数据库表:
show tables;
JavaEE_day08_MySQL单表&JDBC_第5张图片
Paste_Image.png
  1. 查看表的结构:
desc 表名;
JavaEE_day08_MySQL单表&JDBC_第6张图片
Paste_Image.png
  1. 删除一张表:
drop table 表名;
  1. 修改表:
  • 添加一列:
alter  table  表名  add  字段名   类型(长度)   [约束] ;
JavaEE_day08_MySQL单表&JDBC_第7张图片
  • 修改类的类型(长度、约束):
alter  table  表名  modify  要修改的字段名    类型(长度)    [约束];
JavaEE_day08_MySQL单表&JDBC_第8张图片
  • 修改列的列名:
alter   table   表名   change   旧列名   新列名   类型(长度)    [约束] ;
JavaEE_day08_MySQL单表&JDBC_第9张图片
Paste_Image.png
  • 删除表的列:
alter   table   表名   drop   列名 ;
JavaEE_day08_MySQL单表&JDBC_第10张图片
Paste_Image.png
  • 修改表名:
rename   table   旧表名   to  新表名 ;
JavaEE_day08_MySQL单表&JDBC_第11张图片
Paste_Image.png
  • 修改表的字符集:
alter   table   表名   character   set   编码 ;
JavaEE_day08_MySQL单表&JDBC_第12张图片
Paste_Image.png
JavaEE_day08_MySQL单表&JDBC_第13张图片
Paste_Image.png

三、对数据库表记录进行操作:

  1. 插入记录:
    方式 1:
insert  into  表名(列名1,列名2,列名3……)   values(值1,值2,值3……) ;
JavaEE_day08_MySQL单表&JDBC_第14张图片

方式 2:

insert into 表名 values(值1,值2,值3……);
Paste_Image.png

解决中文乱码的方法:

set names gbk ;
  1. 修改表记录:
  • 不带条件的:
update 表名 set 字段名=值, 字段名=值, 字段名=值……
  • 带条件的:
update 表名 set字段名=值, 字段名=值, 字段名=值…… where 条件
JavaEE_day08_MySQL单表&JDBC_第15张图片
Paste_Image.png
  1. 删除表记录:
    • 不带条件的:
delete from 表名;
JavaEE_day08_MySQL单表&JDBC_第16张图片
  • 带条件的:
delete from 表名 where 条件;

此时删除后,uid不会重置。


JavaEE_day08_MySQL单表&JDBC_第17张图片
Paste_Image.png

说说delete与truncate的区别?
delete删除的时候是一条一条的删除记录,它配合事务,可以将删除的数据找回。
truncate删除,它是将整个表摧毁,然后再创建一张一模一样的表。它删除的数据无法找回。

start transaction;
delete from 表名;
rollback;

通过开启一个事物, 可以把delete的表回滚找回来,id不会重置
而truncate无法找回,id会重置。

start transaction;
truncate table 表名;
rollback;

四、查询:

  1. 查询所有商品:
select * from product ;
JavaEE_day08_MySQL单表&JDBC_第18张图片
  1. 查询商品名和商品价格:
select pname,price from product;
JavaEE_day08_MySQL单表&JDBC_第19张图片
  1. 查询所有商品信息使用表别名:
select * from product as p;

as可以省略。


JavaEE_day08_MySQL单表&JDBC_第20张图片
  1. 查询商品名,使用列别名:
select pname as p from product;
  1. 去掉重复值(按照价格):
select distinct(price) from product;
JavaEE_day08_MySQL单表&JDBC_第21张图片
  1. 将所有的商品的价格+10进行显示:
select pname,price+10 from product;
JavaEE_day08_MySQL单表&JDBC_第22张图片

7.条件查询:

  • 查询商品名称为"左慈"的商品信息:
select * from product where pname='左慈';
JavaEE_day08_MySQL单表&JDBC_第23张图片
  • 查询价格>60元的所有商品信息:
select * from product where price>60;
JavaEE_day08_MySQL单表&JDBC_第24张图片
  • 查询商品名称含有"士"字的商品信息:
select * from product where pname like '%士%';
JavaEE_day08_MySQL单表&JDBC_第25张图片
  • 查询商品id在(3,6,9)范围内的所有商品信息:
select * from product where pid in(3,6,9);
JavaEE_day08_MySQL单表&JDBC_第26张图片
  • 查询商品名称含有"士"字并且id为6的商品信息:
select * from product where pname like '%士%' and pid=6;
JavaEE_day08_MySQL单表&JDBC_第27张图片
  • 查询id为2或者6的商品信息:
select * from product where pid=2 or pid=6;
JavaEE_day08_MySQL单表&JDBC_第28张图片

8.排序:

  • 查询所有的商品,按价格进行排序(升序、降序):
    asc:升序
    desc:降序
select * from product order by price asc;
JavaEE_day08_MySQL单表&JDBC_第29张图片
  • 查询名称有"士"的商品信息并且按照价格降序排序:
select * from product where pname like '%士%' order by price desc;
JavaEE_day08_MySQL单表&JDBC_第30张图片

9.聚合函数:

  • 获得所有商品的价格的总和:
select sum(price) from product;
JavaEE_day08_MySQL单表&JDBC_第31张图片
  • 获得所有商品的平均价格:
select avg(price) from product;
JavaEE_day08_MySQL单表&JDBC_第32张图片
  • 获得所有商品的个数:
select count(*) from product;
JavaEE_day08_MySQL单表&JDBC_第33张图片

10.分组操作:
准备工作:


JavaEE_day08_MySQL单表&JDBC_第34张图片
  • 根据cid字段分组,分组后统计商品的个数:
select cid,count(*) from product group by cid;
JavaEE_day08_MySQL单表&JDBC_第35张图片
  • 根据cid分组,分组统计每组商品的平均价格,并且平均价格大于20000元:
select cid,avg(price) from product group by cid having avg(price)>20000;
JavaEE_day08_MySQL单表&JDBC_第36张图片
  • 使用Limit关键字进行查询操作:
    limit有两个参数:
    第一个参数:(要查询第几页 -1)*第二个参数
    第二个参数:每页显示的数目

例:每页显示3条记录,要查询第三页。

select * from product limit 6,3;
JavaEE_day08_MySQL单表&JDBC_第37张图片

五、JDBC:

  • 概念:
    JDBC(Java DataBase Connectivity)就是Java数据库连接,说白了就是用Java语言来操作数据库。

  • JDBC核心类介绍:
    DriverManager、Connection、Statement、ResultSet

1.DriverManager:
两个作用:
(1)注册驱动:

//可能出现ClassNotFoundException异常,原因:没导jar包、类名书写错误
Class.forName("com.mysql.jdbc.Driver");

(2)获取连接:

//web08是数据库的名称,root是数据的用户名,a12345是数据库的密码
//出现SQLException异常
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/web08","root","a12345");

2.Connection:
主要用来获取Statement:

Statement stmt = conn.createStatement();

3.Statement:
有三个常用方法:
(1) int executeUpdate(String sql):
执行更新操作,即执行insert、update、delete语句;
(2) ResultSet executeQuery(String sql):
执行查询操作,执行查询操作会返回ResultSet,即结果集;
(3) boolean execute():
用来执行增、删、改、查所有SQL语句;
注:
如果使用execute()方法执行的是更新语句,那么还要调用int getUpdateCount()来获取insert、update、delete语句所影响的行数;
如果使用execute()方法执行的是查询语句,那么还要调用ResultSet getResultSet()来获取select语句的查询结果。

4.ResultSet:
获取结果集代码如下:

ResultSet rs = stmt.executeQuery(sql);

方法:next()表示查看结果集是否为空

//表示结果集中已经有查询到的结果
rs.next();

读取数据的方法如下:
根据列数:

String getString(int columnIndex):获取指定列的String类型数据;
int getInt(int columnIndex):获取指定列的int类型数据;
double getDouble(int columnIndex):获取指定列的double类型数据;
boolean getBoolean(int columnIndex):获取指定列的boolean类型数据;
Object getObject(int columnIndex):获取指定列的Object类型的数据。

根据名称:

String getString(String columnName):获取名称为columnName的列的String数据;
int getInt(String columnName):获取名称为columnName的列的int数据;
double getDouble(String columnName):获取名称为columnName的列的double数据;
boolean getBoolean(String columnName):获取名称为columnName的列的boolean数据;
Object getObject(String columnName):获取名称为columnName的列的Object数据;

PreparedStatement:

预编译声明,是Statement的子接口。
优点:
(1)防止SQL攻击;
(2)提高代码的可读性,以可维护性;
(3)提高效率。
使用模板如下:

String sql = “select * from tab_student where s_number=?”;
PreparedStatement pstmt = con.prepareStatement(sql);
pstmt.setString(1, “S_1001”);
ResultSet rs = pstmt.executeQuery();
rs.close();
pstmt.clearParameters();
pstmt.setString(1, “S_1002”);
rs = pstmt.executeQuery();
JDBC的开发步骤:
public void login(String username, String password) throws ClassNotFoundException, SQLException {
        // 1.注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        // 2.获取连接
        Connection conn = (Connection) DriverManager.getConnection("jdbc:mysql://localhost:3306/web08", "root",
                "a12345");
        // 3.获取执行sql语句的对象
        Statement stmt = (Statement) conn.createStatement();
        // 4.书写一个sql语句
        String sql = "select * from tbl_user where uname='" + username + "' and upassword='" + password + "'";
        // 5.执行sql语句
        ResultSet rs = stmt.executeQuery(sql);
        // 6.对结果集进行处理
        if (rs.next()) {
            System.out.println("恭喜您," + username + ",登录成功!");
            System.out.println(sql);
        } else {
            System.out.println("账号或密码错误!");
        }
        // 7.釋放資源
        rs.close();
        stmt.close();
        conn.close();
    }
规范化代码如下:
    @Test
    public void query() {
        Connection con = null;
        Statement stmt = null;
        ResultSet rs = null;
        try {
            con = getConnection();
            stmt = con.createStatement();
            String sql = "select * from user";
            rs = stmt.executeQuery(sql);
            while(rs.next()) {
                String username = rs.getString(1);
                String password = rs.getString(2);
                System.out.println(username + ", " + password);
            }
        } catch(Exception e) {
            throw new RuntimeException(e);
        } finally {
            try {
                if(rs != null) rs.close();
                if(stmt != null) stmt.close();
                if(con != null) con.close();
            } catch(SQLException e) {}
        }
    }
下面用PreparedStatement完成,没有sql注入问题
public void login1(String username, String password) throws ClassNotFoundException, SQLException {
        // 1.注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        // 2.获取连接
        Connection conn = (Connection) DriverManager.getConnection("jdbc:mysql://localhost:3306/web08", "root",
                "a12345");
        // 3.编写sql语句
        String sql = "select * from tbl_user where uname=? and upassword=?";
        // 4.创建预处理对象
        PreparedStatement pstmt = (PreparedStatement) conn.prepareStatement(sql);
        // 5.设置占位符
        pstmt.setString(1, username);
        pstmt.setString(2, password);
        // 6.执行查询操作
        ResultSet rs = pstmt.executeQuery();
        // 7.对结果集进行处理
        if (rs.next()) {
            System.out.println("恭喜您," + username + ",登录成功!");
            System.out.println(sql);
        } else {
            System.out.println("账号或密码错误!");
        }
        //8.释放资源
        rs.close();
        pstmt.close();
        conn.close();
    }

使用JDBC完成增删改查 的实例:

db.properties文件:版本2和版本3需要用上。

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

JDBCUtils_V1类:

 package cn.zl.jdbc;

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

/**
  * 提供获取连接和资源的方法 
  * @author ZL
  *
  */

public class JDBCUtils_V1 {
    //获取连接方法
    public static Connection getConnection(){
        Connection conn=null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/web08","root","a12345");
            
        } catch (Exception e) {
            e.printStackTrace();
        }
        return conn;    
    }
    
    //释放资源
    public static void release(Connection conn,PreparedStatement pstmt,ResultSet rs){
        if(rs!=null){
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(pstmt!=null){
            try {
                pstmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(conn!=null){
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

}

JDBCUtils_V2类:

 package cn.zl.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ResourceBundle;

/**
  * 提供获取连接和资源的方法 
  * @author ZL
  *
  */

public class JDBCUtils_V2 {
    private static String driver;
    private static String url;
    private static String username;
    private static String password;
    
    //静态代码块加载配置文件信息
    static{
        ResourceBundle bundle = ResourceBundle.getBundle("db");
        driver = bundle.getString("driver");
        url = bundle.getString("url");
        username=bundle.getString("username");
        password=bundle.getString("password");
        
    }
    //获取连接方法
    public static Connection getConnection(){
        Connection conn=null;
        try {
            Class.forName(driver);
            conn=DriverManager.getConnection(url,username,password);
            
        } catch (Exception e) {
            e.printStackTrace();
        }
        return conn;    
    }
    
    //释放资源
    public static void release(Connection conn,PreparedStatement pstmt,ResultSet rs){
        if(rs!=null){
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(pstmt!=null){
            try {
                pstmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(conn!=null){
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

}

JDBCUtils_V3类:

package cn.zl.jdbc;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;
import java.util.ResourceBundle;

/**
 * 提供获取连接和资源的方法
 * 
 * @author ZL
 *
 */

public class JDBCUtils_V3 {
    private static String driver;
    private static String url;
    private static String username;
    private static String password;

    // 静态代码块加载配置文件信息
    static {
        try {
            // 1/通过当前类获取类加载器
            ClassLoader classLoader = JDBCUtils_V3.class.getClassLoader();
            // 2.通过类加载器的方法获得一个输入流
            InputStream is = classLoader.getResourceAsStream("db.properties");
            // 3.创建一个properties对象
            Properties props = new Properties();
            // 4.加载输入流
            props.load(is);
            // 5.获取相关参数的值
            driver = props.getProperty("driver");
            url = props.getProperty("url");
            username = props.getProperty("username");
            password = props.getProperty("password");

        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    // 获取连接方法
    public static Connection getConnection() {
        Connection conn = null;
        try {
            Class.forName(driver);
            conn = DriverManager.getConnection(url, username, password);

        } catch (Exception e) {
            e.printStackTrace();
        }
        return conn;
    }

    // 释放资源
    public static void release(Connection conn, PreparedStatement pstmt, ResultSet rs) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (pstmt != null) {
            try {
                pstmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

}

TestUtils类:

package cn.zl.jdbc.test;

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

import org.junit.Test;

import cn.zl.jdbc.JDBCUtils_V1;
import cn.zl.jdbc.JDBCUtils_V2;
import cn.zl.jdbc.JDBCUtils_V3;

/**
 * 测试工具类
 * @author ZL
 *
 */
public class TestUtils {
    
    /**
     * 根据id更新用户信息方法
     */
    @Test
    public void testUpdateById(){
        Connection conn = null;
        PreparedStatement pstmt = null;
        try {
            // 1.获取连接
            conn = JDBCUtils_V3.getConnection();
            // 2.编写sql语句
            String sql = "update tbl_user set upassword=? where uid=?";
            // 3.获取执行sql语句对象
            pstmt = conn.prepareStatement(sql);
            // 4.设置参数
            pstmt.setString(1,"555");
            pstmt.setInt(2,2);
            // 5.执行更新操作
            int row = pstmt.executeUpdate();
            if (row > 0) {
                System.out.println("更新成功!");
            } else {
                System.out.println("更新失败!");
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            // 6.释放资源
            JDBCUtils_V3.release(conn, pstmt, null);
        }
    }
    
    
    /**
     * 根据id删除信息
     */
    @Test
    public void testDeleteById(){
        Connection conn = null;
        PreparedStatement pstmt = null;
        try {
            // 1.获取连接
            conn = JDBCUtils_V3.getConnection();
            // 2.编写sql语句
            String sql = "delete from tbl_user where uid=?";
            // 3.获取执行sql语句对象
            pstmt = conn.prepareStatement(sql);
            // 4.设置参数
            pstmt.setInt(1,3);
            // 5.执行删除操作
            int row = pstmt.executeUpdate();
            if (row > 0) {
                System.out.println("删除成功!");
            } else {
                System.out.println("删除失败!");
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            // 6.释放资源
            JDBCUtils_V3.release(conn, pstmt, null);
        }
    }
    
    /**
     * 添加用户信息
     */
    @Test
    public void testAdd() {
        Connection conn = null;
        PreparedStatement pstmt = null;
        try {
            // 1.获取连接
            conn = JDBCUtils_V2.getConnection();
            // 2.编写sql语句
            String sql = "insert into tbl_user values(null,?,?)";
            // 3.获取执行sql语句对象
            pstmt = conn.prepareStatement(sql);
            // 4.设置参数
            pstmt.setString(1, "wangwu");
            pstmt.setString(2, "999");
            // 5.执行插入操作
            int row = pstmt.executeUpdate();
            if (row > 0) {
                System.out.println("添加成功!");
            } else {
                System.out.println("添加失败!");
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            // 6.释放资源
            JDBCUtils_V2.release(conn, pstmt, null);
        }
    }

    //根据id查询用户信息
    @Test
    public void testFindUserById(){
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        
        try {
            //1.获取连接
            conn= JDBCUtils_V1.getConnection();
            //2.编写sql语句
            String sql="select * from tbl_user where uid=?";
            //3获取执行sql语句对象
            pstmt = conn.prepareStatement(sql);
            //4.设置参数
            pstmt.setInt(1, 2);
            //5.执行 查询操作
            rs = pstmt.executeQuery();
            //6.结果集处理
            while(rs.next()){
                System.out.println(rs.getString(2)+"----"+rs.getString("upassword"));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally{
            JDBCUtils_V1.release(conn, pstmt, rs);
        }
    }

}

你可能感兴趣的:(JavaEE_day08_MySQL单表&JDBC)