Sql*load

1. sql*loader的文件有哪些?

日志文件:概述了作业的成功与失败以及所有相关错误的细节

错误文件(bad file):从输入文件中抽取的行可能会被sqlldr丢弃(原因可能是这些行与控制文件所期望的格式不一致),也可能会被数据库丢失(例如,插入操作可能违反某个完整性约束),在上述两种情况下,这些记录都会被写入错误文件(bad file)

废弃文件(reject file):如果成功的从输入文件中抽取记录,但是由于不匹配某些记录选择标准而被丢弃,那么这些记录会被写入废弃文件(reject file)

控制文件:一个文本文件,是sqlldr如何解释输入文件的内容以及如何利用从输入文件中抽取的记录

实验:将文件中的数据通过sql*loader加载到表中

create table t as select * from emp where 1=2;

将emp的数据输出到操作系统下的一个文件中:

SQL> set trims on
SQL> spool /u01/emp.txt
SQL> desc emp

SQL> select EMPNO||','||
2 ENAME||','||
3 JOB||','||
4 MGR||','||
5 HIREDATE||','||
6 SAL||','||
7 COMM||','||
8 DEPTNO
9 from emp;

EMPNO||','||ENAME||','||JOB||','||MGR||','||HIREDATE||','||SAL||','||COMM||','||
--------------------------------------------------------------------------------
7369,SMITH,CLERK,7902,17-DEC-80,800,,20

SQL> spool off

写控制文件:

vi /u01/load.ctl写入以下内容:

load data
infile '/u01/emp.txt'
badfile '/u01/bad.emp'
discardfile '/u01/discadr.emp'
append
into table t
fields terminated by ','
(EMPNO,
ENAME,
JOB,
MGR,
HIREDATE,
SAL,
COMM,
DEPTNO)

保存退出

开始加载数据:

sqlldr scott/tiger control=/u01/load.ctl log=/u01/emp.log

选项介绍:

1. trailing nullcols

如果一条记录中的结尾字段不存在任何相关占位列插入null值

控制文件内容如下:

vi /u01/load.ctl

load data
infile '/u01/emp.txt'
badfile '/u01/bad.emp'
discardfile '/u01/discadr.emp'
replace
into table t
fields terminated by ','
(EMPNO,
ENAME,
JOB,
MGR,
HIREDATE,
SAL,
COMM,
DEPTNO)

/u01/emp.txt内容如下:

7521,WARD,SALESMAN,7698,22-FEB-81,1250,500,

加载数据:

sqlldr scott/tiger control=load.ctl

SQL> select * from t;

no rows selected

发现没有数据

在控制文件中加入trailing nullcols如:

load data
infile '/u01/emp.txt'
badfile '/u01/bad.emp'
discardfile '/u01/discadr.emp'
replace
into table t
fields terminated by ','
trailing nullcols
(EMPNO,
ENAME,
JOB,
MGR,
HIREDATE,
SAL,
COMM,
DEPTNO)

sqlldr scott/tiger control=load.ctl

SQL> select * from t;

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ---------- --------- ---------- ---------- ----------
7521 WARD SALESMAN 7698 22-FEB-81 1250 500

发现数据已经加载到表中,deptno为null

2. 按照数据文件中的日期格式将数据加载到表中:

vi /u01/load.ctl

load data
infile '/u01/emp.txt'
badfile '/u01/bad.emp'
discardfile '/u01/discadr.emp'
replace
into table t
fields terminated by ','
trailing nullcols
(EMPNO,
ENAME,
JOB,
MGR,
HIREDATE,
SAL,
COMM,
DEPTNO)

/u01/emp.txt数据如下:

7521,WARD,SALESMAN,7698,2001-01-01 19:14:13,1250,500,30

sqlldr scott/tiger control=/u01/load.ctl

SQL> select * from t;

no rows selected

发现日期的格式为yyyy-mm-dd hh24:mi:ss,数据库默认的日期格式为dd-mm-yy,可以将控制文件更改如下:

vi /u01/load.ctl

load data
infile '/u01/emp.txt'
badfile '/u01/bad.emp'
discardfile '/u01/discadr.emp'
replace
into table t
fields terminated by ','
trailing nullcols
(EMPNO,
ENAME,
JOB,
MGR,
HIREDATE date "yyyy-mm-dd hh24:mi:ss",
SAL,
COMM,
DEPTNO)

