javaWeb之一些基础:JavaScript,jQuery,Ajax,JSP,Servlet,MySQL,

JavsScript,jQuery与Ajax

  • 引入js:<script src=”….js” type=”text/javascript”>
  • 引入css样式:href="….css" type=””>
  • ”>
  • href :指向网络资源所在位置,建立和当前元素(锚点)或当前文档(链接)之间的联系

浏览器解析时,建议使用 link (XHTML标签,还可加载其他)方式加载 CSS,因为会并行下载资源并且不会停止对当前文档的加载和处理而不是使用 @import (CSS范畴,只加载CSS)方式,因为它需要页面完全载入以后再加载

  • src :在请求 src 资源时会将其指向的资源下载并应用到文档中,比如 JavaScript 脚本,img 图片

浏览器解析时会暂停其他资源的下载和处理,直到将该资源加载、编译、执行完毕,图片和框架等也如此,所以建议把 js 脚本放在底部而不是头部

JS数据类型
三基本 数值:isNaN(value)判断是否是一个数字
布尔(true/false)
字符串(>=0个Unicode字符));===比较字符串;
两引用 对象
数组
两特殊 Null(无值或无对象)
undefined(无对象的属性或声明了变量但未赋值))

in:测试对象中是否存在该属性:result=property in Object;

instanceof:对象是否是类的实例:result=object instanceof class;

new:创建对象;

typeof:返回数据的类型的字符串表示,6种可能:number/string/Boolean/object/function/undefined;

void:避免返回值;

消息框:[window.]alert(“…”);confirm()/prompt():提示;提供字符串参数(默认”undefined”),点击“确定”或者“取消”按钮;特殊的console.info/log();//写入控制台和调试JS

 

==》Array:数组API

javaWeb之一些基础:JavaScript,jQuery,Ajax,JSP,Servlet,MySQL,_第1张图片

 

==》Date:

构造器有无参;有参数毫秒值;有参数年、月…列表

getDate();getDay();getFullYear();getHours();getMilliseconds();getMinutes();getMonth();getSeconds();getTime()1970以来的毫秒数;parse()解析时间字符串并返回毫秒数

 

==》json数据解析:

  • 前台解析json数据:一般后台传来的是字符串/集合格式数据;dateType:”json”

eval():解析任意数据;不安全

JSON.parse()等API:格式检查,符合才解析;安全

  • 后台解析json数据:一般前台传来map,map中保存json格式数据

JSONObject类API:与map/javaBean的转换

JSONArray:与数组的转换

 

==》文档document-》根元素(html)-》元素element-》文本:

document.getElement[s]ById/TagName(元素标签名如“p”)/Class();

document.write();

element.innerHTML=””;

element.具体属性名如src=””;

element.style.具体样式名如color=””;

document.forms;//获取所有form并返回集合,然后可用下标操作指定form;

element.value;//获取元素的value,可用作表单验证

document.createElement(“元素标签名”)

document.createTextNode();

element.appendTo/appendChild(anotherElement)/insertBefore/after()

element.remove/removeChild(子element);

 

事件:定义function,然后元素的onclick()引用它

其他事件:

onload()/onunload()页面加载/离开时处理,可处理cookie;

onchange();onmouseover/out();onmouseup/down();onfocus/blur();event.target/srcElement事件源;stopPropagation()阻止冒泡;preventDefault()阻止默认事件/行为

 

BOM:window

document、Screen屏幕、Location页面地址、History浏览历史、Navigator访问者信息、PopupAlert消息提示框、Timing计时器(计时时间setTimeout/Interval(),clearTimeout/Interval())、Cookies识别用户、尺寸(不同浏览器写法不同)

 

Jquery:

语法:$/jQuery(selector).action();//选择(器,查找)+操作

1、选择(器):基于元素的 id、类、类型、属性、属性值等"查找"(或选择)HTML 元素。 它基于已经存在的CSS选择器

选择器
元素选择器 $(“元素名") $("p").hide();
#id选择器 根据元素的id属性选取指定元素

测试

$("#ID").hide();

.class选择器 根据元素的class属性选取指定元素

测试

$(".Class").hide();

伪类选择器:与其他选择器配合使用

$("*"):所有;

$(this):当前元素;

$("p.Class”):class属性为Class的

元素;

$("p:first/last"):第一个/最后一个

元素;

odd/even奇数/偶数;

:eq/gt/lt()/not(selector)等于/大于/小于/不为;

:header/animated/empty;

:hidden/visible;

:enabled/diabled/selected/checked;

form表单选择器 根据元素的type类型选择 :input(所有)、text、password、radio、checkbox、submit、reset、button、image、file
属性选择器:[XPath]表达式 根据属性名或属性限制选择

$("[href]"):选择所有带有href属性的元素;

$("a[href='a.jpg']"):选择href属性值为a.jpg的元素

 

2、操作:

1)触发事件(或者将函数绑定到事件):

bind()/delegate()/unbind()/undelegated()附加事件(处理器)/blur()失去焦点/change()/click()/dbclick()双击/die()移除/error()/focus()/keydown/up/press()/load/onunload()/mouseup/down/enter/leave/move/out/over()/ready()/sesize()/scroll()/select()/submit()/toggle()/trigger()/

2)触发效果(一般在事件如点击之后):

