东软JavaWeb实训记-DAY2-Oracle开发+注册页表单验证+用户协议倒数js效果实现

sql:结构化的查询语句

T-sql:标准结构化查询语句
1.sql的分类
a)DML:数据管理语句
insert、delete、update

统称为 修改操作
executeUpdatemybatise
b)DQL:数据查询语句
select
i)单表查询
ii)多表查询:
可以是 基表 也可以是 视图 或者是查询的结果
1)不同的表之间链接
2)自连接
以上DML和DQL统称为 CRUD
c)DDL:数据定义语言
create
drop
alter
d)TPL(TCL):事务控制语言
commit
rollback
注意:oracle操作中在客户端(plsql)中进行insert 、delete、udpate 必须commit
  oracle会对操作的表 自动加锁
  团队开发记得commit
e)DCL:数据控制语言
grant:授予用户权限
revoke :收回用户的权限

2.数据类型:
a)数值类型:number
number(n) :最多存放 n 个整数
number(m,n):最多m个数字 其中 n 个小数
number :最大装载 37 个整数
b)字符类型;
char(n):
varchar2(n):
c)date,datetime: varchar2
'12-7月/2017'
2017-07-12
d)blob,clob 4Gvarchar2
存放图片的地址 

3.常用的约束:
主键约束:不能为空 必须唯一 自动添加聚集索引
唯一约束:值必须唯一,可以为nullajax 完成用户名检查
非空约束:该列不能为空
检查约束:check
外键约束:
默认约束:
创建表的时候不添加约束
添加数据 进行 各种  select 查询 如果都能满足要
再通过 alter 添加相应约束

设计软件:完形填空
ooad
4.建表的语法:
create table 表名
(
列名 数据类型 特征,
列名 数据类型 特征
) 

alter table 表名
操作

5.使用oracle数据库


启动oracle的监听程序
启动操作数据库 服务

6.插入语句

insert into 表名(列名列表)values(值)

7.删除

delete from 表名 where 条件 ;条件 以 主键为主

建议 把 delete 用 update 修改 状态完成
8.修改
update 表名 set 列=值,列=值 where 条件 

9.查询语句
a)清楚要显示哪些数据 放入到 select 后面
b)显示数据的来源(来自哪些表或视图) 放在from 的后面 表与表之间以 , 分割
c)搞清楚表与表之间的关联关系,可能两张表没有之间关系,找第三方表放在where 后面 多个关系 以 and 链接

d)是否有其他条件  直接 在where 后 添加 and 链接 即可


10.sql 中的运算符:

a)算术运算符: + :如果一边为null 计算的结果 为 null

nvl(列,值)   :检测 列的值是否 为null 如果为null 输出后面的值

b)比较运算符: > >= < <= = != <>

c)特殊的比较运算符 between  and  相当于 >=  and <= in(值1,值2)

:批量删除  列=值1 or 列=值2

like :模糊查询 % :表示 任意个 任意字符 _ :表示 一个任意字符

自动补全(智能提示):想想百度 Oracle 中的数据 区分大小写

like '_M%' like '____' like '%M_'

d)逻辑运算符:and 运算符的优先级 比 or 高 and or not e)  nvl(列,值) upper() lower()

11.视图:虚拟表,其中不存放任何数据,不能进行insert、delete、update操作

和基本的查询用法相同

他就是 一条复杂sql语句的别名,是预编译

 

create or replace view 视图名称
	as
		select 语句;


因为 scott 账户没有创建视图的权利
必须使用 sys 对scott用户进行授权
grant create view to scott;
			
revoke create view from scott;


12.触发器:
a)对表进行insert、delete、update操作是自动执行的一组 sql代码
b)分类:
before:在把数据装载到表中以前 执行  太监 替皇帝 尝食品
after :在把数据添加到表中后 在执行
instead of :替代 只能添加到视图

