java编程思想读书笔记3——jdbc

1 篇文章 0 订阅

JDBC

---------------

java database connection,java数据库连接。

 

MySQL

-------------------

1.卸载mysql

...

2.安装MySQL

...

custom安装->自己安装目录(不要中文和空格).

配置向导.

->detail configuration(默认)

->Developer machine(默认)

->Innodb Tablespace setting(默认)

->decision support(默认)

->enable tcp/ip networking(默认)

port number:3306(默认)

勾选"add firewall exception ..."(不是默认)

->选择"manual Select default character set / ..."(非默认)

下拉选择"utf8"

->勾选"install as windows server"(默认)

默认...

->修改安全设置密码

new Root password : root

confirm : root

勾选"enable root access from remote machine"(非默认)

->next

->execute.

 

卸载mysql

-----------------------

1.控制面板卸载mysql

2.删除mysql安装目录

3.删除C:\ProgramData\MySQL数据文件夹

4.删除注册表HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Eventlog\Application\MySQL

5.删除注册表HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Services\Eventlog\Application\MySQL

 

 

RDBMS

------------------

relation database management system,关系型数据库管理系统。

二维表格。

结构严谨。

 

MySQL //sun -> oracle

Oracle //

SQLServer //microsoft

DB2 //IBM

TD //

Sysbase //

PostGre //java

 

去IOE

------------------

IBM //

Oracle //

EMC //共享存储

 

MySQL

------------------

database //数据库

table //表

column //列,field

record //记录

 

 

unique //唯一性约束

not null //非空约束

primary key //主键, 不重复 + not null.

 

MySQL命令

-------------------

[DDL:Data define language,数据定义语言。create drop alter]

mysql>show databases ; //查询哪些数据库,库是表的集合。

mysql>exit ; //退出client

mysql>use mhive ; //使用指定的数据库

mysql>show tables ; //查看库中含有哪些表

mysql>create database big3 ; //创建数据库

mysql>drop database big3 ; //创建数据库

 

[table]

 

mysql>create table mytable(id int,name varchar(20)); //创建表

mysql>show tables; //显式表

mysql>drop table mytable; //删除表

 

[SQL:structure query language,结构化查询语言。]

mysql>select * from test ; //查询表中的所有列,所有行.全表扫描

//* 通配所有列.

mysql>select * from test where id = 1; //where子句查询

 

mysql>insert into test(id,name) values(1,'tom'); //插入数据

mysql>update test set name='jerry'; //更新数据

mysql>update test set id = 3,name='jerry' where id = 1; //使用where子句更新数据

mysql>delete * from test ; //删除所有记录

mysql>delete * from test where id = 1; //

mysql>delete * from test where id < 1; //

mysql>delete * from test where id <= 1; //

mysql>delete * from test where id != 1; //不等于

mysql>delete * from test where id <> 1; // OK,不等于

mysql>delete * from test where id >< 1; // not OK

mysql>delete * from test where id >< 1; // not OK

 

mysql>select * from test where name = 'tom'; // MySQL不区分大小写

mysql>select id,name from test where name = 'tom'; // 投影查询 projection

mysql>select id,name from test where name like 't%'; // 模糊查询 以t开头

mysql>select id,name from test where name like '%t'; // 模糊查询 以t结尾

mysql>select id,name from test where name like '%t%'; // 模糊查询 含有t %通配符多个字符.

mysql>select id,name from test where name like '%t__'; // 模糊查询 含有t,_匹配一个字符.

 

mysql>desc test ; //describe test ,查看表结构

mysql>describe test ; //describe test ,查看表结构

 

mysql>select distinct * from test ; //去重查询

mysql>select * from test where name is null; //null值查询 is not null.

 

mysql>create table users(id int primary key auto_increment , //创建主键(primary key),字段自增(auto_increment)

name varchar(20) ,

age int);

[复制表]

mysql>create table t2 like t1; //类似创建表结构,不含数据

mysql>create table t2 as select * from users; //类似创建表结构,含数据.

mysql>create table test.t2 as select * from big3.users; //复制不同库中的表.

 

mysql>

CRUD

----------

create //insert

retrieve //select

update //update

delete //delete

 

taskkill /? //杀死进程

 

启动MySQL服务

-------------------

cmd>services.msc //打开服务界面

找到mysql

启动

 

cmd>netstat -ano //查看端口

 

JDBC

---------------

java database connection,java数据库连接。

0.Driver

驱动程序.

com.mysql.jdbc.Driver //mysql驱动类

 

1.引入mysql驱动.

