Java学习-Day08-MySQL与JDBC编程(2)
1.SQL语句
1.1 索引
索引是存放在模式中的一个数据库对象,虽然索引总是从属于数据表,但它也和数据表一样属于数据库对象.创建索引的唯一作用就是加速对表的查询,索引通过使用快速路径访问方法来快速定位数据,从而减少了磁盘的I/O
- 创建索引:
create index index_name
on table_name (column[, column]...);
#对多列建立索引
create index emp_last_name_idx2
on employees(first_name, last_name);
- 删除索引
drop index 索引名 on 表名
1.2 视图
视图看上去像数据表,但是它并不能存储数据,视图只是一个或多个数据表中数据的逻辑显示
- 创建视图
create or replace view 视图名
as subquery;
- 删除视图
drop view 视图名;
1.3 DML语句
DML主要完成增删改的功能,由insert into,update,delete from三个命令组成
1.3.1 insert into
- 对于标准的SQL语句而言,每次只能插入一条记录,语法格式如下
insert into table_name [(column [, column...])]
values(value [, value...]);
1.3.2 update语句
- 每次可以修改多条记录,通过where子句限定修改那些记录
update table_name
set column1 = value[, column2 = value2]...
[WHERE condition];
1.3.3 delete from语句
- 用于删除指定数据表的记录,可以一次删除多行
delete from table_name
[WHERE condition];
1.4 单表查询
- select语句功能就是查询数据,select语句可以执行单表查询,而且可以指定多表连接查询,还可以进行子查询
- 单表查询格式如下
select column1, column2 ...
from 数据源
[where condition];
- select后加distinct可以去除后面字段组合的重复值
- 执行查询后的查询结果默认按插入顺序排列,如果需要查询结果按某列值的大小进行排序,则可以使用order by 子句,语句格式如下
order by column_name1 [desc],column_name2...
- 进行排序时默认按升序排列,如果强制按降序排列,需要在列后使用desc关键字
1.5 数据库函数
每个数据库都会在标准的SQL基础上扩展一些函数,这些函数用于进行数据处理或复杂运算,它们通过对一组数据进行计算,得到最终需要的输出结果
- 根据函数对多行数据的处理方式,函数被分为单行函数和多行函数,单行函数对每行输入值单独计算,每行得到一个计算结果后返回给用户,多行函数对多行输入值整体计算,最后只会得到一个结果
(暂时不研究,需要时回来补充)
1.6 分组和组函数
- 组函数也就是多行函数,将一组记录作为整体运算,每组记录返回一个结果
1.7 集合运算
- select语句查询的结果是一个包含多条数据的结果集,类似于数学里的集合,可以进行交并差运算
- 进行集合运算必须满足如下条件
- 两个结果所包含的数据列数量必须相等
- 两个结果所包含的数据列的数据类型必须一一对应
1.7.1 union运算(并集)
- 格式:
select 语句 union select 语句
1.7.2 minus运算(差集)
- 格式同上
1.7.3 interesect运算(交集)
- 格式同上
2.JDBC的典型用法
2.1 JDBC4.2常用接口和类简介
Java 8支持JDBC4.2标准
- DriverManager:用于管理JDBC驱动的服务类,程序中使用该类的主要功能是获取对象,该类包含如下方法
- public static synchronized Connection getConnection(String url,String user,String pass)throws SQLException:该方法获得url对应数据库的链接
2.2 JDBC编程步骤
1.加载数据库驱动,通常使用Class类的forName()静态方法来加载驱动
//加载驱动
Class.forName(driverClass)
上面代码中的driverClass就是数据库驱动类所对应的字符串
//例如,加载MySQL的驱动采用如下代码:
Class.forName("com.mysql.jdbc.Driver")
2.通过DriverManager获取数据库连接,DriverManager提供了如下方法
//获取数据库连接
DriverManager.gerConnection(String url,String user,String pass);
当使用DriverManager获取数据库连接时,通常需要传入三个参数:数据库URL,登录数据库用户名和密码
数据库URL通常遵循:jdbc:subprotocol:other stuff
例子:jdbc:mysql://hostname:port/databasename
3.通过Connection对象创建Statement对象,创建Statement对象的方法有三个
- createStatement():创建基本的Statement对象
- prepareStatement(String sql):根据传入的SQL语句创建预编译的Statement对象
- prepareCall(String sql):根据传入的SQL语句创建CallableStatement对象
4.使用Statement执行SQL语句,所有Statement都有如下三个方法来执行SQL语句
- execute():可以执行任何SQL语句,但比较麻烦
- executeUpdate():主要用于执行DML和DDL语句.指定DML语句返回受SQL语句影响的行数,执行DDL语句返回0
- executeQuery():只能执行查询语句,执行后返回代表查询结果的ResultSet对象
5.操作结果集,如果执行的SQL语句是查询语句,则执行结果将返回一个ResultSet对象,该对象里保存了SQL语句查询的结果,程序可以通过操作该ResultSet对象来取出查询结果,ResultSet对象主要提供了吐下两类方法
- next(),previous(),first(),last(),beforeFirst(),afterLast(),absolute()等移动记录指针的方法
- getXxx()方法获取记录指针指向行,特定列的值,该方法既可以使用列索引作为参数,也可使用列名作为参数.使用列索引作为参数性能更好,使用列名作为参数可读性更好
6.回收数据库资源,包括关闭ResultSet,Statement和Connection等资源
下面程序简单示范JDBC编程:
import java.sql.*;
public class ConnMySql {
public static void main(String[] args)throws Exception{
//1.加载驱动,使用反射知识
Class.forName("com.mysql.jdbc.Driver");
try {
//2.使用DriverManager获取数据库连接
//其中返回的Connection就代表了Java程序和数据库的连接
//不同数据库的URL写法需要查驱动文档,用户名,密码由DBA分配
Connection conn = DriverManager.getConnection(
"jdbc:mysql://127.0.0.1:3306/demo1",
"root",".aA123456"
);
//3.使用Connection来创建一个Statement对象
Statement stmt = conn.createStatement();
//4.执行SQL语句
/*
Statement有三种执行SQL语句的方法
1.execute()可执行任何SQL语句,返回一个Boolean值
如果执行后第一个结果是ResultSet,则返回true,否则返回false
2.executeQuery()执行select语句 返回查询到的结果集
3.executeUpdate()用于执行DML语句 返回一个整数
代表被SQL语句影响的记录条数
*/
ResultSet rs = stmt.executeQuery("select s.*, teacher_name" + "from student_table s, teacher_table t" + "where t.teacher_id = s.java_teacher");{
//ResultSet有一系列的getXxx(列索引 | 列名)方法,用于获取记录指针
//指向行,特定列的值,不断地只用next()将记录指针下一行
//如果移动之后记录指针依然指向有效行,则next()方法返回true
while (rs.next()){
System.out.println(rs.getInt(1) + "\t"
+ rs.getString(2) + "\t"
+ rs.getString(3) + "\t"
+ rs.getString(4)
);
}
}
}catch (Exception e){
System.out.println(e);
}
}
}