一、基础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();
}
}