复制mysql-connector-java-5.1.17.jar到项目的lib下.

2.添加jar文件到build path(class path)中。

3.

4.

 

C/S

-------------

client / server

Socket / ServerSocket

用户体验.

 

B/S

----------------

browser / server.

ie|firefox / web server.(tomcat)

 

SQL

-----------------

structure query language.

insert into t(f1,f2,...) values(v1,v2,...) ;

delete from t where ...

update t set f1=v1,f2=v2 ,... where ...

select * from t ;

select id,name,... from t ; //projection,投影查询

 

 

 

JDBC

---------------

java database connection.

java数据库连接

规范(接口)。

Driver //驱动程序

driverclass //com.mysql.jdbc.Driver

url //jdbc:mysql://localhost:3306/big3

username //root

password //root

 

//

Class.forName("com.mysql.jdbc.Driver"); //

conn = DriverManager.getConnection(...); //

Statement st = conn.createStatement(); //语句

st.execute("delete from users where id < 4");//

st.close();

 

 

 

 

sql

----------------

select * from users order by id desc ; //默认asc

select * from users order by id asc,name desc,age asc ; //

select * from users order by 1 asc,2 desc,3 asc ; //

 

事务性

----------------

Transaction:事务

commit //提交

rollback //回滚.

和db之间一组操作。

四个特性acid:

 

atomic //原子性,不可分割.

consistent //一致性,不能破坏掉.

isolate //隔离型,事务独立的。

durable //永久性,永久有效.

 

jdbc的事务处理

-----------------

conn.setAutocommit(false); //关闭自动提交

 

conn.commit(); //提交事务

 

conn.rollback(SavePoint sp); //回滚事务

 

 

聚集函数查询

---------------

select count(1) from users;

查询mysql的系统表

---------------------

//查询指定的库中是否含有指定的表,通过查询系统库实现的。

select table_name from information_schema.tables where table_name = 'users' and table_schema = 'big3';

 

use

[DDL]

create

drop

alter

 

分页查询

---------------------

mysql: //limit

// 3:offset, 10:length

//select ... limit 3,10;

oracle: //嵌套子查询rownum

sqlserver //top

 

修改表

--------------------

alter table users add column password varchar(20);

desc users;

update users set password = '123456' ;

 

sql注入:

-------------

select * from users where name = 'tom0' and password='123456'

 

 

Statement

-----------------

执行静态语句.

导致sql注入问题。

PreparedStatement

-----------------

 

 

截断表,数据无法回滚。

-------------------------

truncate table users;

 

Statement < PreparedStatement < CallableStatement

 

 

LOB:large Object.

 

MySQL

-----------------

LongBlob //long binary large object.

Text //

 

 

 

操作大对象

-------------------

1.增加两个字段

alter table users add column pic longblob ;

alter table users add column info text ;

//

conn = getConn(); //连接

conn.setAutoCommit(false); //自动提交

String sql = "select pic from users where id = ?" ;

ppst = conn.prepareStatement(sql);

ppst.setInt(1,1);

ResultSet rs = ppst.executeQuery();

if(rs.next()){

byte[] bytes = rs.getBytes(1);

FileOutputStream fos = new FileOutputStream("d:/KKK.jpg");

fos.write(bytes);

fos.close();

}

conn.commit();

ppst.close();

conn.close();

2.

 

mysql赋值语法

---------------

1.set x := a + b ;

 

2.select count(*) into x from ... ;

 

 

 

存储过程

-------------------------

1.创建add存储过程

mysql>delimiter //

mysql>create procedure up_add(in a int,in b int ,out c int)

mysql>begin

mysql>set c := a + b ;

mysql>end

mysql>//

 

mysql>call up_add(1,2,@x) //

mysql>select @x //

 

2.java调用存储过程

Connection conn = null ;

CallableStatement cst = null ;

try {

conn = getConn(); //连接

cst = conn.prepareCall("{call up_add(?,?,?)}");

cst.setInt(1, 1);

cst.setInt(2, 3);

cst.registerOutParameter(3, Types.INTEGER);

//执行存储过程

cst.execute();

int r = cst.getInt(3);

System.out.println(r);

cst.close();

conn.close();

} catch (Exception e) {

e.printStackTrace();

}

 

3.处理游标

CREATE PROCEDURE curdemo()

BEGIN

DECLARE done INT DEFAULT 0;

DECLARE a CHAR(16);

DECLARE b,c INT;

DECLARE cur1 CURSOR FOR SELECT id,data FROM test.t1;

DECLARE cur2 CURSOR FOR SELECT i FROM test.t2;

DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;

OPEN cur1;

OPEN cur2;

REPEAT

FETCH cur1 INTO a, b;

FETCH cur2 INTO c;

IF NOT done THEN

IF b < c THEN

INSERT INTO test.t3 VALUES (a,b);

ELSE

INSERT INTO test.t3 VALUES (a,c);

END IF;

END IF;

UNTIL done END REPEAT;

CLOSE cur1;

CLOSE cur2;

END

 

 

通过存储过程实现百万记录插入

-----------------------------

1.创建存储过程

create procedure up_biginsert(in num int)

begin

declare i int default 0;

start transaction ;

while i < num do

insert into users(name,password,age) values(concat('tom',i),concat('',i),i % 30);

set i := i + 1 ;

end while ;

commit ;

end

 

2.java代码

Connection conn = null ;

CallableStatement cst = null ;

try {

conn = getConn(); //连接

long start = System.currentTimeMillis() ;

cst = conn.prepareCall("{call up_biginsert(?)}");

cst.setInt(1, 1000000);

//执行存储过程

cst.execute();

System.out.println(System.currentTimeMillis() - start);

cst.close();

conn.close();

} catch (Exception e) {

e.printStackTrace();

}

 

3.java执行DDL语句.

Connection conn = null ;

try {

conn = getConn(); //连接

long start = System.currentTimeMillis() ;

//删除过程

conn.prepareStatement("drop procedure up_biginsert").executeUpdate();

System.out.println(System.currentTimeMillis() - start);

conn.close();

} catch (Exception e) {

e.printStackTrace();

}

 

 

MySQL函数,有返回值

-------------------

1.创建函数

mysql>create function uf_add(a int, b int) returns int return a + b ; //

2.java

3.

4..

 

JDBC

--------------

Connection //

Statement //

PreparedStatement //

CallableStatement //

 

MySQL

--------------

驱动程序.jar

Class.forName("com.mysql.jdbc.Driver");

url //schema://domainname:port/path

//jdbc:mysql://localhost:3306/big3

driverclass //com.mysql.jdbc.Driver

username //root

password //root

 

executeUpdate();

executeQuery(); //ResultSet 1

 

-- 注释

insert into users(name,age) values('tom',12); //插入

concat(',',123); //"," + 123 //

-- 更新

update users set name='xxx',age = 23 where id = 124 //更新

 

-- 删除

delete from users where ...

 

-- 查询

select * from users where ... order by id asc , name desc ;

 

-- 连接查询

 

连接处理

----------------

1.准备数据

-- 执行脚本

-- 删除子表

drop table if exists orders ;

 

-- 删除customers(主表)

drop table if exists customers ;

 

-- 创建customers表

create table customers(id int primary key auto_increment,name varchar(20));

 

-- 创建orders

create table orders(id int primary key auto_increment ,

orderno varchar(20),

price float ,

cid int);

 

-- 给orders添加外检约束

alter table orders add constraint foreign key (cid) references customers (id)

 

-- 添加数据

insert into customers(name) values('tom');

insert into customers(name) values('tomas');

insert into customers(name) values('tomasLee');

insert into orders(orderno,price,cid) values('no001',100.5,1);

insert into orders(orderno,price,cid) values('no002',100.5,1);

insert into orders(orderno,price,cid) values('no003',100.5,2);

insert into orders(orderno,price,cid) values('no004',100.5,2);

2.关联查询

a.内连接

-- (笛卡尔积)

-- 无条件连接.

select a.id aid , a.name aname , b.id bid,b.orderno borderno from customers a ,

orders b order by a.id,b.id;

 

-- 有条件

select a.id aid , a.name aname , b.id bid,b.orderno borderno from customers a ,orders b

where a.id = b.cid order by a.id,b.id;

 

b.外链接(left outer join)

-- 补全

 

-- left outer join

select a.*,b.* from customers a left outer join orders b on a.id = b.cid ;

 

-- right outer join

select a.*,b.* from customers a right outer join orders b on a.id = b.cid ;

 

-- full outer join

select a.*,b.* from customers a full outer join orders b on a.id = b.cid ;

 

3.聚集函数

a.max

最大值

select max(price) from orders ;

b.min

最小值

select min(price) from orders ;

c.avg

平均值

select avg(price) from orders ;

d.count

总数

select count(price) from orders ;

e.sum

总和

select sum(price) from orders ;

f.group by

select cid,max(price) from orders group by cid ;

 

g.group by ... having

-- 对分组之后的记录在进行过滤