export NLS_LANG=american
export NLS_DATE_FORMAT='yyyy-mm-dd hh24:mi:ss'

sqlldr scott/tiger control=/u01/load.ctl

SQL> col empno for 9999
SQL> col deptno for 99
SQL> col mgr for 9999
SQL> col ENAME for a5

SQL> select * from t;

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ----- --------- ----- ------------------- ---------- ---------- ------
7521 WARD SALESMAN 7698 2001-01-01:19:14:13 1250 500 30

3. 使用函数,对数据文件中的数据进行加工

vi /u01/load.ctl

load data
infile '/u01/emp.txt'
badfile '/u01/bad.emp'
discardfile '/u01/discadr.emp'
replace
into table t
fields terminated by ','
trailing nullcols
(EMPNO,
ENAME,
JOB "substr(:job,1,3)",
MGR,
HIREDATE,
SAL,
COMM,
DEPTNO)

/u01/emp.txt的内容如下:

7521,WARD,SALESMAN,7698,22-FEB-81,1250,500,30

sqlldr scott/tiger control=/u01/load.ctl

SQL> select * from t;

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ---------- --------- ---------- ---------- ----------
7521 WARD SAL 7698 22-FEB-81 1250 500 30

4. 跳过数据列

vi /u01/load.ctl

load data
infile '/u01/emp.txt'
badfile '/u01/bad.emp'
discardfile '/u01/discadr.emp'
replace
into table t
fields terminated by ','
trailing nullcols
(EMPNO,
ENAME filler,
JOB,
MGR,
HIREDATE,
SAL,
COMM,
DEPTNO)

/u01/emp.txt的内容如下:

7521,WARD,SALESMAN,7698,22-FEB-81,1250,500,30

sqlldr scott/tiger control=/u01/load.ctl

SQL> select * from t;

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ---------- --------- ---------- ---------- ----------
7521 SALESMAN 7698 22-FEB-81 1250 500 30

5. 选择数据

vi /u01/load.ctl

load data
infile '/u01/emp.txt'
badfile '/u01/bad.emp'
discardfile '/u01/discadr.emp'
replace
into table t
when deptno='30'
fields terminated by ','
trailing nullcols
(EMPNO,
ENAME filler,
JOB,
MGR,
HIREDATE,
SAL,
COMM,
DEPTNO)

/u01/emp.txt内容如下:

7369,SMITH,CLERK,7902,17-DEC-80,800,,20
7499,ALLEN,SALESMAN,7698,20-FEB-81,1600,300,30
7521,WARD,SALESMAN,7698,22-FEB-81,1250,500,30

sqlldr scott/tiger control=/u01/load.ctl

select * from t;

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ---------- --------- ---------- ---------- ----------
7499 SALESMAN 7698 20-FEB-81 1600 300 30
7521 SALESMAN 7698 22-FEB-81 1250 500 30

6. 输入空值

vi /u01/load.ctl

load data
infile '/u01/emp.txt'
badfile '/u01/bad.emp'
discardfile '/u01/discadr.emp'
replace
into table t
fields terminated by ','
trailing nullcols
(EMPNO,
ENAME,
JOB,
MGR,
HIREDATE,
SAL,
COMM nullif deptno='30',
DEPTNO)

/u01/emp.txt内容如下:

7369,SMITH,CLERK,7902,17-DEC-80,800,,20
7499,ALLEN,SALESMAN,7698,20-FEB-81,1600,300,30
7521,WARD,SALESMAN,7698,22-FEB-81,1250,500,30

sqlldr scott/tiger control=/u01/load.ctl

SQL> select * from t;

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 30

7. 直接加载数据

从表的高水位线后面直接加载数据

常规加载方法:

SQL> create table t as select * from emp where 1=2;

Table created.

控制文件如下:

load data
infile '/u01/emp.txt'
badfile '/u01/bad.emp'
discardfile '/u01/discadr.emp'
insert
into table t
fields terminated by ','
trailing nullcols
(EMPNO,
ENAME,
JOB,
MGR,
HIREDATE,
SAL,
COMM,
DEPTNO)

数据文件内容如下:

7369,SMITH,CLERK,7902,17-DEC-80,800,,20
7499,ALLEN,SALESMAN,7698,20-FEB-81,1600,300,30
7521,WARD,SALESMAN,7698,22-FEB-81,1250,500,30

