MySql (sql语句+jdbc)

一、基础sql语句
  • 创建库
/* 指定编码 */
CREATE DATABASE IF NOT EXISTS Web_Data CHARACTER SET utf8;
/* 默认编码 */
CREATE DATABASE IF NOT EXISTS Web_Data;
  • 查询已存在的数据库
    SHOW DATABASES;
  • 切换到指定的数据库
    USE Web_Data;//切换到Web_Data数据库
  • 查看当前正在操作的数据库
    SELECT database();
  • 创建表
CREATE TABLE IF NOT EXISTS user(id INTEGER PRIMARY KEY 
AUTO_INCREMENT,name VARCHAR(20),password VARCHAR(100));
  • 列出数据库中已存在的表
    SHOW TABLES;
  • 显示创建数据库的语句
    SHOW CREATE DATABASE 数据库名
  • 显示创建表的语句
    SHOW CREATE TABLE 表名;
  • 查看表结构
    DESC 表名;
  • 删除数据库
    DROP DATABASE 数据库名;
  • 删除表
DROP TABLE 表名;//删除表数据及表结构
DELETE FROM 表名;//删除表数据
TRUNCATE TABLE 表名;//摧毁表结构,重建。auto_increment将被重置,从0开始
  • 如果此时想删除表中所有记录,使用TRUNCATE TABLE还是DELETE FROM
//--- 删除方式 ---
delete一条一条删除,不会重置auto_increment
truncate是直接将表删除(摧毁),重建一张一模一样的表。auto_increment被重置为0
//--- 事务方面 ---
delete删除的数据如果是在一个事务中,可以找回
truncate删除的数据无法找回
  • 修改表
ALTER TABLE user MODIFY name VARCHAR(50);//修改name的长度
ALTER TABLE user ADD sex VARCHAR(20);//增加sex列
ALTER TABLE user DROP text;//删除text一列
ALTER TABLE user CHARACTER SET utf8;//修改表编码
  • 修改表名
    RENAME TABLE 表名 TO 新表名;
  • 外键
    ALTER TABLE product ADD FOREIGN KEY (category_id) REFERENCES category (cid);
二、多表查询

交叉连接查询

  • 基本不会使用,得到的是两个表的乘积
  • 语法:select * from A,B;

内连接查询

  • 使用关键字inner join,inner可以省略
隐式内连接
  select * from A,B where 条件;
显式内连接
  select * from A inner join B on条件.

外连接查询

  • 使用关键字outer join,outer可以省略
左外连接:left outer join
  select * from A left outer join B on 条件;
右外连接:right outer join
  select * from A right outer join B on 条件;

内连接和外连接区别

  • 左外连接:查询左表的全部数据,以及两个表的交集
  • 内连接:查询两个表的交集
  • 右外连接:查询右表的全部数据,以及两个表的交集

子查询

  • 子查询:一条select语句的结果作为另一条select语句的一部分(查询条件,查询结果,表等).
三、JDBC开发步骤

注册驱动

  • 分析步骤1
    JDBC规范定义驱动接口:java.sql.Driver,mysql驱动包提供了实现类:com.mysql.jdbc.Driver
  • 分析步骤2
    DriverManager工具类提供注册驱动的方法:registerDriver();参数:java.sql.Driver,所以可以通过DriverManager.registerDriver(new com.mysql.jdbc.Driver)进行注册
  • 不足:硬编码,后期不易于程序维护和扩展
  • 不足:驱动被注册两次
  • 分析步骤3
    如果使用Class.forName()将类加载到内存,该类的静态代码将自动执行,com.mysql.jdbc.Driver源码中,会主动进行Driver注册
package cn.xjw.jdbc_demo.utils;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.logging.Logger;
/**
 * JDBC开发步骤
 * 
 * @author xjw
 * 
 * 拷贝驱动,添加到构建路径中
 * 1.注册驱动
 * 2.获取连接
 * 3.获得sql语句的执行对象
 * 4.[为预编译对象的sql语句的占位符参数赋值]
 * 5.执行对象执行sql
 * 6.处理结果集,如果有
 * 7.释放资源
 * 
 * 开发通常使用Class.forName()加载一个使用字符串描述的驱动类
 * Class.forName("com.mysql.jdbc.Driver");
 * 如果Class.forName()将类加载到内存,该类的静态代码将自动执行com.mysql.jdbc.Driver源码中会自动进行Driver注册
 *
 */
public class JDBCUtils {
    
    private static String user = "";
    private static String pswd = "";
    private static String url = "";
    private static String driver = "";
    
    static{
        /**
         * 配置文件:.properties
         * 获取各种数据
         */
        ResourceBundle rb = ResourceBundle.getBundle("cn.xjw.jdbc_demo.utils.MyDB");
        user = rb.getString("user");
        pswd = rb.getString("password");
        url = rb.getString("url");
        driver = rb.getString("driver");
        try {
            Class.forName(driver);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            System.out.println("can not register driver");
        }
    }
    public static Connection getCon() throws SQLException{
        return DriverManager.getConnection(url, user, pswd);
    }
    public static void myRelease(Connection con, ResultSet rs, PreparedStatement ps){
        if(rs!=null){
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        rs = null;
         if(ps != null){
            try {
                ps.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        ps = null;
        if(con!=null){
            try {
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        con = null;
    }
}
public static void main(String[] args){
        String name = "tony";
        String pswd = "tony123321";
        String sql = "select * from user where sname=? and pid=?";
        try {
            Connection con = JDBCUtils.getCon();
            PreparedStatement ps = con.prepareStatement(sql);
            ps.setString(1, name);
            ps.setString(2, pswd);
            ResultSet rs = ps.executeQuery();
            User u = null;
            if(rs != null && rs.next()){
                u = new User();
                u.name = rs.getString("sname");
            }
            JDBCUtils.myRelease(con, rs,ps);
            if(u!=null){
                System.out.println(u.name);
            }
        } catch (SQLException e) {
            e.printStackTrace();
            System.out.println("can not get con");
        }
        
    }
  • 批量操作
private static void method02(List<User> beanList) {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/web09", "username", "password");
            String sql = "inset into user(sname) values(?);";
            PreparedStatement ps = con.prepareStatement(sql);
            for(User bean:beanList){
                ps.setString(1, bean.name);
                ps.addBatch();
            }
            ps.executeBatch();
             if (ps != null) {
                 ps.close();
             }
             if (con != null) {
                 con.close();
             }
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }   
    }
点赞