select cid,max(price) from orders group by cid ;

h.select ... from ... where ... group by ... having ... order by ...

 

3.OLTP

on line transaction process,在线事务处理。

 

 

4.OLAP

on line analyze process,在线分析处理.

 

transaction

---------------

A:atomic

C:consistent

I:isolate

D:durable

 

commit()

rollback()

rollback(savepoint);

 

事务操作

-------------

读锁(共享)

写锁(独占)

 

 

事务并发执行,三个现象

------------

脏读 //读未提交,

//一个事务读取了另外一个事务改写还未提交的数据,

//如果另外一个事务在稍后时刻回滚则脏读发生了。

 

不可重复读 //读不回去

//一个事务在进行相同条件的查询连续的两次或者两次以上,

//每次结果都不同。

//查询期间,有其他事务进行update操作.

 

 

幻读 //读多了

//一个进行相同条件查询,在后来的查询中会发现原来的记录。

//查询期间,有其他事务进行insert操作.

 

 

ANSI(美国国家标准机构) SQL

---------------------------

1.

2.

3.

4.

 

隔离级别 : isolation level

--------------------------

1.1,read uncommitted,读未提交,导致脏读.

2.2,read committed,读已提交,避免了脏读,不可重复和幻读还能发生。

3.4,repeatable read,可以重复读,避免了不可重复读,幻读还能发生。

4.8,serializable,串行,避免了了以上现象。

 

MVCC

------------------------------

Multiple version concurrent control.

 

设置事务隔离级别

---------------------

1.set session transaction

设置当前回话的所有事务都是该级别。

2.set global transanction ...

设置全局的隔离级别,

3.set transaction ...

设置下次的事务隔离

4.之前的连接的级别不受影响

 

通过mysql客户端验证事务隔离级别

-------------------------------

准备.

-- 关闭自动提交

set autocommit=0 ;

 

[脏读]

[A]

2.关闭自动提交

set autocommit=0;

3.开始事务

start transaction ;

4.执行更新

udpate customers set name = 'jerry' where id = 1 ;

[B]

1.设置B的隔离级别

set session transaction isolation level read uncommitted ;-- read uncommitted | read committed | repeatable read | serializable

 

5.查询customers

select * from customers where id = 1 ; //读到jerry,脏读发生了.

 

[不可重复读]

注释:mysql的repeatable read隔离级别不仅能够避免不可重复读,还能避免幻读。

[A]

1.设置隔离级别 read repeatable read.

set session transaction isolation level repeatable read ;

 

2.关闭自动提交

set autocommit = 0;

3.开始事务

start transaction ;

4.查询

select name from customers where id = 1 ;

6.二次查询

select name from customers where id = 1 ; //jerry

[B]

5.开启事务,更新数据,提交数据。(默认是自动提交)

update customers set name = 'jerry' where id = 1 ;

 

[幻读]

将隔离级别设置为read uncommitted或者read committed均可。

 

mysql默认隔离级别是4---repeatable read.

oracle默认隔离级别是2---read committed,不支持repeatable read。

 

隔离级别

---------------

serializable

[A]

1.set autocommit=0;

2.set transaction isolation level serializable;

3.start transaction;

4.select * from customers;

 

7.select * from customers ; //

 

 

[B]

5.insert into customers(name) values('ttt') ;

6.commit();

 

查询是列转行显式

---------------------

select * from customers \G ;

 

 

-------------------

[悲观锁]

不支持并发。//serializabe就是悲观锁

业务层面上实现:

 

customers

------------------------

| ...| ... | lock|

-------------------------

1 0/1

update ...

 

1.select lock

 

[乐观锁]支持并发,但是感知数据被篡改了。

使用标记位实现。

时间戳:同意

版本:(首选)

update ...,version=? where id = ? and version = ?

 

查询隔离级别

-----------------

select @@global.tx_islation; //全局

select @@session.tx_islation; //当前回话

select @@tx_islation; //下次

 

读操作时上写锁

----------------

1.使用serializable

2.select ... for update,类似于serializable隔离级别。

锁级别

----------------------

行级锁。

 

 

[表级锁]

lock tables customers read local ;

... //其他事务无法插入.

unlock tables;

 

设计模式

----------------

单例模式.

工厂模式

适配器模式

装饰模式

builder模式

 

池化模式(多例模式):使用有效的对象服务于大量的客户端。连接池。

 

对象

------------------

有状态:

无状态:

 

自定义数据源

------------------

 

 

使用第三方开源的连接池实现

---------------------------

1.c3p0

mchage包.

2.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值