animate()/delay()/fadeIn/Out/To()/show()/slideDown/Toggle/Up()/stop()/toggle()/hide()

 

DOM文档操作:设置都是(key,value)形式;(一般在事件如点击之后)

get()/index();after()指定元素之后插入内容/append/To()/before()/clone()/detach()删除/empty()/insertBefore/After()/prepend/To()/replaceAll/With()/unwrap()替换父元素/wrap/All/Inner()包裹

 

text()、html()、val()

attr()/addClass()/hasClass()/remove/Attr/Class()/toggleClass()/;

样式操作:css()/height()/offset()/position()/width()

遍历匹配:向上parant()/parents()/parentsUntil();向下children()/find();同胞siblings()/next()/nextAll()/nextUntil()/prev()/prevAll()/prevUntil();过滤first()/last()eq();自定义filter()/not()匹配/不匹配的;each();has()/is()/map()

 

JSP,Jstl与EL

动态生成html,xml或其他格式文档的web页面,即html中插入java代码(被JSP标签<% %>包裹);跨平台;侧重视图

JSP生命周期
1)加载 web容器识别这是对JSP的请求,通过url或.jsp文件把此请求交给JSP引擎
2)编译 解析JSP文件,转为servlet程序;servlet容器编译源文件为字节码类文件
3)初始化 创建实例,调用初始化方法init();(仅一次,可初始化数据路连接,打开文件,创建查询)
4)执行 调用服务方法service();参数为HttpServletRequest和HttpServletResponse;每个请求都调用一次,产生对应的response
5)销毁 调用销毁方法destroy()销毁实例

表达式:<%= …/>;

注释<%--…-->或者

 

3指令:请求处理之前,设置整个JSP相关属性
<%@ page…/> 依赖属性,如脚本语言,error页面,缓存需求

buffer缓冲区大小;

autoFlush控制out的刷新;

contentType;errorPage;isErrorPage;extends;import(注意没有);

info页面描述信息;

isThreadSafe本页面访问是否线程安全/单线程(而servlet实现单线程需要实现SingleThreadModel接口;不推荐单线程,它会对每次请求都创建实例);

language;session是否使用;

isELlgnored是否执行EL表达式;isScriptingEnabled

<%@ include file=”相对url”…/> 包含其他文件,然后编译  
<%@ taglib…/> 引入标签库  

 

9行为:请求处理时发生
包含静态动态资源;动态加载即不是同时编译
加载并初始化JavaBean组件
设置/插入JavaBean组件到output;当其位于
转发(包含request对象);可带参数
使用插件运行
动态创建xml元素
定义xml元素的属性
xml主体
封装模板数据

它们都具有id(动作的唯一标识)和scope(动作的生命周期:page-request-session-application)属性

9对象
request HttpServletRequset实例,通过方法获取http头信息,cookie,http方法等
reponse HttpServletResponse实例,可添加cookie,时间戳,状态码;void setHeader()/setLocal()/setStatus();…
session HttpSession实例,会话跟踪,保存用户状态信息
out PrintWriter实例,向response中写入内容,输出结果到页面
application ServletContext实例,应用上下文
config ServletConfig实例,一些配置信息
pageContext PageContext实例,存储其他对象的引用;常用方法removeAttribute()
page 类似于this对象,页面本身
exception Exception实例,JSP发生错误时的异常;

异常处理:使用此对象的方法;或者编写errorPage;或者java的try…catch

表单处理-读取表单数据:

(默认)get:参数在url?后,&连接,不安全,<=1024字节;

post:数据隐藏提交,无大小限制,安全request.getParameter[Values]()/getParameterNames();getInputSteeam()

   

JSTL:JSP标签库

<%@ taglib prefix=”c” uri=http://java.sun.com/jsp/jstl/core />

:显示,同<%= >/保存/删除数据

:处理异常

,其下条件分别为true和false

解析和格式化(文本、日期、时间、数字)标签:core换为fmt且更改前缀

……

SQL标签:sql下

,其下写sql的CURD

XML标签:以及JSP的XML处理

JSTL函数:functions下

自定义标签

 

EL表达式:

${expr};简化JavaBean的访问;expr通常为算数表达式和逻辑表达式,操作符如同java,如+,-,%,!=,>=,||(or),empty……;特殊的如用.userName或者[“username”]访问Bean属性

隐含对象:pageScope/requestScope/sessionScope/applicationScope:各自的作用域中的对象直接访问,如requestScope.user

param/paramValues:request对象的参数,字符串/集合;如String name = request.getParameter(“username”),用EL表达式获取${param[“username”]}或者${param.name}

initParam:上下文初始化参数

header/headerValues:http信息头,字符串/集合;同上;request.getHeader()

cookie:

pageContext:JSP中pageContext对象的引用

