概念

JDBC(java database connectivity )SUN公司提供的一套操作数据库的标准规范。是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。

  • JDBC与数据库驱动的关系:接口与实现的关系。
  • JDBC规范(掌握四个核心对象):

    DriverManager:用于注册驱动
    Connection: 表示与数据库创建的连接
    Statement: 操作数据库sql语句的对象
    ResultSet: 结果集或一张虚拟表

  • 实现JDBC操作

    1、注册驱动
    2、创建连接
    3、得到执行sql语句的Statement对象
    4、执行sql语句,并返回结果
    5、处理结果
    6、关闭资源

常用的类和接口

java.sql.Drivermanager类

作用:创建连接

1.注册驱动

DriverManager.registerDriver(new com.mysql.jdbc.Driver());不建议使用
原因
导致驱动被注册2次,并且强烈依赖数据库的驱动jar
解决办法:Class.forName("com.mysql.jdbc.Driver");

2.与数据库建立连接
方式一:(常用)

static Connection getConnection(String url, String user, String password) 

试图建立到给定数据库 URL 的连接。
示例:
getConnection("jdbc:mysql://localhost:3306/user", "root", "root");
注意:
URL:SUN公司与数据库厂商之间的一种协议。
jdbc:mysql://localhost:3306/user
协议 子协议 IP :端口号 数据库
mysql: jdbc:mysql://localhost:3306/user 或者 jdbc:mysql:///user(默认本机连接)
oracle: jdbc:oracle:thin:@localhost:1521:sid

方式二:

Properties info = new Properties();//要参考数据库文档
info.setProperty("user", "root");
info.setProperty("password","root");
getConnection(String url, Properties info);
getConnection(String url);

方式三:

DriverManager.getConnection("jdbc:mysql://localhost:3306/user?user=root&password=root");

java.sql.Connection接口

作用:建立一个连接
注意:接口的实现在数据库驱动中。所有与数据库交互都是基于连接对象的。
方法:Statement createStatement(); //创建操作sql语句的对象

java.sql.Statement接口

作用:操作sql语句,并返回相应结果的对象
注意:接口的实现在数据库驱动中。用于执行静态 SQL 语句并返回它所生成结果的对象。
方法:
1.ResultSet executeQuery(String sql) 根据查询语句返回结果集。只能执行select语句。
2.int executeUpdate(String sql) 根据执行的DML(insert update delete)语句,返回受影响的行数。
3.boolean execute(String sql) 此方法可以执行任意sql语句。返回boolean值,表示是否返回ResultSet结果集。仅当执行select语句,且有返回结果时返回true, 其它语句都返回false;

注意:为防止SQL注入一般使用preparedStatement方法
preparedStatement:预编译对象, 是Statement对象的子类。
特点:

  • 性能要高;
  • 会把sql语句先编译;
  • sql语句中的参数会发生变化,过滤掉用户输入的关键字。

java.sql.ResultSet接口

作用:处理结果集
方法及作用

1.封装结果集的

  • 提供一个游标,默认游标指向结果集第一行之前。
  • 调用一次next(),游标向下移动一行。
  • 提供一些get方法。

封装数据的方法
Object getObject(int columnIndex); 根据序号取值,索引从1开始
Object getObject(String ColomnName); 根据列名取值。

2.将结果集中的数据封装到javaBean中

java的数据类型与数据库中的类型的关系

byte          tityint
short         smallint
int           int
long          bigint
float         float
double        double
String        char varchar 
Date         date

常用方法

  • boolean next()将光标从当前位置向下移动一行
  • int getInt(int colIndex)以int形式获取ResultSet结果集当前行指定列号值
  • int getInt(String colLabel)以int形式获取ResultSet结果集当前行指定列名值
  • float getFloat(int colIndex)以float形式获取ResultSet结果集当前行指定列号值
  • float getFloat(String colLabel)以float形式获取ResultSet结果集当前行指定列名值
  • String getString(int colIndex)以String 形式获取ResultSet结果集当前行指定列号值
  • String getString(String colLabel)以String形式获取ResultSet结果集当前行指定列名值
  • Date getDate(int columnIndex);以int形式获取Date结果集当前行指定列名值
  • Date getDate(String columnName); 以Date形式获取Date结果集当前行指定列名值
  • void close()关闭ResultSet 对象

可移动游标的方法

  • boolean next() 将光标从当前位置向前移一行。
  • boolean previous() 将光标移动到此 ResultSet 对象的上一行。
  • boolean absolute(int row) 参数是当前行的索引,从1开始,根据行的索引定位移动的指定索引行。
  • void afterLast() 将光标移动到末尾,正好位于最后一行之后。
  • void beforeFirst() 将光标移动到开头,正好位于第一行之前。

