SQL与JDBC笔记

版权声明:版权声明:本文为博主原创文章,博客地址:http://blog.csdn.net/qq_37808895,未经博主允许不得转载。 https://blog.csdn.net/qq_37808895/article/details/88898877

范式:1NF 原子性 2NF 消除非主属性对主码的部分函数依赖 3NF 消除传递依赖 BCNF 消除非主属性对码的部分和传递函数依赖

并发带来的数据不一致主要包括 丢失修改、不可重复读和读脏数据
1.丢失修改

两个事务T1和T2读入同一数据并修改,T2提交的结果破坏了T1提交的结果,导致T1的修改被丢失。

2.不可重复读

事务T1读取某一数据后,事务T2执行更新操作,使T1无法再现前一次读取结果

3.读“脏”数据是指事务T1修改某一数据,并将其写回磁盘,事务T2读取同一数据后,T1由于某种原因被撤销,则T2读到的数据就是“脏”数据。

数据库

数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来。用户可以通过SQL对数据库中的数据进行增加,修改,删除及查询操作

数据库管理系统DBMS:mysql软件

数据库对应于一个应用系统,在系统中有很多功能,每个功能可能涉及到一些对象(类),此时,每个类对应于数据库中的一张表,类中的属性对应表中的字段

SQL StructuredQueryLanguage结构化查询语言
常见的数据库(软件)
MYSQL:开源的免费数据库
Oracle:收费的大型数据库,Oracle公司产品。Oracle收购SUN公司,收购MYSQL。
DB2:IBM公司的数据库产品,收费。常应用在银行系统。
SQLServer:微软公司收费的中型数据库。C#,.net常用。
SQLite:嵌入式的小型数据库,应用在手机端。
Java相关的数据库:MYSQL,Oracle。

对数据库操作
创建数据库
create database 库名 character set 编码

删除一个库
drop database 库名

扫描二维码关注公众号,回复: 5740880 查看本文章

使用库
use 库名

查看当前正在操作的库
select database();

创建一张表
create table 表名(
字段名 类型(长度) [约束],
字段名 类型(长度) [约束],
字段名 类型(长度) [约束]
);

查看表的结构
desc 表名

查看表
show tables

删除库/表
drop database 库名/table 表名

修改表

  1. 添加一列
    alter table 表名 add 字段名 类型(长度) [约束]

  2. 修改列的类型(长度、约束)
    alter table 表名 modify 要修改的字段名 类型(长度) [约束]

  3. 修改列的列名
    alter table 表名 change 旧列名 新列名 类型(长度) [约束]

  4. 删除表的列
    alter table 表名 drop 列名

  5. 修改表名
    rename table 表名 to 新表名

  6. 修改表的字符集
    alter table 表名 character set 编码

查看当前表的编码
show create table 表名

对数据库表记录进行操作(修改)
插入记录
insert into 表名(列名1,列名2,列名3……) values(值1,值2,值3……)

插入所有列
insert into 表名 values(值1,值2,值3……)

修改表记录
不带条件的
update 表名 set 字段名=值, 字段名=值, 字段名=值……
带条件的
update 表名 set字段名=值, 字段名=值, 字段名=值…… where 条件

删除表记录
带条件的
delete from 表名 where 条件
注意,删除后,uid不会重置!

全部删除操作
delete from 表名;

delete与truncate的区别?
delete删除的时候是一条一条的删除记录,它配合事务,可以将删除的数据找回。
truncate删除,它是将整个表摧毁,然后再创建一张一模一样的表。它删除的数据无法找回。
注意:delete删除,uid不会重置!而使用truncate操作,uid会重置(创建了新表)

delete找回:
->start transaction;
->delete from 表名
->rollback;

查询操作总结
select 一般在的后面的内容都是要查询的字段
from 要查询到表
where
group by
having 分组后带有条件只能使用having(聚族函数)
order by 它必须放到最后面

GROUP BY比较类似Excel里面的透视表。
GROUP BY必须得配合聚合函数来用,分组之后你可以计数(COUNT),求和(SUM),求平均数(AVG)等。
MYSQL对 GROUP进行了非ANSI标准的扩展,允许这种select 后含有非 group by 中的列。
在含有Group by子句的查询语句中,对select关键字后的目标列,存在以下规律
使用group by 时,select 涉及的列要么是参与分组的列,要么列包含在聚合函数中。
where将对分组前的所有数据进行筛选。having将对分组后的一组数据处理。

在使用分组操作时的几个注意事项
注意事项一:
如果没有groub by子句,则在select子句中只允许出现统计函数,其他任何字段都不允许出现。
错误范例:select deptno,count(empno) from emp; 这样会造成字段列,和统计列的长度不一至,这是不允许的。
正确范例:select count(empno) from emp;
注意事项二:
在统计查询中,select子句后只允许出现分组字段和统计函数,而其它非统计这段不允许出现。
错误范例:select deptno,ename,count(empno) from emp group by deptno;
这样会造成字段列,和统计列的长度不一至,这是不允许的。
正确范例:select deptno ,ename,count(empno) from emp group by deptno,ename;
注意事项三:
统计函数允许嵌套使用,但是嵌套统计函数之后的select子句中不允许再出现任何的字段,包括分组字段

分组的规律

  1. 当需要使用分组函数而且又需要查询其他列(分组条件)时,一般都要进行分组统计。
    例如:查询每个部门的编号、人数,这时很明显就不能单独使用一个count()函数解决问题了,
    还需要查询deptno列的内容,那么就一定要使用分组。
  2. 一个列一存在重复值的时候就都可以使用分组进行操作,这个列可能是具体表的列,
    也可能是返回的临时表的列。