实例:获取表单中多选框的值:

var checkbox=document.getElementsByName(“checkbox”);

for(i

if(checkbox[i]).checked)

alert(checkbox[i].value);// 或者声明一个数组new Array()来保存值

}//js

String[] arr=request.getParameterValues(“checkbox”);

 

实例:

  1. 自定义错误页面:页面异常时跳转

<%@ page language=”java” import=”java.util.*” pageEncoding=”UTF-8” errorPage=”error.jsp”%>

<% page isErrorPage=”true”%>//针对指定网页

//web.xml配置针对所有页面

404

/error.jsp

  1. java片段动态生成表格/下拉列表

<% String[] arr={“…”,”…”,…} %>

  

<% for(int i=0;i

  

    <% } %>

  1. 获取表单提交信息/(超链接)访问请求参数

request.setCharacterEncoding(“UTF-8”);

String str = request.getParameter(“表单域的name值”);

  1. request域传递数据-转发

request.setAttribute(key,value);//key为String类型,value为传递的值如object,“404错误”

request.getAttribute(key);//通过key获取

  1. cookie保存和获取信息(name-value形式)
Cookie[] cookies = request.getCookies();//从request获取对象集合
for(Cookie cookie:cookies){
    cookie.getName();//获取指定cookie名
    cookie.getValue();//获取值
    cookie.setMaxAge(long);//有效期
    Cookie c=new Cookie(name,value);//实例化一个cookie对象
    response.addCookie(c);//保存cookie[发送到客户端]
}

cookie中保存中文:

java.net.URLEncoder.encode(name,”UTF-8”);//编码

java.net.URLDecoder.decode(name);//解码

  1. Application对象(生命周期随服务器)实现网站访问计数器
<% 
int count =0;
synchronized(application){
    if(application.getAttribute(“times”) == null){
    i++;//首位访问
} else{
    i=Integer.parseInt((String)application.getAttribute(“times”));
    i++;
}
application.setAttribute(“times”,Integer.toString(i));
} 
%>

 

session相关:

保存用户登录信息,页面跳转后从session获取信息;手动销毁session:session.invalidate();

统计用户在站点的停留时间:继承session的监听器(session与属性的绑定与解除事件)HttpSessionBindingListener的主要方法valueBound()和valueUnbound(),前者在向session中写入实现类对象时自动触发,后者在从session中移除对象时触发;session销毁时间-创建时间

统计在线人数:

 

Servlet

以线程方式处理请求;cookie处理:二次访问时,浏览器会将cookie发送到服务器;侧重控制逻辑;

Servlet/ServletConfig接口

|--GenericServlet实现以上两个接口的类;协议无关

|--HttpServlet基于http协议实现类

|--自定义类实现doGet/Post():典型如SpringMVC的DispatcherServlet

字段1 字段2
<% =i %> < %= arr[i] %>
Servlet
inti(servletConfig):即初始化servlet是通过调用配置类
getServletConfig():Servlet配置信息
service(servletRequst,servletResponse)
getServletInfo():Servlet相关信息如作者,版权
destroy()

 

ServletConfig:对Servlet配置信息的抽象;如标签实现参数初始化
getServletName():
getInitParameter():获取配置参数;servlet标签下有
getInitParameterNames()

getServletContext():它关联ServletContext类(tomcat容器启动时创建的web项目应用上下文即代表当前web应用本身(spring框架封装为ApplicationContext),可以用来保存application级的共享属性如get/set/removeAttribute();计数器保存在其中可记录用户访问次数)

GenericServlet:新增log()记录日志和异常(不常用):

 

HttpServlet
重写了service():将servletRequest/servletResponse转为httpServletRequest/httpServletResponse;根据http请求方法路由到7个不同处理方法(doHead()调用了doGet()但返回空body的response)
getLastModified(httpServletRequest)
doGet/Head/Put/Delete/Options/Trace/Post(httpServletRequest,httpServletResponse)
诸多封装类获取信息头,如Cookie[] getCookies();Enumeration getAttributeNames()返回请求中所有属性的名称集合,getParameterNames()参数集合;HttpSession getSession()没有则创建;String getRequestURI();…
new Cookie(name,value);一个cookie(客户端保存的一小段文本)通常包含一个键值对(会被解析为URL),一个GMT(格林尼治时间),一个路径,一个域名;获得或者新建cookie以后,get/setMaxAge()/Name()/Value()/Path()…;然后添加到response.addCookie(cookie);删除cookie:手动浏览器删除,或者获取后有效期设为0,添加到response
HttpServletRequest
getScheme()://请求协议
getServerName()://服务器名;本机返回localhost

getServerPort()://服务器端口号,Tomcat默认8080

getContextPath()://应用上下文的入口url;一般为“/项目名”

getRequestURL()://完整请求路径

转发到:RequestDispatcher的forward()

request.getRequestDispatcher(“to.jsp”).forward(request,response);

重定向(简单页面跳转):HttpServletResponse的sendRedirect()