before: 要修改本表中的数据,用before触发器
在插入数据是 生成 用户的编号
after :自己操作完后影响其他表中的数据
c)触发的事件,一个事件只能触发一个
insert delete update
d)两张虚拟的表:
:new :存放的是要添加到表中的数据
:old :存放的是 从表中删除的数据
特点:与触发器操作的表 结构完全相同
 只存放一行数据

操作 :new :old
insert       有      无
delete      无
update     有              有


必须知道 该项目需要几张表
就是把链接oracle用到的驱动 jar 添加到 path中

实现的sql语句:

/*
* 
*/
create table user_info
(
      u_id   number primary key,--本身不具备自动增长的能力 序列
      u_name varchar2(30 char), -- 30 char 表示以字符为单位
      u_sex  char(1 char) default'男',
      u_sal  number(10,2),
      u_status  number(1) default 1
)

insert into user_info(u_id,u_name,u_sex,u_sal) 
       values(5,'张三','男',5899.345);
       commit;
update user_Info set u_tel ='123456'
select * from user_info;

alter table user_info
      add(u_tel char(11));--后添加的列必须允许为 null
      
      
 select * from dept;
 select * from emp;
 select * from salgrade; 
 
 
 
C/S :每一个客户端只有 commit 后 服务器中数据才会改变
      
--查询所有员工的姓名和部门名称
1)员工的姓名,部门名称
2)员工的姓名  emp  部门名称 dept
3)之间的关系  emp的deptno=dept的deptno
4)无
select
         ename,dname
from emp e,dept d
where e.deptno=d.deptno

-- 查询 所有员工的姓名,工资及其所在的等级
1)姓名 ename  工资  sal  等级 grade
2) emp      salgrade
3) emp H中 sal 在 salgrade 中losal 和hisal 之间

select
   e.ename,e.sal,s.grade
from emp e,salgrade s
where e.sal between s.losal and s.hisal    
--查询员工的姓名工资,部门名称 及工资的级别
    
select
   e.ename,e.sal,d.dname,s.grade
from emp e,salgrade s,dept d
where e.deptno=d.deptno and e.sal>=s.losal and e.sal <=s.hisal
  
select * from emp;   

-- 查询 入职时间 早于其 直属经理的员工和经理名称
1)员工和经理名
2)emp m  emp  e  通过别名的形式实现  左侧菜单
3)m.empno=e.mgr
4)  m.hirdate>e.hirdate   
 
select
    e.ename e_name,m.ename m_name,e.hiredate e_hiredate
from emp m,emp e
where m.empno=e.mgr and m.hiredate>e.hiredate     
      
      
      
select * from emp;
      
select sal,comm,sal+comm sal from emp;
   
nvl(列,值)   :检测 列的值是否 为null 如果为null 输出后面的值
      
      
select sal,comm,nvl(comm,1) from emp;  

select sal+nvl(comm,0) sal from emp;   
      
select * from emp where deptno<>30;

select * from emp where deptno!=30;

      select * from emp where ename like '%M%' or ename like '%m%'
      
      select * from emp where upper(ename) like '%M%'
      select * from emp where lower(ename) like '%m%'
      
      select * from emp where ename like '_A%'
      --工资>3000  并且 名第二个字母为M  或者 部门为 20   并且 名第二个字母为M
      
      select * from emp
             where (sal>3000 and ename like '_M%') or (deptno=20 and ename like '_M%')
      
     select * from emp
            where (sal>3000 or deptno=20)  and ename like '_M%'
            
            
  
开发过程中 基本 80% 的错误都是 sql语句造成          
        

create or replace view v_emp_dept
as
       select 
          e.ename,d.dname
       from emp e,dept d
            where e.deptno=d.deptno

drop view v_emp_dept;
select * from v_emp_dept;

create sequence seq_id;



create table stu_info
(
       stu_id number primary key, -- 1 2 3 4
       stu_name varchar2(30 char),
       stu_tea_id number          --学生对应的教师编号
)

create or replace trigger trig_stu_id
before
       insert 
on stu_info
for each row  -- sql语句影响几行 触发器就执行几次 
  declare 
    n number; -- 存放表中 主键的最大值 ,