开始常规加载:

sqlldr scott/tiger control=/u01/load.ctl log=/u01/emp.log

1* select * from t
SQL> /

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30

SQL> select EXTENT_ID,BLOCK_ID,BLOCKS from dba_extents where SEGMENT_NAME='T';

EXTENT_ID BLOCK_ID BLOCKS
---------- ---------- ----------
0 385 8

analyze table scott.t compute statistics;

SQL> select NUM_ROWS,BLOCKS,EMPTY_BLOCKS from dba_tables where TABLE_NAME='T';

NUM_ROWS BLOCKS EMPTY_BLOCKS
---------- ---------- ------------
14 5 3

SQL> delete scott.t;

14 rows deleted.

SQL> commit;

Commit complete.

SQL> analyze table scott.t compute statistics;

Table analyzed.

SQL> select NUM_ROWS,BLOCKS,EMPTY_BLOCKS from dba_tables where TABLE_NAME='T';

NUM_ROWS BLOCKS EMPTY_BLOCKS
---------- ---------- ------------
0 5 3

使用直接路径加载:

SQL> delete t;

14 rows deleted.

SQL> commit;

Commit complete.

SQL> analyze table t compute statistics;

Table analyzed.

SQL> select NUM_ROWS,BLOCKS,EMPTY_BLOCKS from user_tables where TABLE_NAME='T';

NUM_ROWS BLOCKS EMPTY_BLOCKS
---------- ---------- ------------
0 5 3

sqlldr scott/tiger control=/u01/load.ctl direct=y log=/u01/emp.log

SQL> analyze table scott.t compute statistics;

Table analyzed.

SQL> select NUM_ROWS,BLOCKS,EMPTY_BLOCKS from dba_tables where TABLE_NAME='T';

NUM_ROWS BLOCKS EMPTY_BLOCKS
---------- ---------- ------------
14 9 7

SQL> select EXTENT_ID,BLOCK_ID,BLOCKS from dba_extents where SEGMENT_NAME='T';

EXTENT_ID BLOCK_ID BLOCKS
---------- ---------- ----------
0 385 8
1 393 8

数据库目录

创建目录对象:

conn scott/tiger

create directory dump_dir as '/u01/dir';

SQL> conn /as sysdba
SQL> create directory dump_dir as '/u01/dir';

SQL> grant read,write on directory dump_dir to scott;

SQL> grant all on directory dump_dir to scott;

select * from all_directories;---------owner仍然是sys

数据泵

1. 导出导入表

创建数据泵目录:

SQL> conn /as sysdba
SQL> create directory dump_dir as '/u01/dir';

SQL> grant read,write on directory dump_dir to scott;

SQL> grant all on directory dump_dir to scott;

导出emp,dept表:

[oracle@nylg ~]$ expdp scott/tiger directory=dump_dir dumpfile=exp%U.dmp tables=emp,dept job_name=exp

[oracle@nylg ~]$ cd /u01/dir
[oracle@nylg dir]$ ls
exp01.dmp export.log
[oracle@nylg dir]$ vi exp01.dmp
[oracle@nylg dir]$ vi export.log
[oracle@nylg dir]$ sqlplus scott/tiger

SQL> drop table emp purge;

SQL> drop table dept purge;

SQL> exit

[oracle@nylg dir]$ impdp scott/tiger directory=dump_dir dumpfile=exp01.dmp tables=emp,dept job_name=imp

[oracle@nylg dir]$ sqlplus scott/tiger

SQL> select * from tab;

SQL> select count(*) from dept;

SQL> select count(*) from emp;

查看约束是否存在:

SQL> select CONSTRAINT_NAME from user_constraints where TABLE_NAME='EMP';

select CONSTRAINT_NAME from user_constraints where TABLE_NAME='DEPT'

2. 导出导入用户

导出scott和hr:

[oracle@nylg ~]$ expdp system/a directory=dump_dir dumpfile=schema%U.dmp schemas=scott,hr job_name=schema

删除scott:

SQL> drop user scott cascade;

再将scott导入:

[oracle@nylg dir]$ impdp system/a directory=dump_dir dumpfile=schema01.dmp schemas=scott job_name=schema

[oracle@nylg dir]$ sqlplus scott/tiger