response.sendRedirect(“login.jsp”);

    会话跟踪技术:cookie(sessionId标识,有些浏览器不支持;不安全;只能存储字符串),隐藏的表单字段,URL重写,HttpSession接口(安全;保存任意类型数据)

    session技术:HttpSession

       request.getSession();

attribute被设置在request中,则仅当前request有效;设置在session中则在有效期间都被共享;getParameter()系列方法是从前端页面或url参数中获取数据;

       get/set/removeAttribute[Names]();getCreationTime();getId();invalidate()丢弃整个session会话;setMaxInactiveInterval(int)设置过期时间(秒)

http状态码:200;3xx暂时转发;400BadRequest,403Forbidden,404NotFound,405MethodNotAllowed,408RequestTimeout;500ServerError

 

过滤器:

(继承Filter的java类)动态拦截请求和响应,修改和使用其中的信息;常用过滤器如身份验证,数据压缩,加密,触发资源访问事件,图像转换,日志记录与审核,MIME-TYPE链(文档编码)

web.xml中Filter声明过滤器,映射到servlet或url;声明中设置初始化参数中注册要过滤的servlet路径

1)程序启动时创建对象,读取配置文件(按顺序)并调用init(FilterConfig)实例化;filterConfig.getInitParameter()获取配置的初始化参数

2)相关接口:Filter,FilterConfig,FilterChain;实际过滤操作,调用doFilter(ServletReuqest,ServletResponse,FilterChain);chain.doFilter(request,response)请求传回过滤链,由下一个过滤器使用

3)销毁destroy()

 

文件上传:

   

      

 

    实例:

  1. 金额数字转为汉字

String[] arr1={“”,”拾”,”佰”,”仟”};

String[] arr2={“零”,”壹”,”贰”,”叁”,”肆”,”伍”,”陆”,”柒”,”捌”,”玖”};

  1. 字符串转为数组

前端复选框值被js设置为长字符串var checks=document.getElementsByName(“ckeck”);

var string=””;

for(var i=0;i

    if(ckecks[i].cheacked==true)

        string+=checks[i].value+”,”;

}

隐藏表单域提交到后台

document.getElementById(“string”).value=string;

后端通过String的slit(regex)以regex表示的符号切割长字符串为字符串数组

  1. 长整数分位显示;long最长为19位

转为字符串以后,StringBuffer的reverse()先反序

  1. POI组件将数据导出到Excel表

response.setContentType(“application/vnd.ms-excel”);

ServletOutputStream out=response.getOutputStream();

HSSFWorkbook wb=new HSSFWorkbook();//创建excel表格

HSSFSheet sheet=wb.createSheet(“数据”);//创建工作簿

sheet.setColumnWidth(4,5000);//设置列宽

HSSFRow titileRow=sheet.createRow(0);//标题行

HSSFCell titleCell=titleRow.createCell(0);//标题行的第一个单元格

titileCell.setCellValue(“用户名”);

…n个单元格

HSSFRow valueRow=sheet.createRow(1);//创建第二行

…对应n个单元格且设值

wb.write(out);out.flush();out.close();

  1. 过滤器:防盗链,日志记录,字符替换,异常捕获,用户及权限验证,字符编码,弹出对话框形式的公告信息,文件上传

 

项目安全性:

攻击性安全:input框JS验证,java代替重复校验,避免非法字符和空格和SQL注入;特殊模块如登录时生成验证码,支付时产生随机码,都有时间限制

访问安全:页面静态化,使用缓存,减小服务器压力

数据安全:数据库敏感数据加密后存储;数据库读写分离;备份

 

JDBC

  • Driver:加载数据库驱动(jar包);Class.forName(“”)
  • DiverManager:管理JDBC驱动服务类,获得数据库连接:DiverManager.getConnection(url,user,password)
  • Connection:数据库连接对象,创建Statement对象

    Statement createStaetment();

    PrepareStatement prepareStatement(sql);

    CallableStatement prepareCall(sql);

    Savepoint setSavepoint([name]);//创建保存点

    void setTransactionIsolation(level);//设置事务隔离级别

    void rollback([savepoint]);//回滚(到保存点)

    void setAutoCommit(boolean);//关闭自动提交,打开事务;因为Connection默认会自动提交,即关闭事务

    void commit();//提交事务

  • Statement(执行SQL语句,涉及批量更新方法)-PreparedStatement(安全,防SQL注入(如永真表达式),in参数,占位符,预编译SQL语句即下面的方法不传入sql参数,新增void setXxx(parameterIndex,value))-CallableStatement(out参数,调用存储过程):
  • ResultSet excuteQuery(sql);操作结果集

    操作指针指向数据:absolute(row)row行;beforeFirst()初始状态,首行之前;first()首;previous()上一行;next()下一行;last()尾行;afterLast()尾行之后

    然后通过索引或列名(推荐)获得列数据:getXxx(index/string)

       boolean excute(sql);

int excuteUpdate(sql);//受影响行数为0或没有结果,返回false

结果集从1开始;可回滚;

    回收和关闭资源