begin
  select max(stu_id) into n from stu_info;
  if n is null then
    n := 0;
  end if;
  :new.stu_id := n+1;
end;

insert into stu_info(stu_name,stu_tea_id)
       values('元芳',1);
  --201707001
  --201707002
  --201708001    
       
 create table tea_info
 (
        tea_id number(9) primary key,
        tea_name varchar2(50 char),
        tea_sex char(1 char) default '男'
 );
 
 alter table tea_info
       add(tea_num number default 0)
 
用户id自增触发器:

 create or replace trigger trig_tea_id
 before
        insert 
 on tea_info
 for each row 
   declare
     n number(9);
 begin
   select max(tea_id) into n from tea_info
          where substr(tea_id,1,6)=to_char(sysdate,'yyyymm');
   if n is null then
     n := to_number(to_char(sysdate,'yyyymm')||'000');
   end if;
   :new.tea_id := n+1;
 end trig_tea_id; 
 

 create or replace trigger trig_stu_insert_delete
 after
        insert or delete
 on stu_info
 for each row    
 begin
   if inserting then
     update tea_info set tea_num=tea_num+1 
            where tea_id = :new.stu_tea_id;
   end if;
   if deleting then
     update tea_info set tea_num=tea_num-1
            where tea_id = :old.stu_tea_id;
   end if;
 end trig_stu_insert_delete;
 
 
 
 
 insert into stu_info(stu_name,stu_tea_id)
        values('老孔',201707001)
 
 select * from stu_info;
 
 
 
 select * from tea_info;
 
 
 insert into tea_info(tea_name) values('太上老君');

-- 如何获取系统时间 201707
select sysdate from dual;
to_char() :把一个数据转换为字符
select to_char(sysdate,'yyyymm')||'000' from dual;

select max(tea_id) from tea_info 
       where substr(tea_id,1,6)=to_char(sysdate,'yyyymm');

insert into tea_info values(201707001,'张飞飞','女')

select substr(tea_id,1,6) from tea_info;



登录验证:

reg.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style type="text/css">
	
	#div{
		font-size: 30px;
		font-style: italic;
		font-weight: bold;
		color: red;
		background-color: black;
		width: 300px;
		height: 200px;
		right: 0px;
		position: absolute;
		bottom: 0px;
	}
	*{
		font-size: 12px;
		margin: 0px;
		padding: 0px;
	}
	.input{
		width: 150px;
	}
	.btn{
		width: 60px;
		height: 25px;
		border: 0px;
		cursor: pointer;
		border-radius:15px;
		line-height: 20px;
	}
	.btn:FOCUS{
		outline: none;
	}
	.success{
		color: green;
		font-weight: bold;
		font-size: 16px;
	}
	.error{
		color: red;
		font-weight: bold;
		font-size: 16px;
	}
</style>
</head>
<body>
<div>
	<form action="" method="post" οnsubmit="return checkForm()">
		<table>
		<tr>
			<td>登录名:</td>
			<td>
				<input class="input" type="text" name="u_name" id="u_name"
					οnblur="checkName()" οnfοcus="nameFocus()">
			</td>
			<td>
				<div id="name_msg">必须以小写字母开始,可以包含数字字母组合,6-12之间</div>
			</td>
		</tr>
		<tr>
			<td>密码:</td>
			<td>
				<input class="input" type="password" name="u_pwd" id="u_pwd">
			</td>
			<td>
				<div id="pwd_msg">密码6-12位之间</div>
			</td>
		</tr>
		<tr>
			<td>确认密码:</td>
			<td>
				<input class="input" type="password" id="re_pwd"
					οnblur="checkRePwd()">
			</td>
			<td>
				<div id="repwd_msg">密码6-12位之间</div>
			</td>
		</tr>
		<tr>
			<td>性别:</td>
			<td>
				<input type="radio" name="u_sex" value="男" checked="checked">男
				<input type="radio" name="u_sex" value="女">女
			</td>
			<td></td>
		</tr>
		<tr>
			<td>电话:</td>
			<td>
				<input class="input" type="text" name="u_tel" id="u_tel">
			</td>
			<td>
				<div id="tel_msg">必须是11位数字</div>
			</td>
		</tr>
		<tr>
			<td>住址:</td>
			<td>
				<select name="u_pro">
					<option value="山东省">山东省</option>
					<option value="江苏省">江苏省</option>
				</select>
				<select name="u_city">
					<option value="青岛市">青岛市</option>
					<option value="济南市">济南市</option>
				</select>
			</td>
			<td></td>			
		</tr>
		<tr>
			<td>自我介绍:</td>
			<td>
				<textarea class="input" rows="5" cols="20" name="u_info" id="u_info"></textarea>
			</td>
			<td>
				<div id="info_msg">自我介绍不能少于 10个字符</div>
			</td>
		</tr>
		<tr>
			<td></td>
			<td align="center">
				<input class="btn" type="submit" value="注册">
				<input class="btn" type="reset" value="重置"
					οnclick="resetMsg()">
			</td>
			<td></td>
		</tr>
	</table>
	</form>