SQL> select * from tab;

将scott改名为s导入到数据库:

[oracle@nylg dir]$ impdp system/a directory=dump_dir dumpfile=schema01.dmp remap_schema=scott:s schemas=scott job_name=schema

[oracle@nylg dir]$ sqlplus / as sysdba

SQL> alter user s identified by s;

SQL> conn s/s
SQL> select * from tab;

3. 导出全库:

导出全库:

expdp system/a directory=dump_dir dumpfile=full%U.dmp full=y job_name=full parallel=4

4. 数据泵的高级用法

(1)通过指定filesize参数,从而控制导出文件的大小

expdp system/a full=y job_name=full parallel=4 dumpfile=dump_dir:full1%U.dmp,test_dir:full2%U.dmp filesize=20M

表示在两个目录下循环生成多个20M的文件

(2) 过滤某些表

vi /u01/exp.par

exclude=table:"like 'EMPLOYEES%'"
schemas=hr
保存退出

先看一下hr中的表:

[oracle@nylg dir]$ sqlplus hr/hr

SQL> select * from tab;

使用参数文件/u01/exp.par导出hr用户,排除EMPLOYEES表:

expdp system/a directory=dump_dir dumpfile=tab%U.dmp job_name=exp parfile=/u01/exp.par

从以上的日志中可以看出EMPLOYEES没有导出

[oracle@nylg dir]$ impdp system/a directory=dump_dir dumpfile=tab01.dmp remap_schema=hr:test job_name=imp

[oracle@nylg dir]$ sqlplus / as sysdba

SQL> alter user test identified by oracle;

SQL> conn test/oracle
SQL> select * from tab;

通过将导出hr用户数据导入到数据库用户test中可以看出没有EMPLOYEES表

可以使用in进行排除表:

vi /u01/exp.par

exclude=table:"in('EMPLOYEES','DEPARTMENTS')"
schemas=hr

[oracle@nylg dir]$ expdp system/a directory=dump_dir dumpfile=tab%U.dmp job_name=exp parfile=/u01/exp.par

从以上的日志中可以看出EMPLOYEES和DEPARTMENTS都没有导出

(3)只导出指定类型的对象(比如只导出存储过程等)

使用此选项必须使用参数文件:

vi /u01/exp.par

include=function
include=procedure
include=package
include=view:"like 'PRODUCT%'"
schemas=hr,oe

expdp system/a directory=dump_dir dumpfile=tab%U.dmp job_name=exp parfile=/u01/exp.par

从以上日志中可以看出没有表

(4)只导出数据不导表定义:

通过content控制导出那些数据

metadata_only:只导出对象的定义信息

data_only:只导出表里实际的数据

all:导出对象的定义信息以及实际的数据,这是默认的导出方式。

例如:只导出hr下的对象定义信息:

expdp system/a directory=dump_dir dumpfile=schema%U.dmp schemas=hr content=metadata_only

[oracle@nylg dir]$ impdp system/a directory=dump_dir dumpfile=schema01.dmp remap_schema=hr:test

[oracle@nylg dir]$ sqlplus / as sysdba

SQL> alter user test identified by a;

SQL> conn test/a
SQL> select * from tab;

SQL> select count(*) from EMPLOYEES;

发现没有数据

SQL> conn hr/hr
SQL> select count(*) from EMPLOYEES

(5)只导出符合条件的数据行

必须用参数文件来完成

vi /u01/exp.par

tables=employees
query=employees:"where department_id=40 order by employee_id"

执行导出:

expdp hr/hr directory=dump_dir dumpfile=emp%U.dmp parfile=/u01/exp.par

将employees表导入到scott中进行验证:

impdp system/a directory=dump_dir dumpfile=emp01.dmp remap_schema=hr:scott

sqlplus scott/tiger
select * from employees;
只有40号部门的数据

conn hr/hr
select * from employees;
原表中有107行

(6)对数据库中的数据采样后,导出采样后的数据,可以用作测试数据:

expdp hr/hr directory=dump_dir dumpfile=schema%U.dmp schemas=hr sample=30

[oracle@nylg dir]$ impdp system/a directory=dump_dir dumpfile=schema01.dmp remap_schema=hr:scott

[oracle@nylg dir]$ sqlplus scott/tiger

SQL> select count(*) from employees;

SQL> conn hr/hr
SQL> select count(*) from employees