SQLException:应用无法连接数据库;查询语法错误;查询目标表或列不存在;插入或更新的数据违反数据库约束

 

    处理Blob(二进制长对象如图片,声音文件)类型数据:PrepareStatement的setBinaryStream(parameterIndex,inputStream)保存Blob数据到数据库;ResultSet的getBlob(columnIndex)取出得到Blob对象,对象的getBytes()获取数据,或getBinaryStream()获取数据的输入流

    最佳实践:批量操作;使用PreparedStatement避免SQL异常;使用数据库连接池;通过列名获取结果集而不是下标;

 

 

 

 

  • 数据库连接

模板:消除冗长的JDBC编码

JdbcTemplate(推荐):基于索引参数的查询;NamedParameterJdbcTemplate:值以命名参数形式绑定到SQL;SimpleJdbcTemplate(废弃):自动装箱、泛型和可变参数

构建以dataSource为参数且返回模板对象的模板bean

tx:annotation-driven:事务驱动(spring通过AOP实现事务的根本原因);配合AOP配置相关事务操作

实现DataSource的bean(使用配置中的参数)的Connection,Statament以及CURD,ResultSet   @Repository(标注参与数据库操作的bean)的bean中引入模板类,在@Inject处自动注入;执行CURD方法(提供参数即可,模板类自动获取连接、创建语句和执行SQL) 
 

MySql

数据库三范式

1NF

列的原子性(列不可再分)

2NF

先满足1NF,然后表必有主键,其他列必完全依赖主键

3NF

先满足2NF,然后非主键列直接依赖主键,消除传递依赖

事务propagation管理insert,update,delete,ACID特性

原子性

不可分割,即事务是应用的最小执行单位要么都执行,要么都不执行(回滚后数据状态与事务执行之前一致)

一致性

事务从一种一致的状态到另一种一致的状态

隔离性:并发的各个事务的执行互不干扰;5个隔离性

 

默认default

 

读未提交read_uncommitted

事务1可以操作还未提交的事务2;隔离性最低(不能避免脏读等所有问题),并发性高

读已提交read_committed

事务1不可以操作未提交的事务2;防止脏读(指修改但未提交的数据,之后事务2回滚了,事务1读到脏数据)

读可重复repeatable_read(默认)

防止脏读、不可重复读(指事务1读取数据后,事务2修改数据并提交,事务1再次读取而数据不一致)

串行化serializable

严格的事务隔离,事务串行执行;级别最高,避免脏读,不可重复读,幻/虚读(指事务2增加了数据并提交,事务1会感觉貌似多了些数据)

持久性

提交后永久存储(数据库操作完成后都应该commit(),失败后rollback())

 

  • 事务控制(begin/start transaction,commit,rollback…);自动提交或手动提交(begin-rollback-commit)
传播行为
PROPAGATION_REQUIRED(默认) 支持当前事务(如果没有则新建)
PROPAGATION_SUPPORTS 支持当前事务(如果没有则以非事务方式执行)
PROPAGATION_MANDATORY 支持当前事务(如果没有则抛出异常)
PROPAGATION_REQUIRES_NEW 总是开启新事务(如果存在则当前事务挂起)
PROPAGATION_NOT_SUPPORTED 总以非事务方式执行(如果存在挂起)
PROPAGATION_NEVER 以非事务方式执行(如果存在则抛出异常)

默认值为0-5;(java类TransactionDefinition新添了中自定义的初始值为6)PROPAGATION_NESTED—事务存在,则嵌套事务执行

只读:

事务超时:

 

mysql有存储引擎如MyISAM(默认),InnoDM,MEMOORY,MERGE,它们各有支持如存储限制、事务安全、锁机制、各种索引类型、数据缓存、数据压缩、内存使用、外键等

 

  • 关系型数据库

基本关系(表):实际表,对实际存储数据的逻辑表示

查询表:查询结果

视图表:由基本表或视图表导出的虚表

关系操作:查query,插insert,删delete,改update

完整性约束:实体完整性(主键不为空)+参照完整性(外键为空或另一个表的主键)+用户定义完整性(SQL约束列表)

标准语言SQL(structured query language):

  • 数据查询query:

select [*/all/distinct] 目标列表达式列表 from 表名/视图名列表/(selcte子句) [as..]

[ where 条件表达式 ](根据where条件从from指定集中选出元组并按照select的要求形成结果)

[ group by 列名 [having 条件表达式]](按列名的值分组,值等为一组;分组后having限制(聚集函数作用于每一组)满足条件的组才输出)

[ order by 列名 [asc/desc]]

 

条件表达式:=,>...,!=,between.and,in,like,is null,and,or以及not配合

like字符匹配,字符模糊%(任意长度字符)和_(任意单个字符)

函数
(聚集只能用于select后或having后面)数值函数

count(),sum(),avg(),max(),min()

abs(),cell(),floor(),mod()

rand()0-1随机数

round(n,count)四舍五入保留指定位数

truncate(n,count)截取为指定位数

字符串函数

concat(str1…strn),lower/upper(str)

left/right(str,count);//返回字符串左/右边的指定个字符