关闭资源

对象名.close();

注意:从小向大关闭。

再打开的编辑框内,同时按下Shift+Alt+S ,出现以下画面
20180129164550.png

选择Generate Getter and Setter……,出现以下画面
20180129164632.png
可以点击Select All同时给所有变量添加get,set方法,也可以从左侧选择一些添加get,set方法。
最后点击OK
注意:此方法还可以生成其他方法:比如:toString

不需要main方法,直接对其他方法进行测试,只要选中测试方法,直接运行,就可以显示要测试的方法的对与错,需要在测试方法前面写上@Test,然后导包。就可以运行了。需要注意的是:测试方法要求:不能有返回值,不能有参数。下面是小编写的一个小案例:

package com.sunxiaoning.demo;
import org.junit.Assert;
import org.junit.Test;
public class TestCalc {

    @Test
    public void test1() {
        Calc c = new Calc();
        Assert.assertEquals(9,c.add(3, 6));//第一个参数是期望值,第二个参数,实际值
    }
    @Test
    public void test2() {
        Calc c = new Calc();
        Assert.assertEquals(3,c.div(10, 3),0.4);//第一个参数是期望值,第二个参数,实际值,第三个参数浮动值
    }

}
class Calc {
    public int add(int a,int b) {
        return a+b;
    }
    public double div(double a,double b) {
        return a/b;
    }
}

超链接的优化写法

`<base target="_blank">`   让所有的超链接都在新窗口打开

文本格式化标签

语义标签建议使用
文本加粗标签<strong></strong> <b></b><strong></strong>
文本倾斜标签<em></em> <i></i><em></em>
删除线标签<del></del> <s></s><del></del>
下划线标签<ins></ins> <u></u><ins></ins>

列表

无序列表

<ul>
     <li></li>    列表项
     <li></li>
     <li></li>
</ul>

有序列表

 <ol>
    <li></li>    列表项
    <li></li>
    <li></li>
 </ol>

自定义列表

    <dl>
      <dt></dt>    小标题
      <dd></dd>   解释标题
      <dd></dd>   解释标题
    </dl>

设置icon图标

    <link rel="icon" href="" />

表格

属性

    <caption></caption>    表头  
    cellspacing=”2”    单元格与单元格的距离
    cellpadding=”2”    内容距边框的距离
    colspan=”2”  合并同一行上的单元格
    rowspan=”2”  合并同一列上的单元格
    Valign=”top   |  middle   |  bottom”  垂直对齐方式

表单

输入框属性

    maxlength="10"    限制输入字符长度
    readonly=”readonly”  将输入框设置为只读状态(不能编辑)
    disabled="disabled"  输入框未激活状态(不能编辑,不能使用)
    name="username"   输入框的名称
    value="name"     将输入框的内容传给处理文件
    placeholder   表单提示,兼容性不好,一般不用

下拉列表属性

    multiple=”multiple”  将下拉列表设置为多选项
    <optgroup label=””></optgroup>  对下拉列表进行分组。Label=””  分组名称。

表单信息分组

    <fieldset></fieldset>    对表单信息分组
    <legend></legend>      表单信息分组名称

h5控件

    <input type="url"> url控件
    <input type="date"> 日期控件
    <input type="time"> 时间控件
    <input type="email"> email控件
    <input type="time"> 时间控件
    <input type="number" step="5"> 时间控件,step步进值
    <input type="range" step="5"> 滑块控件,step步进值

标题

#一级标题
##二级标题
###三级标题
####四级标题
#####五级标题
######六级标题

粗斜体

*斜体文本*    _斜体文本_
**粗体文本**    __粗体文本__
***粗斜体文本***    ___粗斜体文本__

链接