SQL> select 33/107 from dual;

(7)中断导出任务后,从中断处继续执行导出任务

在使用数据泵导出数据的时候,可以主动的或由于异常而中断任务

实验:

expdp system/a directory=dump_dir dumpfile=full%U.dmp full=y job_name=full

Export> stop_job
Are you sure you wish to stop this job ([yes]/no): yes

主动中断:ctrl+c

重启导出任务:

expdp system/a attach=full

Export> parallel=2

设置完成后,重新启动导出任务

Export> start_job

start_job开始后,在后台运行,可以调到前台来运行:

Export> continue_client

(8)分布式网络导出导入:

实验:将linux下scott用户导入到windows下

把linux下的scott用户导到window下的u1
u1可以不存在
步骤:

1.在window端:

conn system/a
create database link hndx connect to scott identified by tiger using 'orcl';

2.在window端写参数文件:

network_link=hndx
remap_schema = scott:u1
remap_tablespace = users:example
schemas=scott
job_name = cross_network

3.在linux下给scott受权限

grant exp_full_database to scott;
grant imp_full_database to scott;

4.在window端执行导入:

impdp system/a parfile=c:\imp.txt

外部表

1. 外部表的定义:

表在数据库中是以段存在的,而外部表不是以段存在的,外部表作为数据字典中定义的对象存在
数据存储在操作系统文件里,可以像查询其他表一样查询外部表不能对外部表执行DML操作

2. 外部表的类型:

有两种:一种是sql_load,一种是datapump

3. 创建一个sql_loader的外部表:

生成外部表的数据文件:

[oracle@nylg ~]$ sqlplus scott/tiger

SQL> set trims on
SQL> spool /u01/dir/dept.load
SQL> desc dept

SQL> select DEPTNO||','||
DNAME||','||
LOC from dept;

SQL> spool off
SQL> exit

创建外部表:

create table test_ext
(
deptno number(2),
dname varchar2(14),
loc varchar2(13)
)
organization external
(
type oracle_loader
default directory dump_dir
access parameters
(
records delimited by newline
badfile 'test.bad'
discardfile 'test.dis'
logfile 'test.log'
fields terminated by ','
missing field values are null
)
location ('dept.load')
);

访问外部表:

select * from test_ext;

sql_loader外部表可以通过sql*load来生成创建语法:

控制文件的内容如下:

load data
infile '/u01/emp.txt'
badfile '/u01/bad.emp'
discardfile '/u01/discadr.emp'
insert
into table emp
fields terminated by ','
trailing nullcols
(EMPNO,
ENAME,
JOB,
MGR,
HIREDATE,
SAL,
COMM,
DEPTNO)

生成外部表的创建语句:

sqlldr userid=scott/tiger control=/u01/load.ctl external_table=generate_only

vi load.log内容如下:

将以上语句的表名,目录名还有文件名改为我们想要的,然后执行此语句,就可以得到我们想要的外部表

4. 创建一个datapump类型的外部表:

生成文件:

SQL> create table test_ext
(
deptno,
dname
)
organization external(
type oracle_datapump
default directory dump_dir
location('load.test')
)
as select deptno,dname from dept;

以上语句执行完后,就生成了一个文件:load.test

进入hr用户创建一个外部表,数据文件使用以上生成的load.test

SQL> conn hr/hr
Connected.
SQL> create table test_ext
(
deptno NUMBER(2),
dname VARCHAR2(14)
)
organization external(
type oracle_datapump
default directory dump_dir
location('load.test')
)

SQL> select * from test_ext;