insert(str,fromIndex,count,newstr);//替换

lpad/rpad(str,count,fillstr);//从左/右填充指定个字符

ltrim/rtrim/trim(str);//去空格

repeat(str,count);//重复指定次

replace(str,oldChar,newChar);//替换所有oldChar

strcmp(str1,str1);//比较

substring(str,fromIndex,count);//截取

日期函数

curdate()/curtime()/now()://当前日期、时间、日期时间

year/monthname/week(date)://年、月、年的第几周

hour/minute(time)://时、分

date_format(date,fmt)

date_add(date,intervalExpressionType)

datediff(date1,date2);//天数差

流程函数

if(value,t,f);//如果value真,返回t,否则返回f

ifnull(value1,value2);//如果value1不null则返回,否则返回value2

case [expression] when [value1/expression] then [result1]…else [default] end;//如果[表达式结果等于]value1真,返回result1,否则default;可以多个when…then

其他函数 datebase()数据库名,version()版本,user()用户名,inet_ation(ip)ip地址的数字表示,inet_ntop(num)数字表示的IP地址,password(str)加密,MD5()
几种查询
连接查询 等值/非等值连接:选出满足条件的元组数据并拼接成在一起 from 表列表 where 表1.字段=(等连接词)表2;可自连接(别名区分)
外连接:选出左表/右表所有元组并拼接右表/左表满足条件的元组数据,不满足的元组显示数据为null  
嵌套查询 在where或having中嵌套查询块(select..from..where) 嵌套条件:=(等比较运算符,要求内存查询返回的一定是单个值),in(结果集),any/some/all(多值),exists
集合查询 对查询结果的并union,交intersect,差except  
基于派生表(中间表)的查询 子查询位于from后  
数据操作manipulation:DML
inser into 表名 [列名列表] values(值列表)  
delete from 表名 [where ...] 每次删一行数据;删除操作被作为事务保存在日志,日后可回滚;没有条件则删除表中所有数据,等同于truncate table 表名;//一次性永久性删除表中所有行而不记录单个行删除操作;不会激活触发器;速度快;不回滚
drop 删除数据和表格;隐式提交,不回滚;同truncate属于DDL语言;速度最快
update 表名 set 列名=值(列表) where ...  

 

  •  数据定义definition:DDL

           模式=表+视图+索引;

           约束:primary key,unique,not null,foreign key..references..,;

建:

create schema 名...,数据库的命名空间

create table 名(列名 数据类型 列级完整性约束条件,...)

 

数据类型
数值 严格数值 integer/int(4字节),smallint(2),decimal/dec,numeric
近似数值 float(4),real,double(8)
不同长度 tinyint(1),mediumint(3),bigint(8)
位bit
区别SQL中int(数字),表示数字宽度,默认int(11)
日期时间 1000年以后:日期date(4),日期时间datetime(8)  
1970年以后:当前系统日期时间且格式化timestamp(4),时间time(3)
1901以后:year(1)
字符串 char(0-255定长即删除尾部空格),varchar(0-65535变长即保存尾部空格),tinblob(0-255),mediumblob,blob(0-65535),longblob,text同理
二进制字符串binary(n定长),varcharninary(n变长)
enum,set

create view 名;当定义主键/唯一/外键约束时会自动创建对应索引

create [unique索引值对应唯一数据记录] [cluster聚簇索引] index 名 on tableName(列名[(字节数)])(列名列表且asc/desc)

索引:为经常需要查询的列建立索引;单列索引和组合索引(一个索引包含多列);出现在where子句而不是select后的列适合建索引;列基数越大的适合(如性别列基数太小);列值为字符串的,使用短索引即前缀遍历;索引增加额外存储空间,降低写操作性能,修改表时更新或重构费时

索引类型:

    顺序文件上的索引:针对记录值按升序或降序存储的记录创建的顺序索引文件

    B+树索引:动态平衡

    散列索引:查找快

   位图索引

    或者分为唯一索引(列或列组合建立的索引,值不重复,可为空),非唯一索引,主键索引(建立索引的列为主键,唯一),聚(集)簇索引(表中数据物理顺序和索引的排列顺序一致,唯一)

优点:加速查询;缺点:增加开销(维护索引尤其在记录的CURD时)和增加空间(来存储索引信息 )

  • 删:

drop schema/index/view 名 [on tableName;mysql要求一个表中索引不能同名]

drop table 名 [restrict默认有限制即若有依赖对象则表不能删除/cascade无限制,即依赖对象全被删除]

限制表示表存在依赖对象如被其他表约束引用,存在索引、视图、触发器、存储过程、函数等

视图、存储过程、函数不被删除但失效

  • 改:

添加列:alter table student add [column] 新列名 数据类型;(数据默认空值填充)

修改数据类型:alter table student alter column Sage INT

添加约束:alter table student add unique(Sage)

改索引名:alter index 名 rename to 新名      

 

  • 数据控制control

 

  • 存储过程与触发器

