自己以前的学习笔记,希望可以帮助到一些学习Java web的人。还有一部分内容没写完,以后抽时间补上。
注意:图片可以右击点击查看图片,放大(使用火狐浏览器)
扫码关注公众号
- 后台回复“Java学习资料”免费获取更多Java学习教材及实战资料
Java Web基础
一、Servlet
1.创建Servlet
1.实现Servlet接口
2.继承javax.servlet.GenericServlet
3.继承javax.servlet.http.HttpServlet
2.Servlet生命周期
1.出生-->init方法:在构造方法之后调用
2.使命-->service方法:请求发过来时,处理请求使用
3.销毁-->destory方法:服务器关闭时,会销毁Servlet,在销毁前调用该方法释放资源,销毁内存中的实例
3.Servlet在web.xml中的注册
1.注册Servlet到项目中
2.分配给Servlet路径
1.Servlet路径配置详解
1.路径匹配:/ServletDemo, /ABC/ServletDemo ,/ABC/*
2.后缀名匹配:*.do ,*.action ,*.html
3.配置的路径匹配范围越大优先级越低
4.访问Servlet的时序过程
1.一般情况下,Servlet在第一次被访问时于内存中创建对象,随后调用init方法进行初始化,对每一次请求都调用service方法进行处理,此时会用Request对象封装请求信息,并用Response对象(初始为null)代表响应消息,传入service方法供其使用。
2.当service方法处理完后,返回服务器,服务器根据response中的信息组织响应消息,返回给浏览器。响应结束后,servlet并不会销毁,一直驻留在在内存中等待下一次请求,直到服务器关闭或web应用被移除。
5.Servlet的 线程安全问题:解决办法,使用局部变量保存用户数据
6.Servlet技术三大组件
1.Servlet
2.Filter过滤器
3.Listener监听器
二、ServletConfig
1.代表Servlet的配置对象(可以在web.xml中配置)
1.Servlet中可以用this.getServletConfig()获得该对象
2.常用方法:getServletName()和getInitParameterNames()(可以遍历出配置中的配置项)
3.<servlet><init-param><param-name></param-name><param-value></param-value></init-param></servlet>
2.设置Servlet随着项目的启动而创建
1.<servlet><load-on-startup>填写一个整数,整数越小优先级越高</load-on-startup></servlet>
三、ServletContext
1.ServletContext代表对整个应用的配置,获得方法,getServletContext方法
2.ServletContext的作用
1.封装了web.xml中的配置
2.Servlet技术中三大域对象之一。ServletContext application;session;request
3.获得项目中资源
ServletContext sc=getServletContext();InputStream is=sc.getResourceAsStream("/WEB-INF/cities.xml");String path=sc.getRealPath("/WEB-INF/cities.xml")获取资源的绝对路径
3.application域。原理:利用一个项目中只有一个ServletContext实例的特点,在ServletContext中放置了一个Map,这个Map 就是所谓的域。
四、Response
1.response对象代表响应,我们在其中填入要发送到浏览器的内容,服务器把这些内容组装成http响应
2.http响应及对应操作方法
1.响应首行(协议/版本号 状态码 状态码描述)。添加状态码和描述的方法:void setStatus(int sc); void setStatus(int sc,String sm); void sendError(int sc);void sendError(int sc,String msg)
2.响应头。添加响应头
1.设置响应头,key一样会覆盖。void setHeader(String name,String value); setIntHeader(String name,int value); setDateHeader(String name,long date)
2.设置响应头,无论如何都新增。addHeader(String name,String value); addIntHeader(String name,int value); addDateHeader(String name,long date);
3.响应正文(响应空行)。发送字节流 getOutputStream;发送字符流getWriter
4.重定向
1.response.setHeader("location","http://www.baidu.com") or response.setHeader("location","day1/ServletDemo") +response.setStatus(302)
2.response.sendRedirect(String url);
5.乱码问题的解决
1.字节流。服务器端:string.getBytes("码表“) ;浏览器端:浏览器通过标签<meta http-equiv="content-type" content="text/html;charset=utf-8">控制使用码表解码。对应的响应头:content-type:text/html;charset=utf-8。
2.字符流。PrintWriter pw=response.getWriter(); pw.print("你好世界") 服务端默认是使用ISO-8859-1码表。控制字符流使用码表response.setCharacterEncoding("UTF-8")(这个一般要放在最上面,因为得到流时要先取码表)
3.Java EE提供了一个方法,可以同时解决编码和解码的问题。response.setContextType("text/html;charset=utf-8");
6.使用字节流发送图片
1.告诉浏览器发给你流的MIME类型。response.setContentType("image/jpeg“);
2.获得图片输入流。InputStream in=getServletContext().getResourceAsStream("WEB-INF/1.jpg");
3.获得输出字节流。OutputStream out=response.getOutputStream();
4.对接输入输出流(略)
7.使用字节流发送文件
1.文件的类型可以参考Tomcat中conf/web.xml中配置的MIME类型。例:<mime-mapping><extension>jar</extension><mime-type>application/java-archive</mime-type></mime-mapping>
2.代码实现
1.告诉浏览器要发送的是什么。response.setContentType("application/java-archive"); 引号中的内型可以通过getServletContext().getMimeType(".jar")获得(可以获得“.jar”的MIME类型)。
2.告诉浏览器推荐用户使用什么名称下载(不设置的话默认文件名为路径名)。response.setHeader("content-disposition","attachment;filename="+filename); filename为String类型。
3.开启输入输出流,并对接。
五、Request
1.http请求及对应操作方法
1.请求行 请求方式 请求路径 协议/版本号。request.getMethod();GET request.getRequestURI();/day12/ServletDemo request.getServletPath();/day12 request.getScheme();http
2.请求头,request的方法。String getHeader(String name); long getDateHeader(String name); int getIntHeader(String name); Enumeration getHeaders(String name); Enumeration getHeaderNames();
3.请求正文(请求空行之后),表单传递过来的键值对。
2.GET提交
1.由于HTTP协议规定URL路径只能存在ASCII码中的字符,所以URL中存在中文或其他特殊的字符需要进行URL编码。原理:a.将空格转换为+;b.对0~9,a-z,A-Z之间的字符保持不变; c.用这个字符的当前字符集编码在内存中的十六进制表示,并在每个字节前加上一个百分号%
2.获得表单提交上来的键值对。String name=request.getParameter("name"); String age=request.getParameter("age");
3.解决乱码。byte[ ] nameByte=name.getBytes("ISO-8859-1"); String newName=new String(nameByte,"UTF-8");
4.服务器默认使用ISO-8859-1解码,如下的URIEncoding来决定解码码表(conf/web.xml)。<connector port="8080" protocol="HTTP/1.1" URIEncoding="UTF-8" connectionTimeout="2000" redirectPort="8443" />
3.POST提交
1.因为POST解码是在第一次调用getParameter之前,那么那么解决乱码则需要在该方法之前设置编码。request.setCharacterEncoding("UTF-8");
4.获得表单参数的方法
1.String getParameter();根据键获得值, Map getParameterMap();获得服务器保存表单参数的容器, Enumeration getParameterNames();获得提交的所有键, String[ ] getParameterValues(String name);根据键获得值
5.request请求转发和包含功能
1.转发:一个Servlet处理完毕交给下面的Servlet(JSP)继续处理。作用:完成分工:Servlet处理业务,JSP完成显示功能。注意:转发的时候,从分工上讲Servlet中不要做输出正文的动作(没有效果)。
2.request.getDispatcher(" ").forward(request,response); request.getDispatcher(" ").include(request,response);
6.request域
1.使用请求转发时,Servlet处理完数据,处理结果要交给JSP显示,可以使用request域将处理结果由Servlet带给JSP显示
2.常用的操作方法。setAttribute; getAttribute; getAttributeNames; removeAttribute;
3.request范围:一个request对应一个request域,有多少request就有多少request域
六、路径小结
1.客户端路径(给浏览器用的路径)
1.<from action=" ">; <a href=" ">; <img src=" ">; response.sendRequestDispatcher("url"); Refresh:3;url=" "
2.客户端路径的写法
1.带"/" : "/" 表示相对主机。例如,表单所在页面路径为-->http://localhost:8080/day12/index.jsp , "/"代表http://localhost:8080/ 。在JSP页面等可以使用request.getContextPath()得到应用路径,这样移动index.jsp页面到其他应用目录下时,不用做多余的修改。
不带“/": 表示从当前目录中找(开发中尽量避免不带”/"的情况)。例,表单所在页面路径为http://localhost:8080/day12/index.jsp表示为http://localhost:8080/day12/ 。一旦移动该页面到其他应用,还要对路径做相应的修改,不推荐。
3.服务器端路径写法
1.“/"相对于项目。例如http://localhost:8080/day12/ServletDemo中就是相对于如http://localhost:8080/day12/这一段。
七、JSP概述
1.JSP(java server page) 可以在tomcat中的work/catalina/localhost/day12/org/apache/jsp中可以查看.jsp文件转化后的文件
2.JSP的构成:HTML+JSP脚本(JAVA)+标签。HTML代码会使用out.write()拼接输出。
3.JSP中的脚本
1.声明标签<% %>, 标签中可以写Java代码,该脚本中写的Java代码会生成到JSP对应类中的service方法中。
2.表达式<%= i%>, 编译之后的代码:out.print(i);
3.声明标签<%! int i=0; %>,编译之后,脚本中的代码会出现在类中,可以使用该脚本定义全局变量和方法。
4.注释<%-- --%>, 被注释掉的内容不会参与编译。注意和<!-- -->html注释的区别。
八、Cookie
1.cookie原理:让浏览器记住键值对,是向响应头中添加一下头即可set-cookie:name=robin; 浏览器记住之后,向服务器发送键值对,是在请求头中添加下面的信息cookie:name=robin。
2.添加一个cookie到浏览器
1.新建一个cookie(键值对)。Cookie cookie=new Cookie("name","robin");
2.将cookie添加到响应中。response.addCookie(cookie);
3.让浏览器发送cookie到服务器
1.获得所有浏览器发送的cookie。Cookie[ ] cookies=request.getCookies();
2.遍历并判断我们要找的cookie。if(cookies!=null&&cookies.length)>0{for(Cookie c:cookies){if(c.getName().equals("name"){... ...}}}}
4.浏览器记录cookie的时间及其设置
1.默认是在会话期间有效(关闭浏览器,cookie就会被删除)
2.有效时间的设置。Cookie cookie= new Cookie("age","18"); cookie.setMaxAge(60*60);//单位是秒。 cookie.setMaxAge(-1);//设置为-1,就是相当于默认的有效时间,浏览器关闭就消失。 cookie.setMaxAge(0);//表示cookie一发送到浏览器就消失了。注:可以利用有效时间为0这个特性进行删除cookie的操作。
5.浏览器发送cookie的时机
1.cookie默认的时机就是发送cookie的Servlet所在的目录。例:day13/ , 访问路径如果是该cookie的子路径,浏览器就会把该cookie带给服务器,例:/day13/abcd/xxServlet
2.访问特定Servlet发送cookie。cookie.setPath("day13/ServletDemo");
6.cookie中的域
1.想要一下三个主机能共享一个cookie,www.robin.com;music.robin.com;basketball.robin.com,完成一下两步设置即可1,设置cookie的domain为".robin.com",设置cookie的path为"/"。以上就是跨主机访问cookie
九、Session
1.Session技术:服务器端保存会话信息的技术。原理:浏览器第一次访问服务器,服务器会在内存中开辟一个空间(session),并把该session对应的ID发送给浏览器,当下次浏览器再去访问服务器,会把SessionID交给服务器,服务器通过SessionID找到刚才开辟的空间。注:请求头中cookie:JessionID=......;... ...
2.SessionID丢失的时间
1.服务器让浏览器记住SessionID的cookie的默认过期时间是(-1),关闭浏览器cookie就丢失,也就是说cookie丢失,SessionID就丢失了。
3.session的方法
1. 获得session,request.getSession();
2. 4个操作Map的方法
3.其他方法。long getCreationTime();//获得创建时间, String getId();//获得sessionID, long getLastAccessedTime();//获得最后一次访问的时间, int getMaxInactiveInterval();//获得最大存活时间(session), void setMaxInactiveInterval(int interval);//设置最大存活时间, void invalidate();//立刻销毁Session, boolean isNew();//是否是新创建的Session。
4.session最大有效时间的设置
1.默认30分钟。 Tomcat的web.xml的<session-config>标签中有该配置。
2.session过期时间的修改
1.修改Tomcat的web.xml的<session-config>标签,影响服务器中的所有项目
2.在项目的web.xml中加入<session-config>配置,影响的是当前项目
3.通过setMaxInactiveInterval(int interval)方法设置,影响的是当前操作的Session
5.钝化和激活
1.服务器内存消耗太大
2.某些HTTPSession对象已经长时间不用了,但还不至于销毁
3.服务器重启了
6.URL重写
1.如果浏览器禁用cookie功能不能保存任何cookie,那么session技术要用cookie来保存SessionID,没有cookie的话如何操作?使用URL重写:将页面中所有的链接末尾都加上cookie id的参数(jessionid=...),这样用户点击链接访问网站时,通过URL把SessionID带到服务器,这样就解决了。
7.Servlet技术中三大域对象小结
1.application-->ServletContext:范围是整个项目,只有一个ServletContext对象,所有的Servlet组件都能被访问到
2.session-->HttpSession:范围是一次会话,一个没有保存SessionID的浏览器链接到服务器就会开启一个会话,有多少个浏览器访问就至少有多少个Session
3.request-->HttpServletRequest:范围是一次请求之内,当前正在处理的请求有多少个就存在几个request域
十、JSP指令元素
1.JSP指令写法和分类
1.写法:<%@ 指令 属性=“ ” %>
2.page指令标记
1.page属性包含在"<%@page"和"%>"之间
2.这些属性可以单独存在,也可以几个或多个同时使用
3.page指令用来定义JSP文件的全局属性
4.在JSP页面中,只有import可以出现多次,其他属性都只能出现一次
3.page属性
1.language:描述当前页面使用的语言(目前取值只有Java)language="java"
2.import:用于导入Java包或类的列表。唯一一个可以出现多次的属性。例:import="java.util.Date"
3.pageEncoding:决定服务器读取JSP时,采用什么编码。pageEncoding="UTF-8"
4.contentType="text/html;charset=UTF-8"响应浏览器时,告诉浏览器用什么码表解码。注:contentType和pageEncoding属性只需指定一个,另外一个会自动指定。
5.buffer=“8kb":决定缓存的大小
6.autoFlush="true":如果缓存写满了,如果该属性为true,会将缓存中的内容自动输出到浏览器
7.errorPage=" ":当JSP页面出现了异常,指定要跳转到的页面
8.isErrorPage="false":标识当前页面是否是处理错误的页面。拓展:错误页面可以使用下面的统一配置。<error-page><error-code>500</error-code><location>/Error/ErrorDemo.jsp</location></error-page>
9.session="true"(一般不要修改):页面中是否使用session对象。如果为false,那么session内置对象会消失,默认为true
10.extends=“ ”:一般不用。JSP生成的Java文件继承哪个类。默认继承:org.apache.jasper.runtime.HttpJspBase
11.isELIgnored:用来指定EL表达式语言是否被忽略。true则忽略,false则计算表达式的值
4.include指令标记
1.<%@include file="filename"%>
2.include指令的作用是在JSP页面中静态包含一个文件,同时由JSP解析包含的文件内容
3.不可以在file所指定的文件后面接任何参数。<%@include file="jw.jsp?nm=browser"
5.taglib指令标记
1.taglib指令用于在JSP页面中导入标签库。常用的标签库JSTL
2.常用属性。uri:标签文件的URL地址,prefix:标签组的命名空间前缀
十一、JSP九大内置对象
1.九大内置对象。HTTPServletRequest request; HTTPServletResponse response; HTTPSession session; ServletContext application; ServletConfig config; Throwable exception; Object page; JspWriter out; pageContext pageContext
2.page对象一般指向了Servlet的实例(一般不用)
3.JSPWriter对象
1.JSP中都使用JSPWriter再向外输出内容
2.response.getWriter和JSPWriter的区别:response.getWriter的输出会出现在JSPWriter输出的前面;JSPWriter缓存会附加到response.getWriter缓存后,最终输出response.getWriter缓存。注:JSP中不要直接使用response.getWriter
4.pageContext对象
1.page域:范围只在当前页面中(4个域中最小的一个域)。常用方法:setAttribute( , ); getAttribute(); removeAttribute();
2.操作其他三个域。以操作request域为例。
1.存值pageContext.setAttribute("name","robin",pageContext.REQUEST_SCOPE);
2.取值 pageContext.getAttribute("name",pageContext.REQUEST_SCOPE);
3.遍历所有键pageContext.getAttributeNamesInScope(pageContext.REQUEST_SCOPE);
4.删除一个值pageContext.removeAttribute("name",pageContext.REQUEST_SCOPE);
3.获得其他八个内置对象
1.getRequest(); getResponse(); getSession; ... ...
十二、JSP标签
1.已经不怎么用了,暂时略过
十三、EL表达式
1.功能:替换掉页面中的表达式(<%=表达式 %>)
2.EL内置对象
1.通过四大内置对象对四大域进行访问
1.包括requestScope; sessionScope; applicationScope; pageScope
2.使用格式。${requestScope.name}; ${sessionScope.name}; ${applicationScope.name}; ${pageScope.name} ,这些表达式表示从四大域中取出键为name的值。${name}从最小的域开始,找key为name的属性值。
3.域操作示例
1.${requestScope.user.name}和${requestScope.user['name']等价于<%((User)request.getAttribute("user")).getName(); %>
2.例:先存值,<%String[ ] array=new String[ ]{"jack","rose","jerry","tom"}; request.setAttribute("array",array);%> 通过EL取值,${requestScope.array[1]} -->rose
2.其他内置对象
1.param 和paramValues这两个对象封装了表单参数
2.header和headerValues封装了HTTP请求头
3.initParam封装了web.xml中的配置
4.pageContext封装了九大内置对象的pageContext
5.cookie封装了cookie信息
3.EL表达式中支持比较运算符和逻辑运算符。${empty p1}, empty:判断一个对象是否为null,String是否为“ ”,集合中是否有元素
4.EL函数库
1.作用:简化页面中静态方法的调用,使用EL函数代替Java代码
2.自定义EL函数库过程
1.定义工具类,在类中定义静态方法
2.填写配置文件xxx.tld放置到WEB-INF下
3.配置文件中内容。参考笔记
5.系统自带的EL函数
1.${fn:contains("hello","el")} 判断是否包含
2.${fn:endsWith("abcd","cd")} 判断是否以某字符串结尾
3.${fn:escapeXml("<font color='red'>haha</font>")} 自动将HTML关键字符转义
十四、自定义标签(简单标签)
1.标签作用:自定义标签属于JSP规范.替换掉JSP中的JSP脚本<% %>,实现一些简单的逻辑运算。
2.标签开发步骤
1.编写一个类,实现一个接口javax.servlet.jsp.tagext.SimpleTag或者继承javax.servlet.jsp.tagext.SimpleTagSupport。具体例子参照笔记
2.在WEB-INF目录下,建立一个扩展名为tld(Tag Library Definition)的xml文件。注:tld文件在WEB-INF或者jar包的META-INF目录下,都能自动找到。配置文件的写法参照笔记
3.在JSP中使用。引入<%@ taglib uri="http://www.robinliew.com/simpletag" prefix="xxx" %> ,使用时标签的写法:<xxx:ShowTime/>
十五、JSTL标签库
1.JSTL简单介绍
1.JSTL:Java Standard Tag Library。Apache实现的一套标准的标签库(可访问JCP.org)
2.由五部分组成:Core:核心 Functions:EL函数 Format:国际化 SQL:操作数据库 Xml:操作xml
3.常用的core标签
1.c:out 输出数据到页面上。<c:out value="${p}" default="木有“" esccpeXml="true"></c:out> 其中escapeXml属性表示是否转义。
2.c:if 如果test表达式的值为 true 则执行其主体内容var属性:记住test表达式的运行结果; scope:page(默认)|request|session|application 。例,<c:if test="${1==1}" var="result">相等</c:if> 。
3.c:choose c:when c:otherwise组合起来模拟了if else if
4.c:forEach 模拟了for循环。迭代:数组,集合,Map和String(用逗号分隔)
5.c:url 对地址进行url重写,还能进行url编码
6.c:import 动态包含,可以包含任何页面
7.c:forTokens 用分隔符隔离字符串
8.c:set 用于设置变量值和对象属性
9.具体用法可以参照笔记或网站http://www.runoob.com/jsp/jsp-jstl.html
2.JSTL自定义标签
十六、SQL
1.SQL:Structured Query Language 结构化查询语言。作用:是一种定义、操作、管理关系数据库的句法。
2.SQL语句的组成。DQL:结构查询语言 DML:数据操作语言 DDL:数据定义语言 DCL:数据控制语言 TPL:事务处理语言 CCL:指针控制语言
3.关系性数据库
1.属性:用来描述所在列的项目的语义
2.模式:关系名和其属性集合的组合称为这个关系的模式。例,Movies(title,year,length,genre)。在关系模型中,数据库是由一个或多个关系组成。
3.元组:关系中除含有属性名所在行以外的其他行称为元组(turple)。每个元组均有一个分量(component)对应于关系的每个属性。
4.原子性。关系模型要求元组的每个分量具有原子性。也就是说,它必须属于某种元素类型,如Integer或String,而不能是记录,集合,数组或者其他任何可以分解成更小分量的组合类型。
5.域:与关系的每个属性相关联的是一个域(domain),即一个特殊的元素类型,关系中任一元组的分量值必须属于对应列的域。例,关系Movies中四个分量对应的域分别是:String,integer,integer,String。Movies(title:string,year:integer,length:integer,genre:string)
6.关系实例:一个给定关系中元组的集合叫做关系的实例。关系的属性次序可以任意排列,关系不会改变,但重新排序关系模式时,要记住属性是列标题。
7.键约束:键由关系的一组属性集组成,通过定义键可以保证关系实例上任何两个元组的值在定义键的属性集上取值不同。通常在形成键的属性或属性组下面画上下划线,用来表明它是键的组成部分。
4.SQL中的三类关系
1.存储关系,称为表(table)。这是通常要处理的一种关系,它在数据库中存储,用户能够对其元组进行查询和更新。
2.视图(view),通过计算来定义的关系。这种关系并不在数据库中存储,它只是在需要的时候被完整或部分地构造。
3.临时表,它是在执行数据查询和更新时由SQL处理程序临时构造。这些临时表会在处理结束后被删除而不会存储在数据库里。
5.SQL中的数据类型
1.可变长度或固定长度的字符串
1.CHAR(n):最大为n个字符的固定长度字符串
2.VARCHAR(n):也表示最多可能有n个字符的字符串
3.区别:CHAR类型会以一些短的字符串来填充后面未满的空间来构成几个字符,而VARCHAR会使用一个结束符或字符长度值来标志字符串的结束,后面未满的空间不会做填充。
4.注:SQL中字符串是使用单引号
2.类型INT和INTEGER表示典型的整数值。SHORTINT也表示整数,但表示的位数可能小一些,具体取决于实现。
3.浮点值能通过不同的方法表示
1.FLOAT和REAL(同义词):表示典型的浮点数值
2.DOUBLE,PRECISION:高精度的浮点类型
3.DECIMAL(n,d):允许可以有n位有效数字的十进制,小数点是在右数第d位的位置。
4.BOOLEAN表示具有逻辑类型的值。属性值是TRUE,FALSE,UNKNOWN
5.时间和日期分别通过TIME和DATA数据类型表示。例,TIME '15:00:02.5' DATE '1948-05-14'
6.mysql和Java数据类型对比
1.char(n)/varchar(n) ----String
2.tinyint ----byte
3.smallint ----short
4.int ----int
5.bigint ----long
6.double ----double
7.bit(0/1) ----boolean
8.Date/Time/DateTime/timeStamp ----Date
9.Blob/Text(大数据:图片,音频,视频二进制码;文本大数据)
6.DDL数据定义语言(对数据库的操作)
1.常用关键字:create/alter/drop/truncate
2.显示所有数据库:show databases;
3.创建一个名称为mydb1的数据库:create databases mydb1;
4.创建一个使用gbk字符集的mydb2数据库:create databases mydb2 character set gbk;
5.创建一个使用gbk字符集,并带校对规则的mydb3数据库:create database mydb3 character set gbk collate gbk_chinese_ci;
6.查看数据库的创建细节,可以看到使用的字符集:show create database mydb1;
7.删除当前创建的mydb3数据库:drop database mydb3;
8.查看服务器中的数据库,并把mydb2的字符集修改为utf8:alter database mydb2 character set utf8;
9.设置服务器端使用的编码:set character_set_client=gbk;
10.查看数据库中的各种字符编码:show variables like 'character%' ;
7.DML数据操作语言
1.常用关键字:insert/update/delete
2.表操作
1.表操作前的准备工作:显示当前的数据库和选择数据库。
1.显示当前的数据库:select database();
2.选择数据库:use mydb1; 创建表前,要先使用use db 语句使用库。
2.创建表
1.格式: create table tab_name( field1 type, field2 type, ... ,fieldn type)[character set xxx] [collate xxx];
2.创建一个员工表employee。create table employee( id int primary key auto_increment, name varchar(20), gender bit default 1, birthday date, job varchar(20), salary double);
3.查看表信息
1.desc tab_name 查看表结构
2.show tables 查看当前数据库中的所有表
3.show create table tab_name 查看当前数据库建表语句
4.修改表结构
1.增加一列:alter table tab_name add [column] 列名 类型;
2.修改一列类型:alter table tab_name modify 列名 类型;
3.修改列名:alter table tab_name change [column] 列名 新列名 类型;
4.删除一列:alter table tab_name drop [column] 列名;
5.修改表明:rename table 表名 to 新表名;
6.修改表所用的字符集:alter table 表明 character set utf8;
7.删除表:drop table tab_name;
3.表的常用操作:增删改
1.插入一条记录:insert into tab_name ( field1, field2, ...) values (value1, value2, ...);
1.插入的数据应与字段的的数据类型相同
2.数据的大小应在列的规定范围内。例如,不能将一个长度为80的字符串加入到长度为40的列中
3.在values中列出的数据位置必须与被加入的列的排列位置相对应
4.字符和日期数据应该包含在单引号中
5.不指定某列的值或insert into table (null),则该列取空值
6.如果要插入所有字段可以省略列列表,直接按表中字段顺序写值。
2.修改表记录:update tab_name set field1=value1, field2=value2, ... [where语句];
1.set子句指示要修改哪些列和要给予哪些值
2.where 子句指定应更新哪些行。如果没有where子句,则更新所有行。
3.例:将姓名为'zs'的员工薪水改为3000元。update emp set salary=300 where name='zs'; 将姓名为‘xiaoliu'的员工薪水改为5000元,job改为enginer:update emp set salary=5000, job=enginer where name='xiaoliu';
3.删除表操作:delete from tab_name [where ...];
1.如果不跟where子句则删除整张表中的数据
2.delete只能用来删除一行记录,不能删除一行记录中的某一列值
3.delete语句只能删除表中的内容,不能删除表本身,要想删除表,用drop
4.truncate table 可以删除表中所有数据,此语句首先摧毁表,再新建表。此种方式删除的数据不能再从事务中恢复。
5.例,删除表中名称为'zs'的记录。delete from emp where name='zs';
8.DQL数据查询语言
1.查询表操作(select)
1.select [distinct] * | field1,field2, ... from tab_name; 其中distinct用来剔除重复行。例,select name,english from exam; select distinct english from exam;
2.select可以使用表达式,且可以使用as 别名
1.select name,english+10,chinese+10,math+10 from exam;
2.select name,english+chinese+math as 总成绩 from exam;
3.select name,english+chinese+math 总成绩 from exam;
2.使用where子句进行过滤查询
1.查询姓名为'xx'的学生成绩
1.select * from exam where name='xx';
2.where子句支持的格式
1.比较运算符:> < >= <= <>
2.between 10 an 20; 值在10到20之间。例:查询英语分数在80-100之间的同学,select name,english from exam where english between 80 and 100;
3.in(10,20,30); 值是10或20或30。例:查询数学分数为75,76,77的同学,select name, math from exam where math in(75,76,77);
4.like '张pattern'; pattern可以是%或者_,如果是%则表示任意多字符,例:张三丰,张飞,张abcd;如果是_则表示一个字符张_,张飞符合。例:查询所有姓张的学生的成绩, select * from exam where name like '张%';
5.逻辑运算符。在多个条件直接可以使用逻辑运算符 and or not 。 例:查询数学分数>70,语文>80的同学。select name from exam where math>70 and chinese >80; 查询缺考数学的学生的姓名:select name from exam where math is null;
3.order by 指定排序的列,排序的列即可是表中的列名,也可以是select后面指定的别名。order by [列名|别名] [asc|desc|...] asc升序,desc降序。
1.例:对总分排序,按照从高到低的顺序输出。select name, (ifnull(math,0)+ifnull(chinese,0)+ifnull(english,0)) 总成绩 from exam order by desc;
4.聚合函数:技巧,先不管聚合函数要干什么,先把要求的内容查出来包上聚合函数即可。
1.count(列名); 例,统计一个班共有多少个学生,select count(*) from exam;
2.sum(列名); //不会包含null 例,统计一个班级语文平均成绩,select sum(chinese)/count(*) from exam;
3.avg(列名); 例,求一个班级的数学平均分,select avg(ifnull(math,0)) from exam;
4.max/min 例,求班级最高分,select max(ifnull(math,0)+ifnull(chinese,0)+ifnull(english,0)) from exam;
5.group by子句:其后可以跟多个列名,也可以跟having子句对group by的结果进行筛选。
1.例,对订单表中商品归类后,显示每一类商品的总价。select product, sum(price) from orders group by product;
2.例,查询购买了几类商品,并且每类总价大于100的商品。select product, sum(price) from orders group by product having sum(price) >100;
3.having和where的差别: where语句在分组之前的筛选,having用在分组之后的筛选,having中可以使用聚合函数,where中就不行。使用where的地方可以使用having替换。
1.查询商品列表中除了橘子以外的商品,每一类商品的总价格大于500元的商品的名字。select product, sum(price) from orders where product<>'桔子’ group by having sum(price)>500;
6.SQL关键字:select from where group by having order by ; MySQL在执行SQL语句时的顺序:from where select group by having order by ;
9.数据完整性:是为了保证插入到数据中的数据是正确的,它防止了用户可能的输入错误。
1.实体(行)完整性:规定表的一行(即每一条记录)在表中是唯一的实体。
1.通过定义主键约束来实现。主键:primary key(特点:不能为null,且唯一)
1.分为:逻辑主键:比如ID,不代表实际的业务意义,只用来唯一标识一条记录。(推荐)
2.业务主键:比如username作为主键
2.主键的声明方式:
1.create table t1( id int primary, name varchar(100) );
2.create table t2( id int,name varchar(100), primary(id) ); 此种方式可以定义联合主键
3.推荐的方式。create table t3( id int, name varchar(100) ); alter table t3 add primary key(id);
4.自动增长的主键(只针对mysql,oracle没有)。create table t4( id int primary key auto_increment, name varchar(100) );
2.域(列)完整性:指数据库表的列(即字段)必须符合某种特定数据类型或约束。
1.非空约束:not null 唯一约束:unique
2.例,create table t5( username varchar(100) not null unique, gender varchar(100) not null, phonenum unique );
3.参照完整性:多表,外键约束。多表设计
1.一对多:create table customers( id int,name varchar(100),address varchar(255), primary key(id) ); create table orders( id int primary key, order_num varchar(100), price float(8,2), status int, customer_id int, constrant(定义外键) customer_id_fk(约束名称:库中要唯一) foreign key(customer_id) References customers(id) );
2.类和数据库表结构对应,对象和数据库中的记录对应。public class Customer{ private int id; private string name; private string address; private List<Order> orders=new ArrayList<Order>(); } public class Order{ private int id; private string orderNum; private float price; private int status; private Customer customer; }
3.多对多:create table teachers( id int primary key, name varchar(100), salary varchar(100) ); create table Students( id int primary key, name varchar(100),grade varchar(100) ); create table teacher_student( t_id int, s_id int, primary key(t_id,s_id),联合主键 constraint teacher_id_fk foreign key(t_id) references teachers(id), constraint student_id_fk foreign key(s_id) references students(id) );
10.多表查询
十七、JDBC技术
十八、事务
十九、数据库连接池
二十、过滤器和监听器
二十一、文件上传
扫码关注公众号
- 后台回复“Java学习资料”免费获取更多Java学习教材及实战资料