Limit关键字进行查询操作
limit关键字两个参数的含义(limit a,b)
a:起始位置 a= (要查询位置(页数)-1)*b
b: 每页显示的数目
limit关键字查询数据SQL语句
select * from 表名 limit a,b;

JDBC

Java DataBase Connectivity:Java数据库连接,SUN公司推出的java访问数据库的标准规范(接口)。
1.JDBC是一种执行SQL语句的JavaAPI。
2.JDBC可以为多种关系数据库提供统一访问接口。
3.JDBC由一组Java工具类和接口组成。

开发步骤:
注册驱动–>获取连接–>创建一个执行SQL语句对象–>关闭

注册驱动
DriverManager类的registerDriver()方法的参数是java.sql.Driver,但java.sql.Driver是一个接口,实现类由mysql驱动来提供,mysql驱动中的java.sql.Driver接口的实现类为com.mysql.jdbc.Driver!那么注册驱动的代码如下:
DriverManager.registerDriver(new com.mysql.jdbc.Driver());

注册代码Class.forName(“com.mysql.jdbc.Driver”)

获取连接
获取连接需要两步,一是使用DriverManager来注册驱动,二是使用DriverManager来获取Connection对象。(DriverManager作用)

获取连接的也只有一句代码:
DriverManager.getConnection(url,username,password)

mysql的url
jdbc:mysql://localhost:3306/mydb1
JDBC规定url的格式由三部分组成,每个部分中间使用冒号分隔。
第一部分是jdbc,这是固定的;
第二部分是数据库名称,那么连接mysql数据库,第二部分当然是mysql了;
第三部分是由数据库厂商规定的,我们需要了解每个数据库厂商的要求,mysql的第三部分分别由数据库服务器的IP地址(localhost)、端口号(3306),以及DATABASE名称(mydb1)组成。

下面是获取连接的语句:
Connection con = DriverManager.getConnection(“jdbc:mysql://localhost:3306/数据库名”,”root”,”123”);

还可以在url中提供参数:
jdbc:mysql://localhost:3306/web08?useUnicode=true&characterEncoding=UTF8
useUnicode参数指定这个连接数据库的过程中,使用的字节集是Unicode字节集;
characherEncoding参数指定穿上连接数据库的过程中,使用的字节集编码为UTF-8编码。注意,mysql中指定UTF-8编码是给出的是UTF8,而不是UTF-8。

获取Statement
在得到Connectoin之后,说明已经与数据库连接上了,下面是通过Connection获取Statement对象的代码:
Statement stmt = con.createStatement();
Statement是用来向数据库发送要执行的SQL语句的。
最好用预编译声明语法
PreparedStatement pstmt = conn.prepareStatement(sql);

获取语句执行
执行SQL语句:
int executeUpdate(String sql); --执行insert update delete 语句(DML语句)
ResultSet executeQuery(String sql); --执行select语句 (DQL语句)
boolean execute(String sql); --执行select返回true执行其他的语句返回false
如果返回为true,需要使用getResultSet()获取查询结果
如果返回为false,需要使用getUpdateCount()获取影响行数

处理结果集(ResultSet)
ResultSet实际上就是一张二维的表格,内部有一个“行光标”,光标默认的位置在“第一行的上方”,调用rs对象的next()方法把“行光标”向下移一行。
rs.next();
rs.getInt(col);

释放资源
关闭的顺序是先得到的后关闭,后得到的先关闭
rs.close();
stmt.close();
con.close();

多表查询

  1. 交叉连接查询
    select * from A,B; 得到两个标的乘积
  2. 内连接查询(使用的关键字 inner join --inner可以省略) —查询两个表的交集
    隐式连接:select * from A,B where A.id=B.id;
    显式连接:select * from A inner join B on 条件;
  3. 外连接(使用的关键字 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 条件

配置文件.properties

开发过程中获得的四个参数(驱动,url,账号,密码)通常保存在配置文件中
文件位置建议src下,文件名称后缀为.properties
一行一组数据,格式是key=value(value不自持中文,如果使用非英文字符,进行Unicode转换)

加载配置文件

使用JDK提供的工具类ResourceBundle加载.properties文件,ResourceBundle提供的getBundle()方法用于所提供的.properties文件即可,之后使用getString(key)通过key获取value值

另一宗方法:.properties对象
ClassLoader classLoader = JDBCUtils.class.getClassLoader();
//通过类加载器获取一个输入流
InputStream is = classLoader.getResourceAsStream(“db.properties”);
//创建一个.properties对象
Properties props = new Properties();
//获取输入流
props.load(is);
driver = props.getProperty(“driver”);
url = props.getProperty(“url”);
username = props.getProperty(“username”);
password = props.getProperty(“password”);

DBCP连接池

DBUtils增删改查操作

DBUtils就是JDBC的一个简化开发工具包。
JavaBeanzu组件
JavaBean就是一个类,在开发中常用于封装数据
有以下特性

  1. 需要实现接口:java.io.Serializable
  2. 提供私有字段:private 类型 字段名
  3. 提供getter/setter方法
  4. 提供无参构造

DBUtils三个核心功能介绍

  1. RueryRunner中提供对sql语句操作的API
  2. ResultSetHandle接口,用于定义select操作后,这样封装结果集
  3. DbUtils类,它就是一个工具类,定义了关闭资源与事务处理的方法

猜你喜欢

转载自blog.csdn.net/qq_37808895/article/details/88898877