100.oracle:oracle是甲骨文公司的一个大型数据库产品,一般在大型项目中应用较多。 比如:银行、大型企业系统等。和oracle数据库类似的数据库还有db2
Oracle数据库:是一个文件系统,是物理概念。
安装: // SCOTT HR 解锁
实例:一个实例其实是指一系列的后台进程和内存结构// Oracle可以有多个实例,大部份情况就一个实例。 也就是说oracle就是 一整个 大的数据库(实例) ===> 就一个数据库
// 实例 = 数据库
// 实例下面有 N个用户 + N个表空间
用户: 每个 数据库实例 下面可以有 许多用户 // 多个实例可以有相同的用户名的用户
// oracle 中用户的概念相当于mysql中的database的概念
表空间: 实例下面可以有多个表空间,表空间是对物理数据文件的逻辑映射。 // 用户都有自已的默认表空间
// 表空间是逻辑概念,一个表空间对应着一个或者多个物理存储文件(.dbf,.ora)
用户和表空间的关系:
一个用户有一个默认的表空间,
一个表空间可以为多个用户作为默认表空间,
用户和用户之间的数据是隔离,数据不会混。
Oracle数据库源:
driver: oracle.jdbc.OracleDriver
url: jdbc:oracle:thin:@localhost:1521:orcl
username: zhangsan
password: zhangsan
// oracle 中用户的概念相当于mysql中的database的概念
//别名 = 表列名
Oracle的基本命令:
使用指定用户登陆连接到oracle,
Sqlplus username/password [as sysdba 管理员才需要]
显示当前用户
Show user;
退出用户
Exit;
切换用户
Conn username/password [as sysdba 管理员才需要]
查看当前用户可以访问的表有哪些
Select * from tab;
查询某张表的数据
Select * from dept;
查看表结构
Desc dept;
// 不同的用户的表是隔离的,但是权限大的用户可以访问其它用户的表。跨用户访问。
Select * from scott.demp;
1.Oracle的简单查询:
--简单查询
select * from emp;
select empno , ename from emp;
select empno as 员工编号, ename as 员工姓名 from emp; // as 别名
select empno 员工编号, ename 员工姓名 from emp;// 可省略
--字符串连接查询 // 使用distinct可以消除重复的行,如果查询多列的必须保证多列都重复才能去掉重复
select '员工名为'||ename||'的工作是'||job||'的部门是'||deptno from emp;// 记录去重, 必需所有列都一样才算重复 ||: 相当于java程序的 + 连接字符串
select distinct job from emp;
select distinct ename, deptno , job from emp;
--四则运算
select ename 姓名, sal * 12 年薪 from emp;
2.Oracle限定查询A:
--限定查询
select * from emp where sal > 1500;
--为空和非空判断,金为null 或不为null
select * from emp where comm is null;
select * from emp where comm is not null;
--多个条件 并且and ,查询工资大于1500并且有奖金的
select * from emp where sal > 1500 and comm is not null;
--多个条件 或者,查询工资小于1500或者comm为空
select * from emp where sal < 1500 or comm is null;
--not 取反
select * from emp where not(sal <= 1500 or comm is null);
-- 区间
select * from emp where sal >= 1500 and sal <= 3000;
select * from emp where sal between 1500 and 3000;
--时期 // to_date()
select * from emp where hiredate between to_date('1981-1-1','yyyy-MM-dd')
and to_date('1981-12-30','yyyy-MM-dd')
--sql语句不区分大小写,但字段的值区分 // 字段的值区分 大小写!!!
select * from emp where ename = 'SMITH'; // sql语句不区分大小写,但是 它的值 是区分大小写的!!! smith != SMITH
3.Oracle限定查询B:
--范围查询 // in not in
select * from emp where empno = 7369 or empno = 7499 or empno = 7521
select * from emp where empno in (7369, 7499, 7521)
select * from emp where empno not in (7369, 7499, 7521)
--模糊查询 // like _:匹配一个长度 %:N位
select * from emp where ename like '_M%'
select * from emp where ename like '%M%'
select * from emp where ename like '%M__'
select * from emp where ename like '%'
--不等于 != <> // 都是不等 两种写法而已
select * from emp where empno != 7369;
select * from emp where empno <> 7369;
4.Oracle排序. // asc:升序 desc:降序 默认:asc(可省略)
--排序 order by 列名 asc 升序(从小到大) / desc(降序从大到小)
select * from emp order by sal asc, hiredate desc
5.Oracle单行函数.
--尾表 // 虚拟表
select 1 from dual;
--单行函数
--小写变大小写
select upper('smith') from dual;
--大写变小写
select lower('SMITH') from dual;
--首字母大写
select initcap('smith') from dual;
--截取
select substr('hello',1,3) from dual; // 索引 从1开始
--替换
select replace('hello','l','x') from dual;
--计算字符长度
select length('hello') from dual;
--连接字符串
select concat('hello','world') from dual;
select 'hello'||'world' from dual; // 建议用 || 跨平台
--数值函数 取整四舍五入
select round(12.48) from dual;
select round(12.48, 1) from dual; // 保留几位小数
--去除小数
select trunc(231.123) from dual;
select trunc(123.123,2) from dual; // 保留几位小数
--取模 // 取余
select mod(10, 3) from dual;
6.Oracle日期函数.
--日期函数
select sysdate from dual;
--计算两个日期之间的天数 // 日期1 - 日期2
--员工进入公司的周数
select ename ,trunc((sysdate - hiredate) / 7) from emp;
--计算两个日期之间的月数 // months_between('当前时间','要计算的时间') ==== 两个日期之间的月数
select months_between(sysdate,to_date('2016-1-1','yyyy-MM-dd')) from dual;
--员工进入公司的月数
select ename, trunc(months_between(sysdate,hiredate)) from emp;
--加月 // add_months()
select add_months(sysdate, 12) from dual;
--下一个星期几 // next_day()下一个星期X的 当前时间 ==> 以当前时间为基准,查询下一个星期X 的此时此刻的时间
select next_day(sysdate, '星期一') from dual;
--计算当前月最后一天 // last_day(sysdate)
select last_day(sysdate) from dual;
7.Oracle的转换函数.
--转换函数
--to_char 把日期转成字符串 // to_char 把日期转成字符串
select ename , to_char(hiredate, 'yyyy') 年 ,
to_char(hiredate, 'mm') 月,//fmmm:去掉0(2016-1-1) mm:2016-01-01
to_char(hiredate, 'dd') 日,
to_char(hiredate, 'hh') 小时,//hh24:24进制 hh:12进制
to_char(hiredate, 'mi') 分,
to_char(hiredate, 'ss') 秒
from emp;
select ename , to_char(hiredate, 'fmyyyy-mm-dd hh24:mi:ss') from emp; //fm:去掉0(2016-01-01 ==> 2016-1-1)hh24:24进制 hh:12进制
--给数字添加分割符
select ename , to_char(sal, '99,999') from emp; // 1,234
select ename , to_char(sal, '$99,999') from emp; // $1,234
select ename , to_char(sal, 'l99,999') from emp; // ¥1,234
--把字符串转成数值 // to_number('数字字符')
select to_number('10') + to_number('10') from dual;
--把字符串转成日期 // to_date
select to_date('1986-08-21 12:30:21','yyyy-mm-dd hh24:mi:ss') from dual;
8.Oracle通用函数.
--通用函数
--为空处理nvl // nvl('字段',0) 为空处理
select * from emp;
select ename , sal * 12 + comm from emp;--任何数和null相加等于null
select ename , sal * 12 + nvl(comm, 0) 年薪 from emp;
--decode分支判断 decode() ====>switch
select * from emp;
select decode(3, 1, '我是1', 2, '我是2','其它') from dual;
// select switch(x, if(x=1), {'我是1'}, if(x=2), {'我是2'},else{'其它'}) from dual;
select ename , decode(job,
'CLERK', '业务员','SALESMAN',
'销售员','MANAGER','经理','ANALYST','分析师','PRESIDENT','总裁') job from emp;
-- case when end case when end====> if...else if()......else
select ename,
(case
when job = 'CLERK' then
'业务员'
when job = 'SALESMAN' then
'销售员'
when job = 'MANAGER' then
'经理'
when job = 'ANALYST' then
'分析师'
when job = 'PRESIDENT' then
'PRESIDENT'
else
'无业'
end) cjob
from emp;
9.Oracle多表联合查询上.
--多表联合查询
--查询员工的编号 姓名 部门编号和 部门名称
select * from emp , dept;// 笛卡尔积emp*dept
select e.empno, e.ename, d.deptno, d.dname from emp e , dept d where e.deptno = d.deptno// 员工的部门编号 = X部门编号---对上号
--查询员工的上级领导
select e1.ename, e1.empno, e2.ename, e2.empno from emp e1, emp e2 where e1.MGR = e2.empno;// 员工的上级编号 = X员工编号---对上号
10.Oracle多表联合查询下.
--查询员工的上级和部门
select e.empno , e.ename, e1.empno, e1.ename , d.deptno , d.dname from emp e , emp e1, dept d
where e.mgr = e1.empno and e.deptno = d.deptno;
--查询员工的编号 名称 部门名称 和 上级领导以及领导的工资等级
select e.empno,
e.ename,
d.dname,
decode(s.grade,
1,
'一级',
2,
'二级',
3,
'三级',
4,
'四级',
5,
'五级')emp_grade,// 这里 加一个 列名:emp_grade 否则,显示:decode(s.grade,1,'一级',....
e1.ename,
decode(s2.grade,
1,
'一级',
2,
'二级',
3,
'三级',
4,
'四级',
5,
'五级')mgr_grade // 这里 加一个 列名:mgr_grade否则,显示:decode(s.grade,1,'一级',....
from emp e, emp e1, dept d, salgrade s, salgrade s2
where e.deptno = d.deptno
and e.mgr = e1.empno
and e.sal between s.losal and s.hisal// 员工的工资等级 在 xx 范围内
and e1.sal between s2.losal and s2.hisal;// 领导的工资等级 在 yy 范围内
11.Oracle外连接上.// 在两张表关联的时候,在非全量表的关联字段后面加上(+) 就可以做外连接查询
作用:
不会因为另一张表的数据的关联而被筛选掉
1.非全量: 有残缺映射的对象 (映射 = 关联) 数据关联 可能为空// 反正就是在 有残缺映射 的对象后加(+) 记住这个就OK了!!!
2.全量: 被映射对象-----------------> 掌握主动权的 即为全量
--外连接查询
--就是在做查询的时候在非全量表的字段后加上(+)
--查询所有部门的员工
select * from dept d , emp e where d.deptno = e.deptno;// 若 emp_孔明 没映射到 dept(无部门状态) ,孔明就不会被查询到(少了一个员工)
--全量表在左边就是左接连 // (可能有残缺)映射对象 : emp ==> 非全量
// 被映射对象: dept ==> 全量------------------> 掌握主动权的 即为全量
select * from dept d , emp e where d.deptno = e.deptno(+); //全量d , 非全量e where 全量d = 非全量e(+)
//规范:where 前后 表的顺序对应
--全量表在右边就是右接连
select * from emp e , dept d where e.deptno(+) = d.deptno;//非全量e , 全量d where 非全量e(+) = 全量d
12.Oracle外连接下.
--查询员工编号 姓名 上级领导姓名 和 编号
select e.empno, e.ename, e1.empno, e1.ename from emp e , emp e1 where e.mgr = e1.empno(+);// 在 有残缺映射的 对象后面加(+)
/* 分页:
开始记录数: startNum = (pageNo - 1)*pageSize; // pageNo:当前页数 pageSize:每页显示记录数
结束记录数: endNum = pageNo*pageSize + 1;
*/
100.自带工具类:
IOUtils.toString(InputStream ) ==> String text //commons-io-1.4.jar
BeanUtils.populate(javaBean, map); //commons-beanutils-1.8.3.jar
StringUtils.isNotBlank(String s);==> 可以过滤 ""、" "和null即 != null 和 "" 和 ""(可以过滤空格)
StringUtils.isNotEmpty(String s);==> 可以过滤 ""、null 即 != null 和 ""
StringUtils.isBlank(String s);==> "" / null / " "(空格)
StringUtils.isEmpty(String s);==> "" / null
101.重要的类及其方法:
Class:
public ClassLoader getClassLoader()
public InputStream getResourceAsStream(String name)
Class<? extends BaseAction> clazz = this.getClass();//在父类构造方法中传入该参数,则子类继承父类时, this就代表:子类,获得的是:继承此类的子类的Class对象
getSimpleName() // 返回源代码中给出的底层类的简称。 即:cn.it.basedao.domain.User -----> User
DateFormat:
DateFormat df = new SimpleDateFormat("dd/MM/yyyy");// 日期格式化
df.parseObject();
df.format();
value !=null && value.trim().length()>0
Method[] methods = clazz.getMethods();// 获得类中的所有的方法.
FileUtils工具的copyInputStreamToFile
102.自己总结的java辞典:
1.API:即功能.(源码:一堆jar包) // 方法 作用 功能
2.HTML页面:就是一个文本
JSP页面: 是一个Servlet程序// 执行完业务逻辑(一般也就动态获取值——显示数据用) 最终都会向页面 out.write(..)回HTML格式的文本
3.持久化:就是一个IO操作而已 // 从内存————>磁盘
103.对比:
service(ServletRequest req, ServletResponse res);
doFilter(ServletRequest request, ServletResponse response,FilterChain chain);//放行:chain.doFilter(request, response);可过滤所有资源 之前拦截
intercept(ActionInvocation invocation)//放行:invocation.invoke();struts2框架 仅针对action 之前 + 之后
StrutsStatics
ActionContext 此处规定 : contextMap = ActionContext + ValueStack
1.重要属性:
// ActionContext ——————— _values :request 、 session 、 application 、 parameters 、 attr
// ValueStack ——————— _root :action
contextMap是动作访问的数据中心,本质是一个ActionContext类,这个类有一个Map.可以操作 _root 和 _values
class ActionContext{
private Map<String, Object> context;// 此 context —————— contextMap = _root(action) + _values(request、session、application、parameters、attr)
}
/** 查看源码,观察到 明明是 valueStack 包含 ObjectStack 和 ContextMap , 为啥这里又说 context(ContextMap) 包含 root(valueStack) + http对象(ContextMap)???
关于这点,是几个继承造成的!!!
OgnlValueStack implements ValueStack
OgnlValueStack 两个属性 root(ObjectStack) context(:ContextMap)
而 其中的一个属性 context(ContextMap) 它本身也包含这两个属性 _root(ObjectStack) _values(ContextMap)
且struts把 root 赋值给了 _root
所以 其实我们这里的 context = _root(root) + _values*/
2.其子类 // 继承了两个类的API 可以操作_root 和 _values
ServletActionContext extends ActionContext implements StrutsStatics
1.http相关API———— 从 StrutsStatics接口 继承而来
getPageContext()、 get/setRequest() 、get/setResponse()、get/setServletContext()
2.ActionContext相关API———————— 从 ActionContext 继承而来
getContext()
3.自定义的API
getActionContext(HttpServletRequest) 、getValueStack(HttpServletRequest req);// 获取给定的 request 的 Action上下文/值栈
getActionMapping()
4.有参构造:
private ServletActionContext(Map context) {
super(context);
}
104.容易忘的小知识:
Content-Disposition:代表文件需要以下载的形式打开.// attachment;filename=${filename}attachment:附件
<mime-mapping>// 可以在 tomcat的web.xml中 找到setContentType("application/octet-stream") ———————— 告诉浏览器,文件类型为二进制的 , 浏览器就就肯定会以下载的方式打开
<extension>bin</extension> // extension:扩展名MIME:多用途因特网(Internet)邮件扩展
<mime-type>application/octet-stream</mime-type>// octet:八位字节bin:二进制
</mime-mapping>
Context : 上下文
content : 内容
response.setContentType("...");// 告诉浏览器, 我给你响应回来的是什么类型的文件 图片/html/json/二进制/... 官方学名:给响应数据,指定MIME类型
JDK动态代理:实现一个接口实质:父类调用子类 ——————多态
cglib代理:没有实现接口的类,只能使用cglib代理!
// JDBC 仅 连接数据库 + 发送SQL到数据库端
// 执行SQL —————— 数据库
105.java中的标准与实现:// 标准一般由 掌握话语权(有专利权)的公司/联盟/组织 提供 , 实现由下面各个厂商去具体实现
标准(接口) 实现 联盟
JDBC mysql-jdbc.jarSUN
AOP AspectJAOP联盟
Tcp/ip HTTP<——————SOAP W3C// 均为通信协议————————通信:传输数据
106.java基础小知识:
1.又读又写: 字节流 eg:copy文件 中间过程为:字节——————>字节 但是如果用字符流:字节——>字符——>字节 效率肯定下降!!!
只读/写: 字符流 字节读/写到页面就OK! 不用转换为字节! 非要用字符流拷贝,也只能拷贝 纯文本!
2.装饰着模式:
1.A类 和 B类 实现相同的接口;
2.B类的构造中获得 A类的引用;
3.B类重写接口的方法中传入 A类对象需要增强的方法, 然后再其上/下面写需要增强的内容!
107.扩展小常识:
1. FIFO:先入先出(first in,first out)
FILO:先进后出 (first-in,last-out)
2.POJO——————hashMap
每一个pojo对象都可以映射成一个map
/**
掌控自己的思维!我们的大脑就是一台高级计算机!思维就是运行在大脑上的程序!
我们需要不断的学习,不断的完善、升级大脑上的程序!修复负面思维————BUG!
*/
java学习笔记————本质篇7
最新推荐文章于 2021-01-23 17:06:08 发布