java学习笔记————本质篇7

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!
*/

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值