</div>
<div id="div">
	你有一个没有查收的汇款
	小贴士
</div>
</body>
<script type="text/javascript">
	function checkName()
	{
		var name=document.getElementById("u_name").value;
		//^ 表示 从字符串的第一个字符开始匹配
		//$ 表示 匹配到字符串的最后一个字符
		var reg=/^[a-zA-Z][a-zA-Z0-9]{5,11}$/;
		var msg=document.getElementById("name_msg");
		if(reg.test(name))
		{
			msg.innerHTML="√";
			msg.className="success";
			return true;
		}
		msg.innerHTML="×";
		msg.className="error";
		return false;
	}
	function nameFocus()
	{
		var msg=document.getElementById("name_msg");
		msg.innerHTML="必须以小写字母开始,可以包含数字字母组合,6-12之间";
		msg.className="";
		var n=document.getElementById("u_name");
		n.select();
		//n.value="";
	}
	function checkRePwd()
	{
		var pwd=document.getElementById("u_pwd").value;
		var repwd=document.getElementById("re_pwd").value;
		var msg=document.getElementById("repwd_msg");
		if(pwd==repwd)
		{
			msg.innerHTML="√";
			msg.className="success";
			return true;
		}
		msg.innerHTML="×";
		msg.className="error";
		return false;
	}
	function checkForm()
	{
		if(checkName()&&checkRePwd())
		{
			return true;
		}
		return false;
	}
	function $(id)
	{
		return document.getElementById(id);
	}
	function resetMsg()
	{
		$("name_msg").innerHTML="必须以小写字母开始,可以包含数字字母组合,6-12之间";
		$("name_msg").className="";
		$("repwd_msg").innerHTML="必须与密码一致";
		$("repwd_msg").className="";
	}
</script>

</html>


用户 协议倒计时

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style type="text/css">
	#main{
		width: 300px;
		border: 1px solid gray;
		margin: 0px auto;
	}
	table{
		width: 100%;
	}
	.td{
		height: 400px;
		overflow: auto;
	}
</style>
</head>
<body>
	<div id="main">
		<form action="reg.jsp" method="post">
			<table>
				<tr>
					<td>
					<div class="td">
						1.维护和谐社会<br>
						2.尊老爱幼<br>
						3.维护和谐社会<br>
					</div>
					</td>
				</tr>
				<tr>
					<td align="center">
						<input type="submit" id="btn"
						 value="同 (10) 意" disabled="disabled">
					</td>
				</tr>
			</table>
		</form>
	</div>
</body>
<script type="text/javascript">
	var i=9;
	var f;
	function show()
	{
		var btn=document.getElementById("btn");
		btn.value="同 ("+i+") 意";
		i--;
		if(i==-1)
		{
			clearInterval(f);
			btn.value="同   意";
			btn.disabled=false;
		}
		
	}
	//定时器:
	f=setInterval("show()", 1000);
</script>
</html>











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值