OCA读书笔记(17) - 移动数据的更多相关文章

  1. OCA读书笔记(9) - 管理数据同步

    9.Managing Data Concurrency 描述锁机制以及oracle如何管理数据一致性监控和解决锁冲突 管理数据的并发--管理锁数据的不一致:脏读更改丢失幻影读 脏读:数据是指事务T2修 ...

  2. 进入保护模式(三)——《x86汇编语言:从实模式到保护模式》读书笔记17

    (十)保护模式下的栈 ;以下用简单的示例来帮助阐述32位保护模式下的堆栈操作 mov cx,00000000000_11_000B ;加载堆栈段选择子 mov ss,cx mov esp,0x7c00 ...

  3. OCA读书笔记(10) - 管理UNDO数据

    Undo自动管理与手动管理 undo段自动管理SQL> show parameter undo_management 将undo段改为手工管理SQL> alter system set u ...

  4. 《利用python进行数据分析》读书笔记--第九章 数据聚合与分组运算(一)

    http://www.cnblogs.com/batteryhp/p/5046450.html 对数据进行分组并对各组应用一个函数,是数据分析的重要环节.数据准备好之后,通常的任务就是计算分组统计或生 ...

  5. OCA读书笔记(12) - 数据库维护

    查询优化器统计信息 搜集统计信息: 不是实时的: SQL> conn /as sysdbaConnected.SQL> grant select on dba_objects to sco ...

  6. 【Todo】【读书笔记】大数据Spark企业级实战版 & Scala学习

    下了这本<大数据Spark企业级实战版>, 另外还有一本<Spark大数据处理:技术.应用与性能优化(全)> 先看前一篇. 根据书里的前言里面,对于阅读顺序的建议.先看最后的S ...

  7. OCA读书笔记(2) - 安装Oracle软件

    Objectives: •Describe your role as a database administrator (DBA) and explain typical tasks and tool ...

  8. OCA读书笔记(1) - 浏览Oracle数据库架构

    Objectives: List the major architectural components of Oracle DatabaseExplain the memory structuresD ...

  9. OCA读书笔记(5) - 管理ASM实例

    Objectives:Describe the benefits of using ASMManage the ASM instanceCreate and drop ASM disk groupsE ...

随机推荐

  1. Delphi高仿Windows扫雷游戏(全部都是贴图绘制)

    http://www.newxing.com/Code/Delphi/game/543.html http://www.newxing.com/Code/Delphi/Network/1324.htm ...

  2. WM_PAINT消息详解,使用InvalidateRect或InvalidateRgn函数刻意产生WM_PAINT消息(WIN7里有变化,“调整视觉效果”,将“启用桌面组合”去掉)

    什么时候会触发WM_PAINT消息消息呢? 以下内容来自大名鼎鼎的<Windows程序设计(第五版)> 大多数Windows程序在WinMain中进入消息循环之前的初始化期间都要呼叫函数U ...

  3. jQuery.mobile.changePage() | jQuery Mobile API Documentation

    jQuery.mobile.changePage() | jQuery Mobile API Documentation <script> $.mobile.changePage( &qu ...

  4. TCP协议中的计时器

    说明:  本文仅供学习交流.转载请标明出处,欢迎转载! 本文是下面文献相关内容的总结 [1] <TCP/IP具体解释 卷1:协议> [2] <TCP/IP协议族 第4版> [3 ...

  5. 杂题_POJ上的过桥问题

    本文出自:http://blog.csdn.net/svitter 过桥问题解释:一条船能够坐两个人,可是有非常多人要过河,所以送过一个人去,还有一个人还要回来接.使全部人过河之后时间最短,怎样求? ...

  6. Spring通过工厂创建实例的注意事项

    假设第三方(or别的team)提供一个工厂类(此类是不能够改动的.往往以jar包形式提供的),须要供给我们项目来使用. 可是我们自己的项目使用了spring来配置,所以我们当然希望可以通过spring ...

  7. OnClick事件的Sender参数的前世今生——TWinControl.WinProc优先捕捉到鼠标消息,然后使用IsControlMouseMsg函数进行消息转发给图形子控件(意外发现OnClick是由WM_LBUTTONUP触发的)

    这是一个再普通不过的Button1Click执行体: procedure TForm1.Button1Click(Sender: TObject); begin ShowMessage('I am B ...

  8. jdbcType与javaType的对应关系

    java.sql.Types 值 Java 类型 IBM DB2 Oracle Sybase SQL Informix IBM Content Manager BIGINT java.lang.lon ...

  9. Ubuntu下安装ADT(图文教程)

    个人感觉Ubuntu下安装ADT跟在Windows大同小异 一.装上JDK和Eclipse 如果还没有装上的,请参考我前面的博文: http://blog.csdn.net/ljphhj/articl ...

  10. Linux下搭建 Cocos2d-x-2.1.4 编译环境

    [tonyfield 2013.09.04 ] 参考 Linux下搭建 Cocos2d-x-2.1.4 编译环境 导入 HelloCpp 例程 1. Java 入口 HelloCpp.java Hel ...