public class App2 {public static void main ( String [] args ) {// 显示第 5 页数据,每页 10 条数据int pageNum = 5 ;int rowsPerPage = 10 ;List < Student > res = new ArrayList <> ();try ( Connection conn = DriverManager . getConnection ( "jdbc:mysql:///test?serverTimezone=UTC" , "root" , "123456" )) {// 如果考虑跨数据库平台,这里的 sql 应该使用标准 sqlString sql = "select * from tb_student" ;PreparedStatement ps = conn . prepareStatement ( sql ,ResultSet . TYPE_SCROLL_INSENSITIVE , ResultSet . CONCUR_READ_ONLY );ResultSet rs = ps . executeQuery ();// 需要判断页码值的合理性 , 页码值需要大于 0 ,小于等于最大页码值// 如果页码值小于 1 ,则为 1 ;如果大于最大页码值则为最大页码值if ( rs . last ()) { // 将行指针移动到最后一行int rowNum = rs . getRow (); // 获取总行数int maxPage = rowNum / rowsPerPage ;if ( rowNum % rowsPerPage != 0 )maxPage ++ ;if ( pageNum < 1 )pageNum = 1 ;if ( pageNum > maxPage )pageNum = maxPage ;int begin = ( pageNum - 1 ) * rowsPerPage + 1 ; // 起始行号rs . absolute ( begin ); // 将行指针移动到指定的行上int count = 0 ;do {Student s = new Student ();s . setId ( rs . getLong ( "id" ));s . setName ( rs . getString ( "name" ));res . add ( s );count ++ ;if ( count >= rowsPerPage )break ;} while ( rs . next ());}} catch ( Exception e ) {e . printStackTrace ();}for ( Student tmp : res )System . out . println ( tmp );}}class Student implements Serializable {private Long id ;private String name ;public Long getId () {return id ;}public void setId ( Long id ) {this . id = id ;}public String getName () {return name ;}public void setName ( String name ) {this . name = name ;}@Overridepublic String toString () {return "Student [id=" + id + ", name=" + name + "]" ;}}
由于执行性能的问题,一般不建议使用
// MySQL 驱动支持 JDBC4try ( Connection conn = DriverManager . getConnection ( "jdbc:mysql:///test?serverTimezone=UTC" , "root" , "123456" )) {PreparedStatement ps = conn . prepareStatement ( "select * from tb_student" ,ResultSet . TYPE_SCROLL_INSENSITIVE , ResultSet . CONCUR_UPDATABLE );ResultSet rs = ps . executeQuery ();// 获取第 3 行数据rs . absolute ( 3 );// 在当前行上执行修改指定列数据的操作rs . updateString ( "name" , " 东方星雨 " );rs . updateRow (); // 修改修改// 插入数据rs . moveToInsertRow (); // 将结果集指针移动到插入行上rs . updateString ( "name" , " 张三 " );rs . insertRow (); // 插入数据// 删除当前行数据 , 删除第 5 行数据rs . absolute ( 5 );rs . deleteRow (); // 删除当前行rs . close ();ps . close ();}
ResultSet rs = ps . executeQuery ();ResultSetMetaData rsmd = rs . getMetaData ();int len = rsmd . getColumnCount (); // 獲取列數for ( int i = 1 ; i <= len ; i ++ ){String columnName = rsmd . getColumnName ( i ); // 獲取列名稱String typeName = rsmd . getColumnTypeName ( i ); // 獲取列的類型名稱System . out . println ( columnName + "\t" + typeName );}
获取从第5行开始的3条数据 select * from tb_student limit 5-1,3;
对象
|
描述
|
表 TABLE
|
表是存储数据的逻辑单元,以行和列的形式存在,列就是字段,行就是记录
|
数据字典
|
就是系统表,存放数据库相关信息的表。系统表的数据通常由数据库系统维护,程序员通常不应该修改,只可查看
|
约束
CONSTRAINT
|
执行数据校验的规则,用于保证数据完整性的规则
|
视图 VIEW
|
一个或者多个数据表里的数据的逻辑显示,视图并不存储数据
|
索引 INDEX
|
用于提高查询性能,相当于书的目录
|
存储过程
PROCEDURE
|
用于完成一次完整的业务处理,没有返回值,但可通过传出参数将多个值传给调
用环境
|
存储函数
FUNCTION
|
用于完成一次特定的计算,具有一个返回值
|
触发器
TRIGGER
|
相当于一个事件监听器,当数据库发生特定事件后,触发器被触发,完成相应的处理
|
CREATE [ OR REPLACE ] [ ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] VIEW 视图名称[( 字段列表 )]AS查询语句 [ WITH [ CASCADED | LOCAL ] CHECK OPTION ]
精简版 CREATE VIEW 视图名称 AS 查询语句
CREATE VIEW empvu80ASSELECT employee_id, last_name, salary FROM employees WHERE department_id = 80 ;CREATE VIEW emp_year_salary (ename,year_salary)ASSELECT ename,salary* 12 *( 1 +IFNULL(commission_pct, 0 )) FROM t_employee;
CREATE VIEW empviewASSELECT employee_id emp_id,last_name NAME,department_nameFROM employees e,departments dWHERE e .department_id = d .department_id ;CREATE VIEW dept_sum_vu (name, minsal, maxsal, avgsal)ASSELECT d .department_name , MIN (e .salary ), MAX (e .salary ), AVG (e .salary )FROM employees e, departments dWHERE e .department_id = d .department_id GROUP BY d .department_name ;
CREATE VIEW emp_departASSELECT CONCAT(last_name, '(' ,department_name, ')' ) AS emp_deptFROM employees e JOIN departments dWHERE e .department_id = d .department_id
CREATE VIEW emp_dept_ysalaryASSELECT emp_dept .ename ,dname,year_salaryFROM emp_dept INNER JOIN emp_year_salaryON emp_dept .ename = emp_year_salary .ename ;
# 查看视图信息(显示数据表的存储引擎、版本、数据行数和数据大小等)SHOW TABLE STATUS LIKE ' 视图名称 ' \G
MySQL 支持使用 INSERT 、 UPDATE 和 DELETE 语句对视图中的数据进行插入、更新和删除操作。当视图中的数据发生变化时,数据表中的数据也会发生变化,反之亦然。UPDATE emp_tel SET tel = '13789091234' WHERE ename = 'yanjun' ;DELETE FROM emp_tel WHERE ename = 'yanjun' ;
CREATE OR REPLACE VIEW emp_dept (ename,salary,birthday,tel,email,hiredate,dname)ASSELECT ename,salary,birthday,tel,email,hiredate,dnameFROM t_employee INNER JOIN t_departmentON t_employee .did = t_department .did ;
在定义视图的SELECT语句中使用了JOIN联合查询,视图将不支持更新操作。
虽然可以更新视图数据,但总的来说,视图作为虚拟表,主要用于方便查询,不建议更新视图的数据。对视图数据的更改,都是通过对实际数据表里数据的操作来完成的。
CREATE OR REPLACE VIEW empvu80 (id_number, name, sal, department_id)ASSELECT employee_id, first_name || ' ' || last_name, salary, department_idFROM employees WHERE department_id = 80 ;