文字链接 [链接名称](http://链接网址)
网址链接 <http://链接网址>

列表

普通无序列表

- 列表文本前使用 [减号+空格]
+ 列表文本前使用 [加号+空格]
* 列表文本前使用 [星号+空格]

普通有序列表

1. 列表前使用 [数字+空格]
2. 我们会自动帮你添加数字
7. 不用担心数字不对,显示的时候我们会自动把这行的 7 纠正为 3

列表嵌套

1. 列出所有元素:
    - 无序列表元素 A
        1. 元素 A 的有序子列表
    - 前面加四个空格
2. 列表里的多段换行:
    前面必须加四个空格,
    这样换行,整体的格式不会乱
3. 列表里引用:

    > 前面空一行
    > 仍然需要在 >  前面加四个空格

4. 列表里代码段:

    ```
    前面四个空格,之后按代码语法 ``` 书写
    ```

        或者直接空八个,引入代码块

引用

普通引用

> 引用文本前使用 [大于号+空格]
> 折行可以不加,新起一行都要加上哦

引用里嵌套引用

> 最外层引用
> > 多一个 > 嵌套一层引用
> > > 可以嵌套很多层

引用里嵌套列表

> - 这是引用里嵌套的一个列表
> - 还可以有子列表
>     * 子列表需要从 - 之后延后四个空格开始

引用里嵌套代码块

>     同样的,在前面加四个空格形成代码块
>  
> ```
> 或者使用 ``` 形成代码块
> ```

图片

![图片名称](http://图片网址)

当然,你也可以像网址那样对图片网址使用变量

换行

如果另起一行,只需在当前行结尾加 2 个空格

在当前行的结尾加 2 个空格  
这行就会新起一行
如果是要起一个新段落,只需要空出一行即可。

分隔符

如果你有写分割线的习惯,可以新起一行输入三个减号-。当前后都有段落时,请空出一行:

代码

如果你只想高亮语句中的某个函数名或关键字,可以使用 function_name() 实现

通常编辑器根据代码片段适配合适的高亮方法,但你也可以用 ` 包裹一段代码,并指定一种语言

$(document).ready(function () {
    alert('hello world');
});

表格

| Tables        | Are           | Cool  |
| ------------- |:-------------:| -----:|
| col 3 is      | right-aligned | $1600 |
| col 2 is      | centered      |   $12 |
| zebra stripes | are neat      |    $1 |


小编在这里只向大家介绍一种常用的方式,其他方式就不做介绍了。

导出数据

生成SQL脚本
在控制台使用mysqldump命令可以用来生成指定数据库的脚本文本,但要注意,脚本文本中只包含数据库的内容,而不会存在创建数据库的语句!所以在恢复数据时,还需要自已手动创建一个数据库之后再去恢复数据。
  

mysqldump –u用户名 –p密码 数据库名>生成的脚本文件路径

注意:mysqldump命令是在Windows控制台下执行,无需登录mysql。

恢复数据

执行SQL脚本
前提:必须先创建数据库名

  • 方式一:

执行SQL脚本需要登录mysql,然后进入指定数据库,才可以执行SQL脚本!

SOURCE [要执行脚本文件路径]


  注意:在执行脚本时需要先行核查当前数据库中的表是否与脚本文件中的语句有冲突!例如在脚本文件中存在create table a的语句,而当前数据库中已经存在了a表,那么就会出错!

  • 方式二:

通过下面的方式来执行脚本文件,这种方式无需登录mysql。

mysql –u用户名 –p密码 数据库<要执行脚本文件路径

这也是执行sql脚本文件的方法。

数据的完整性

作用:保证用户输入的数据保存到数据库中是正确的。
确保数据的完整性 = 在创建表时给表中添加约束
完整性的分类

  • 实体完整性
  • 域完整性
  • 引用完整性
  • 用户自定义完整性

实体完整性

实体:即表中的一行(一条记录)代表一个实体(entity)
作用:标识每一行数据不重复。
约束类型: 主键约束(primary key) 唯一约束(unique) 自动增长列(auto_increment)

  • 主键约束(primary key)

注:每个表中要有一个主键。
特点:数据唯一,且不能为null
例:
第一种添加方式:

CREATE TABLE student(
id int primary key,
name varchar(50)
);

第二种添加方式:此种方式优势在于,可以创建联合主键

CREATE TABLE student(
id int,
name varchar(50),
primary key(id)
);
CREATE TABLE student(
classid int,
stuid int,
name varchar(50),
primary key(classid,stuid)
);

第三种添加方式:

CREATE TABLE student(
id int,
name varchar(50)
);
ALTER TABLE student  ADD  PRIMARY  KEY (id);
  • 唯一约束(unique)

特点:数据不能重复。

CREATE TABLE student(
Id int primary key,
Name varchar(50) unique
);
  • 自动增长列

注意:mysql数据库((auto_increment)sqlserver数据库 (identity) oracle数据库( sequence)

给主键添加自动增长的数值,列只能是整数类型

CREATE TABLE student(
Id int primary key auto_increment,
Name varchar(50)
);

INSERT INTO student(name) values(‘tom’);

域完整性

作用:限制此单元格的数据正确,不对照此列的其它单元格比较
域代表当前单元格
约束:数据类型 非空约束(not null) 默认值约束(default)
check约束(mysql不支持)check(sex='男' or sex='女')

  • 非空约束:not null

    CREATE TABLE student(
    Id int pirmary key,
    Name varchar(50) not null,
    Sex varchar(10)
    );

    INSERT INTO student values(1,’tom’,null);

  • 默认值约束 default

    CREATE TABLE student(
    Id int pirmary key,
    Name varchar(50) not null,
    Sex varchar(10) default ‘男’
    );

    insert into student1 values(1,'tom','女');
    insert into student1 values(2,'jerry',default);

引用完整性(参照完整性)

  • 外键约束:FOREIGN KEY

例:

CREATE TABLE student(
sid int pirmary key,
name varchar(50) not null,
sex varchar(10) default ‘男’
);

create table score(
    id int,
    score int,
    sid int , -- 外键列的数据类型一定要与主键的类型一致
    CONSTRAINT fk_score_sid foreign key (sid) references student(id)
);

第二种添加外键方式

ALTER TABLE score1 ADD CONSTRAINT fk_stu_score FOREIGN KEY(sid) REFERENCES stu(id);

用户自定义完整性

反映某一具体应用所涉及的数据必须满足的语义要求。

表与表之间的关系

  • 一对一
  • 一对多(多对一)
  • 多对多:

排序

升序(默认)

SELECT * FROM [表名] ORDER BY [列名] ASC;

降序

SELECT * FROM [表名] ORDER BY [列名] DESC;

多列排序

先对第一列排序,第一列相同后再对第二例进行排序

 SELECT * FROM [表名] ORDER BY [列名1] [ASC/DESC],[列名2] [ASC/DESC]...;

聚合函数

聚合函数是用来做纵向运算的函数:

COUNT()

统计指定列不为NULL的记录行数;

SELECT COUNT([列名]) FROM 表名;

MAX()

计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;

SELECT MAX([列名]) FROM [表名];

MIN()

计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;

SELECT MIN([列名]) FROM [表名];

SUM()

计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0;

SELECT SUM([列名]) FROM [表名];

AVG()

计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;

SELECT AVG([列名]) FROM [表名];

分组查询

当需要分组查询时需要使用GROUP BY子句
注:凡和聚合函数同时出现的列名,一定要写在group by 之后

select [列名]count(*) from [表名] group by[列名];

HAVING子句

select [列名]count(*) from [表名] group by[列名] HAVING [条件];

注:having与where的区别:
1.having是在分组后对数据进行过滤.
where是在分组前对数据进行过滤
2.having后面可以使用聚合函数(统计函数)
where后面不可以使用聚合函数。
WHERE是对分组前记录的条件,如果某行记录没有满足WHERE子句的条件,那么这行记录不会参加分组;而HAVING是对分组后数据的约束。

LIMIT

LIMIT语法

LIMIT用来限定查询结果的起始行,以及总行数。

SELECT * FROM [表名] LIMIT [参数1], [参数2];

第一个参数是开始的条数(从0开始),第二个参数是查询的条数

查询语句书写顺序:select – from- where- group by- having- order by-limit
查询语句执行顺序:from - where -group by - having - select - order by-limit

附录:示例代码

-- 查询所有学生,按年龄升序排列
SELECT * FROM stu ORDER BY age ASC;
-- 查询所有学生,按年龄升序排列
SELECT * FROM stu ORDER BY age DESC;
-- 查询所有雇员,按月薪降序排序,如果月薪相同时,按编号升序排序
SELECT * FROM emp ORDER BY sal DESC,empno ASC;
-- 查询emp表中记录数
SELECT COUNT(*)FROM emp;
-- 查询emp表中月薪大于2500的人数
SELECT COUNT(*)FROM emp WHERE sal>2500;
-- 查询所有雇员月薪和
SELECT SUM(sal) FROM emp;
-- 统计所有员工的平均工资
SELECT AVG(sal) FROM emp;
-- 查询最高工资和最低工资
SELECT MAX(sal),MIN(sal) FROM emp;
-- 查询男生女生分别多少人
select gender,count(*) from stu group by(gender);
-- 查询工资总和大于9000的部门编号以及工资和:
SELECT deptno, SUM(sal)FROM emp GROUP BY deptno HAVING SUM(sal) > 9000;
 -- 查询5行记录,起始行从0开始
SELECT * FROM emp LIMIT 0, 5;


  • Ctrl+N 新建文件
  • Ctrl+O 打开文件
  • Ctrl+S 保存文件
  • Ctrl+C 复制整行(光标放在的行就会被复制)
  • Ctrl+X 剪切整行(光标放在的行就会被剪切)
  • Ctrl+D 选词 (反复按快捷键,即可继续向下同时选中下一个相同的文本进行同时编辑)
  • Ctrl+G 跳转到相应的行
  • Ctrl+J 合并行(已选择需要合并的多行时)
  • Ctrl+L 选择整行(按住-继续选择下行)
  • Ctrl+M 光标移动至括号内开始或结束的位置
  • Ctrl+T 词互换
  • Ctrl+U 软撤销
  • Ctrl+P 查找当前项目中的文件和快速搜索;输入 @ 查找文件主标题/函数;或者输入 : 跳转到文件某行;
  • Ctrl+R 快速列出/跳转到某个函数
  • Ctrl+K Backspace 从光标处删除至行首
  • Ctrl+K+B 开启/关闭侧边栏
  • Ctrl+KK 从光标处删除至行尾
  • Ctrl+K+T 折叠属性
  • Ctrl+K+U 改为大写
  • Ctrl+K+L 改为小写
  • Ctrl+K+0 展开所有
  • Ctrl+Enter 插入行后(快速换行)
  • Ctrl+Tab 当前窗口中的标签页切换
  • Ctrl+Shift+A 选择光标位置父标签对儿
  • Ctrl+Shift+D 复制光标所在整行,插入在该行之前
  • ctrl+shift+F 在文件夹内查找,与普通编辑器不同的地方是sublime允许添加多个文件夹进行查找
  • Ctrl+Shift+K 删除整行
  • Ctrl+Shift+L 鼠标选中多行(按下快捷键),即可同时编辑这些行
  • Ctrl+Shift+M 选择括号内的内容(按住-继续选择父括号)
  • Ctrl+Shift+P 打开命令面板
  • Ctrl+Shift+/ 注释已选择内容(重复则取消注释)
  • Ctrl+Shift+↑可以移动此行代码,与上行互换
  • Ctrl+Shift+↓可以移动此行代码,与下行互换
  • Ctrl+Shift+[ 折叠代码
  • Ctrl+Shift+] 展开代码
  • Ctrl+Shift+Enter 光标前插入行
  • Ctrl+PageDown 、Ctrl+PageUp 文件按开启的前后顺序切换
  • Ctrl+Z 撤销
  • Ctrl+Y 恢复撤销
  • Ctrl+F2 设置/取消书签
  • Ctrl+/ 注释整行(如已选择内容,同“Ctrl+Shift+/”效果)
  • Ctrl+鼠标左键 可以同时选择要编辑的多处文本
  • Shift+鼠标右键(或使用鼠标中键)可以用鼠标进行竖向多行选择
  • Shift+F2 上一个书签
  • Shift+Tab 去除缩进
  • Alt+Shift+1(非小键盘)窗口分屏,恢复默认1屏
  • Alt+Shift+2 左右分屏-2列
  • Alt+Shift+3 左右分屏-3列
  • Alt+Shift+4 左右分屏-4列
  • Alt+Shift+5 等分4屏
  • Alt+Shift+8 垂直分屏-2屏
  • Alt+Shift+9 垂直分屏-3屏
  • Ctrl+Shift+分屏序号 将当前焦点页分配到分屏序号页
  • Alt+. 闭合当前标签
  • Alt+F3 选中文本按下快捷键,即可一次性选择全部的相同文本进行同时编辑
  • Tab 缩进 自动完成
  • F2 下一个书签
  • F6 检测语法错误
  • F9 行排序(按a-z)
  • F11 全屏模式

自己遇到的:

  • lorem+tab输入lorem,然后按tab键自动生成测试文字,默认是100个英文单词,后面添加数字,可以指定测试文字的个数。
  • meta:vp+tab输入meta:vp,然后按tab键,会自动生成viewport的代码。

  • Ctrl+c 复制
  • Ctrl+v 粘贴
  • Ctrl+x 剪切
  • Ctrl+a 全选
  • Ctrl+s 保存
  • Ctrl+z 撤销一步
  • Windows+d 返回桌面
  • Windows+e 我的电脑
  • Windows+r 打开运行
  • Alt+tab 切换软件
  • Alt+F4 关闭当前软件
  • Ctrl+tab 软件文档之间的切换
  • F2 重命名
  • F5 刷新页面
  • F12 在浏览器中打开调试模式
  • F11 全屏