触发器:特殊的定义在关系表上的一类由事件驱动的存储过程;保存在数据库服务器,自动激活调用;是更灵活,可实施更复杂的检查和操作,更精细和强大的数据控制能力的约束;预编译;

       create trigger 名

       befor/after 触发事件insert/update/delete on  表名

       referencing new/old row as 变量名

       for each row/statement   //类型:行级触发和语句级触发

       [when 触发条件] 触发动作insert/update/delete

 

数据库连接池:服务器启动---建立一定数量的池连接,并一直维持不少于此数目的池连接---客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其表记为忙;如果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连接的数量有配置参数决定;当使用的池连接调用完成后,池驱动程序将此连接表记为空闲,其他调用就可以使用这个连接;

DBCP稳定,C3P0性能高

 

数据库设计步骤:需求分析,概念结构设计,逻辑结构设计,物理结构设计,数据库实施,数据库运行与维护

 

    SQL优化:

  1. 少使用*而具体写出需要返回的字段即不要全表扫描,减少语句解析;
  2. 外键使用索引,避免在where子句中有索引的字段进行运算而导致索引失效;
  3. 在where及order by设计的列建立索引;
  4. 表中字段避免null而应设默认值;避免在where子句中对字段进行null值判断和表达式操作,这导致引擎放弃索引而全表扫描;
  5. >=代替>(后者查询后比较,前者直接查询);
  6. 尽量多commit()即分段批量提交;
  7. 批量sql操作如删除id in(1,2,3)而不是三条删除语句;
  8. 存储过程减少数据库访问次数;特殊时候truncate替换delete;
  9. in中的常量存储在一个数组且排好了序,in中包含的数值不应过多;对连续的数字,尽量用between;
  10. 当只需要一条数据时,使用limit 1;
  11. 排序的字段没用到索引,则少排序;
  12. union all 代替union;
  13. in适合外表大而内表小的情况(in先执行子查询,即以内表为驱动);exists反之(以外表为驱动表,先访问);推荐not exists而不是not in,not in可能存在逻辑问题;
  14. left join以左表为驱动表,所以左表应小;同理right join;inner join会自动以数据少的表为驱动表,推荐;
  15. 分段查询:查询范围过大时,分段查询后,结果合并;
  16. 不推荐前置“%”的模糊查询,这导致索引失效而全表扫描;可使用全文索引;
  17. 联合索引遵循最左前缀法则:常用的查询字段放在最前;从左到右出现的子集索引可以如同联合索引,否则不行,如联合索引(1,2,3)可以等同(1,2)但(2,3)无法使用此索引;

    常见数据错报错:

       参数max_connections默认151;报错too many connections;

       从库与主库数据冲突:

 

    4.学生-课程数据库

       学生表:Student(Sno,Sname,Ssex,Sage,Sdept系);

       课程表:Course(Cno,Cname,Cpno,Ccredit学分);

       成绩/学生选课表:SC(Sno,Cno,Grade);

       建表:

           CREATE TABLE Student (Sno char(9) PRIMARY KEY,Sname varchar(20) union,Ssex char(2),Sage SMALLINT,Sdept char(20));

           Create table Course(Cno char(4) PRIMARY KEY,Cname char(40) not null,Cpno char(4),Ccredit smallint,FOREIGN KEY(Cno) references Course(Cno));

           Create table SC(Sno char(9),Cno char(4),Grade smallint,primary key(Sno,Cno),foreign key(Cno) references Course(Cno));

       查询:

  1. 出生年份:

当前年份-Sage;

  1. 查询既不是CS系,MA系,IS系的学生:

select Sname form student where Sdept not in(“CS”,”MA”,”IS”);

  1. 查询选了3门以上课程的学生学号

select Sno from SC group by Sno having count(*)>3;

  1. 查询平均成绩>=90分的学生学号和平均成绩

select Sno,avg(Grade) from SC group by Sno having avg(Grade>=90);//只涉及SC表

  1. 查询选修课程2且该课程成绩大于90分的学生学号和姓名

select Student.Sno,Sname from Student,SC where Student.Sno=SC.Sno and SC.Cno=’2’ and SC.Grade>90;//涉及Student表和SC表,等值连接

  1. 查询选修课程语文的学生学号和姓名

select Sno,Sname from Student where Sno in(select Sno from SC where Cno in(select Cno from Course where Cname=’语文’));//课程名属于Course,学号和姓名属于Student,两表没有直接联系,需通过SC表连接;先查课程为语文的课程号Cno,再查选了Cno的学生号Sno,最后取出Sno和Sname;

它的等值连接查询(推荐):select Student.Sno,Sname from Student,SC,Course where Student.Sno=SC.Sno and SC.Cno=Course.Cno and Course.Cname=’语文’;   

  1. 查询选了课程1号的学生姓名

select Sname from Student where exists (select * from SC where Sno=Student.Sno and Cno=’1’);

  1. 查询选了所有课程的学生姓名

select Sname from Student where not exists(select * from Course where not exists(select * from SC where Sno=Student.Sno and Cno=Course.Cno));

  1. 查询所有学生的学号,姓名,选课数,总成绩

select Student.Sno,Student.Sname,count(Cno),sum(Grade) from Student join SC on Student.Sno=SC.Sno group by Student.Sno,Sname;

  1. 查询所有课程成绩都<60分的学生学号和姓名

select Sno,Sname from Student where Sno not in(select Student.Sno from Student,SC where Student.Sno=SC.Sno and SC.Grade>60);

  1. 查询‘001’课程分数比‘002’课程高的学生学号

select a.Sno from (select sno, score from sc where cno=’001’) a,(select sno,score from sc where cno=’002’) b

where a.score>b.score and a.sno=b.sno;

  1. 查询姓李老师的人数

select count(distinct(tname)) from teacher where tname like ‘李%’;

  1. 用一个SQL语句查询N种数据:

    select sum(case when table.salary>9999 and table.age>35 then 1 else 0 end) as “salary>9999 and age>35”,sum(case when table.salary……),… from table;  

  1. 连接字符串(与null连接的都为null)

select concat(“str1”,”str2”,”str3”),concat(“str”,null)

  1. 查询工资,大于2000的显示”high”,否则显示”low”

select if(salary>2000,’high’,’low’) from …

select case when salary>2000 then ‘high’ else ‘low’ end from…

  1. 建索引

create index citys on city(cityName(10));

  1. 修改名为‘张’的薪水为5000,性别为‘男’

update tableName set salary=5000,sex=’男’ where name=’张’;

  1. 统计学生总分

select name,(chinese+math+english) as total from student;

  1. 工资多于张员工的员工信息

select * from employee where salary>(select salary form employee where name=’张’);

  1. 查询员工姓名及他的上司姓名

select 员工.name ,上司.name from employee 员工 left jion employee 上司 on 员工.上司编号id=上司.id;

  1. 查询雇佣时间小于其上司的员工姓名和上司姓名

select 员工.name,上司.name from employee 员工,employee上司 where 员工.上司id=上司.id and 员工.hireDate<上司.hireDate;

  1. 返回从事‘a’工作的员工姓名和所在部门

select 员工.name,dname from employee 员工,dept where 员工.job=’a’ and 员工.deptno=dept.deptno;

  1. 返回所有部门及部门最低工资

select deptno,min(salary) from employee group by deptno;

  1. 查询销售部的所有员工姓名

select ename from employee 员工,dept 部门 where 部门.dname=’销售部’ and 员工.deptno=(select deptno from dept where dname=’销售部’);

  1. 查询薪资水平多于平均薪资的员工

select * from employee where salary>(select avg(salary) from employee);//注意聚合函数(group function)不能放在where里即不能where salary>avg(salary)

  1. 查询与张从事相同工作的员工

selct * from employee where job=(select job from employee where ename=’张’) and ename!=’张’;//同一部门:where edeptno=(select edeptno from employee where ename=’张’) and ename!=’张’;

  1. 返回工资高于a部门所有员工的员工

select * from employee where salary> all(select salary from employee where edeptno=’a’);

 

  1. 借书系统

       CARD 借书卡:CNO 卡号,NAME  姓名,CLASS 班级

       BOOKS图书: BNO 书号,BNAME 书名,AUTHOR 作者,PRICE 单价,QUANTITY 库存册数

BORROW借书记录: CNO 借书卡号,BNO 书号,RDATE 还书日期

16.查询借书超过5本的读者的借书卡号和册数

    select cno,count(*) from borrow group by cno having count(*)>5;

  1. 查询借了水浒的读者的姓名和班级

select * from card c where exists(select * from borrow bo,books b where bo.bno=b.bno and b.bname=’水浒’ and bo.cno=c.cno);

  1. 查询过期未还图书的借书卡号,书号及归还日期

select * from borrow where rdate

  1. 查询借了a但没有借b的读者的借书卡号并降序

select bo.cno from borrow bo,books b

where bo.bno=b.bno and b.bname=’a’

and not exists(select * from borrow bo2,books b2 where bo2.bno=b2.bno and b2.bname=’b’ and bo2.cno=bo.cno)

grop by bo.cno desc

  1. 将001班同学的归还日期延长一周

update borrow set rdate=dateAdd(day,7,borrow.rdate) from card,borrow where card.cno=borrow.cno and card.class=’001’;

    20. 删除无人借阅的图书记录

delete from books where not exists(select * from borrow where bno=books.bno);

21.建立视图显示001班借书信息

create view v as

select * from borrow bo,card c,books b where bo.cno=c.cno and bo.bno=b.bno and c.class=’001’

分页查询select * from table limit (start-1)*limit,limit;

去重:Mysql不能删除查询出来的记录的,而是通过一张临时表且保留一条记录:

 delete from table where id in (select id from (select id from table where expect in (select expect from table group by expect having count(expect)>1) and id not in(select min(id) from table group by expect having count(expect)>1)) as tmpresult)

你可能感兴趣的:(javaWeb之一些基础:JavaScript,jQuery,Ajax,JSP,Servlet,MySQL,)