day06-SQL
创建数据库:create database day0601;
删除数据库:drop database day0601;
使用数据库:use day0601;
eg.创建表:
create table user(
id int primary key auto_increment,
username varchar(20)
);
修改表:
alter table user rename to user10;
alter table user add password varchar(20);
alter table change password pwd varchar(20);
alter table modify pwd int;
alter table drop pwd;
删除表:drop table user;
插入:
insert into user values(字段值1...);
insert into user(字段,字段2) values(字段值,字段值2);
更新:
update user set 字段名=字段值,字段名1=字段值1 where 条件
删除:
delete from user where 条件
select ... from user where 条件 group by 分组字段 order by 排序字段 asc|desc;
---------------------------------------
多表的创建,关系的创建
常见的关系:
一对多:
在开发中,在多表的一方添加一个外键, 外键的名称一般为主表的名称_id,
字段类型一般和主表的主键的类型保持一致.为了保证数据的有效性和完整性,
在多表的一方添加外键约束(非必须的,可通过java程序来控制)
格式:
alter table 多表名 add foreign key(外键名) references 主表名(主键名)
多对多:
在开发中,一般引入一个中间表,在中间表中存放另外两张表的主键.
这样就可以将多对多的关系拆分两个一对多的关系,
为保数据的有效性,完整性,在中间表上添加两个外键约束(非必须的,可通过java程序来控制)
外键约束的特点:
1.主表中不能删除从表中已引用的数据
2.从表中不能添加主表中不存在的数据
一对一:了解
在开发中,例如:person idcard
思路1:将两个实体合二为一
思路2:在一个表上将这个表的主键设置成外键且添加外键约束.
多表查询:
内连接:
显式的内连接
select a.* ,b.* from a join b on 连接条件;
隐式内连接
select a.*,b.* from a,b where 连接条件;
外连接
select a.*,b.* from a left join b on 连接条件.
展示a表所有数据,根据条件关联查询b表,满足条件展示,不满足以null值展示
子查询:将一个查询的结果作为一张临时表
select user.*,tmp.* from user,
(select * from orders where price>300) as tmp
where user.id=tmp.user_id;
给表起别名:
表 [as] 别名
扩展:
以后开发中很少使用delete,数据无价,删除有物理和逻辑(常用),
逻辑删除一般会在表中添加一个字段(isdel:若值为1,代表删除了;若为0代表没有删除),
此时的删除操作变成了更新操作.
day07-jdbc
jdbc:
java语言操作数据库
jdbc是oracle公司指定的一套规范,
驱动:jdbc的实现类,由数据库厂商提供.
jdbc操作步骤:
1.导入驱动jar包
2.注册驱动
3.获取连接
4.编写sql
5.获取语句执行者
PreparedStatement st=conn.prepareStatement(sql);
6.设置参数
st.setXxx(int 第几个问号,Object 实参);
7.执行sql
ResultSet rs=st.executeQuery();
int i=st.executeUpdate();
8.处理结果
若是resultset
while(rs.next()){
rs.getXxx(int|String)
}
9.释放资源
////////////////////////////////////////
获取src目录下的properties格式的配置文件
ResourceBundle bundle=ResourceBundle.getBundle("不带后缀名的文件名");
String value = bundle.getString("key");
////////////////////////
自定义连接池:
增强方法:
1.继承
2.装饰者模式(静态代理)
3.动态代理
///////////////
装饰者模式(静态代理)
1.装饰者和被装饰者实现同一个接口或者继承同一个类
2.在装饰者中要有被装饰者的引用
3.对需要增强的方法进行加强
4.对不需要加强的方法调用原来方法
///////////////////
常见连接池:
dbcp:
c3p0:★
配置文件:
名称:c3p0.properties或者 c3p0-config.xml
位置:src下
使用:
new ComboPooledDataSource()
////////////////
dbutils:
工具类,封装了jdbc的操作.
使用步骤:
1.导入jar包
2.创建queryrunner类
3.编写sql
4.执行sql
queryrunner:操作sql语句
构造器:
new queryrunner()
方法:
query(..)
update(..)
ResultSetHandler:封装结果集
BeanHandler
BeanListHandler
MapListHandler
ScalarHandler
day08-xml&tomcat
xml:
可扩展的标签语言
作用:
配置文件.
约束:
用来控制xml文档中可以出现那些元素和属性,以及他们出现的顺序
分类:
DTD约束:struts hiebernate
SCHEMA约束:tomcat 项目 spring
//////////////////
dtd约束:
1.会和xml关联.
2.可以通过约束写出xml文件
按f2或者alt+/
? * + | () ,
注意:
一个xml只能出现一个dtd约束
////////////////////////
SCHEMA:
一个xml文件中可以出现多个schema约束
通过名称空间将约束添加的
xmlns="名称空间"
xmlns:别名="名称空间"
/////////////////////////
xml-解析
dom:一次性将整个xml文件加载到内存.可以curd操作
sax:逐行解析 只能进行查询操作
dom4j技术查询xml
1.导入jar包
2.获取document树
Document doc=new SAXReader().read(xml文件路径);
3.获取根节点
Element root= doc.getRootElement();
4.通过根节点获取其他节点
获取属性节点
String value=root.attributeValue("属性名");
获取所有的子元素
List<Element> list=root.elements();
获取一个元素的子元素的标签体
String text=ele.elementText("子元素");
Xpath:扩展:
selectNodes("") 获取多个
selectSingleNode("") 获取一个
/////////////////////////////////
反射:
1.获取class对象
方式3:
Class clazz=Class.forName("全限定名");// 包名+类名 com.mysql.jdbc.Driver
2.通过class对象创建一个实例对象
clazz.newInstance();//相当于调用此类的无参构造
3.获取方法(public修饰的方法)
Method m=clazz.getMethod("方法名称",Class ... 参数类型);
4.执行方法
m.invoke(实例对象,参数...);//相当于 实力对象.m(参数...)
/////////////////////////////
web的概念
web:网页
web资源:
动态和静态
web开发技术
常见的服务器
tomcat:★
下载 安装 启动 退出 配置 目录
web项目的目录结构★
web项目发布:
方式1:放在tomcat/webapps下
eclipse和tomcat整合
在eclipse发布项目
day09-servlet
http:超文本传输协议
请求:
响应:
servlet:★
本质上就是一个类,运行在服务器端的一个java小程序,生成动态web内容处理业务逻辑.
编写servlet:
1.编写一个类 继承了HttpServlet 重写了doGet()或者doPost()
2.编写配置文件
注册servlet
<servlet>
<servlet-name>给servlet起个名字 名字唯一</servlet-name>
<servlet-class>servlet的全限定名</servlet-class>
</servlet>
绑定路径
<serlvet-mapping>
<servlet-name>给servlet起个名字 名字唯一</servlet-name>
<url-pattern>访问路径 目前都是以"/"开始</url-pattern>
</serlvet-mapping>
3.访问路径:
http://主机:端口号/项目名/路径
servlet的体系结构:
所有的servlet应该继承HttpServlet 间接的实现了Servlet接口
httpServlet中的方法:
service(ServletRequest request,ServletResponse response):在这个方法中 将两个参数强转,调用了重载service方法
service(HttpServletRequest request,HttpServletResponse response):获取请求的方式,根据请求方式的不同调用相应doXxx方法
doGet和doPost方法:用来处理我们自己业务逻辑
servlet的生命周期 ★★★
url-pattern的配置:
完全匹配>目录匹配>后缀名匹配
load-on-startup:修改servlet的初始化时机
若我们自己的项目处理不了请求,服务器上有一个默认的servlet会帮我们处理
/////////////////////////////
servletConfig:
servlet的配置对象:
获取servlet名称 初始化参数
获取全局管理者★ getServletContext()
////////////////
servletContext:
上下文
作用:
1.获取全局的初始化参数
getInitParameter("key")
2.共享资源(域对象)
xxxAttribute()
3.获取资源
getRealPath("/1.txt"):获取项目发布到服务器上位置的根目录
getResourceAsStream("/1.txt"):以流的形式返回一个文件
4.获取文件mime类型
getMimeType(文件名称)
域对象:
servletcontext
创建:
销毁:
day10-response&request
response:
操作响应行
状态码
常用方法:
setStatus(int code) 针对的1xx 2xx 3xx
操作响应头:
setHeader(String key,String value):设置
addHeader(String key,String value):添加
常用的响应头:
location:重定向:
response.sendRedirect("跳转路径");
refresh:定时刷新
response.setHeader("refresh","秒数;url=路径");//java
meta标签//html代码
content-type:设置文件的mimeType,及设置响应流的编码并且通知浏览器用什么编码打开
response.setContentType("text/html;charset=utf-8");
content-disposition:设置文件下载
response.setHeader("content-disposition","attachment;filename="+文件名称);
操作响应体
getWriter():
getOutputStream():
注意:俩流互斥,服务器帮我们关闭此流
响应的中文乱码:
response.setContentType("text/html;charset=utf-8");
////////////////////////////////
文件下载:
1.超链接下载
2.编码下载(两个头一个流)
设置文件的mimetype
设置下载头信息
对拷流
扩展:
文件名称中文问题:
方法1:
firefox :base64
其他:utf-8
方法2:(八九成可以使用)
new String(filename.getBytes("gbk"),"iso8859-1");
////////////////////////////////
request:请求 获取浏览器发送过来的数据
操作请求行
getMethod():请求方式
getContextPath():获取项目名称
getRemoteAddr():获取请求的ip地址
操作请求头
String getHeader(String key)
常见的头信息:
user-agent:获取浏览器内核
referer:页面从那里跳转过来的
操作请求参数
String getParameter(String key):
String[] getParameterValues(String key):
Map<String ,String[]> getParameterMap();
请求的中文乱码:
对于get请求:参数追加到地址栏,会使用utf-8编码,服务器(tomcat7)接受到请求之后,使用iso-8859-1解码,所以会出现乱码
对于post请求,参数是放在请求体中,服务器获取请求体的时候使用iso-8859-1解码,也会出现乱码
通用的方法:
new String(参数.getBytes("iso-8859-1"),"utf-8");
针对于post请求来说:只需要将请求流的编码设置成utf-8即可
request.setCharacterEncoding("utf-8");
域对象:request
请求转发:
request.getRequestDispatcher("内部路径").forward(request,response);
request生命周期:
一次请求
////////////////
扩展:封装数据:
apache的BeanUtils
1.导入两个jar包
2.调用 BeanUtils.populate(Object bean,map);
day11-cookie和session
jsp:
java 服务器页面
就是在html代码嵌套java代码,
本质上就是一个servlet,运行在服务器,接受请求,处理业务逻辑,生成动态内容
jsp三个脚本:
<%...%> java片段
生成在jsp的service方法中
<%=...%> 输出表达式
生成service方法中
不能";"结尾
<%!...%> 声明成员
cookie:浏览器端会话技术
由服务器生成,key=value格式,通过响应头(set-cookie)写回浏览器
保存在浏览器端,当浏览器下一次访问的时候,根据一定的规则携带不同的cookie,通过请求头(cookie)携带
常用方法:
构造:
new Cookie(String key,String value);
写回浏览器:
response.addCookie(Cookie c)
获取:
Cookie[] request.getCookies();
cookie的api:
getName():获取cookie的名称
getValue():获取cookie的值
setMaxAge(int 秒):设置cookie在浏览器的存活时间
若设置为0:删除cookie(前提必须路径保持一致)
setPath(String path):设置cookie的路径 /day1101/
若访问的路径中包含cookie的path,则携带过去
注意:
cookie不能跨浏览器
cookie中不支持中文
///
session:
服务器端会话技术:
依赖于cookie
浏览器访问服务器,服务器获取jsessionid
若获取不到
创建一个sesion,将数据保存,将当前session的jsessionid通过cookie返回浏览器
若获取到
拿着该jsessionid去session池中查找有无该session
若查找到:
直接拿过来使用,将jsessionid写回浏览器
若查找不到
创建一个sesion,将数据保存,将当前session的jsessionid通过cookie返回浏览器
常用方法:
获取session:
HttpSession request.getSession():
域对象:
session
生命周期
创建:java代码中可以认为 第一次使用request.getSession创建
销毁:
服务器关闭
session超时
默认超时
手动设置超时
★手动干掉session
session.invalidate()
day12-jsp&el&jstl
jsp:
作用:
将内容的生成和信息的展示相分离
jsp脚本:
jsp的指令:
作用:声明jsp页面的一些属性或者动作
格式:
<%@指令名 属性=值 属性=值%>
page:
重要属性:
import
pageEncoding:
contentType:
了解:
isErrorPage:一旦值为true 可以使用jsp的一个内置对象 exception
include:静态包含,就是将被包含页面或者servlet的所有内容复制过来一起编译运行,只生成一个java文件
taglib:导入标签库
jsp的内置对象:
out
request
response
session
exception
page
config
application
pageContext
jsp的域对象:
pageContext
request
session
application
pageContext的使用:
1.域对象 xxxAttribute()
2.操作其他域对象 xxxAttribute(..,int scope)
3.获取其他的内置对象 getXxx()
4.便捷查找 findAttribute(String key):依次从小到大
jsp的动作标签
jsp:forward 请求转发
jsp:include 动态包含 是将被包含页面或者servlet运行的结果包含进来
el: jsp内置的表达式语言
用来替代 <%=...%>
作用:
注意:
若属性名中出现一些特殊符号 "."等等
必须使用:${域Scope["属性名"]}
1.获取域中的数据
获取简单数据
${域Scope.属性名}
${域中的属性名}:依次从小到大
获取复杂数据
数组和list
${域中的容器名称[index]}
map
${域中的容器名称.键名}
javabean导航
${域中的bean名称.bean属性}
2.执行运算
注意:
+:加法运算
empty:判断一个容器的长度是否为0,还能判断一个对象是否为空
${empty 域中的对象}
${not empty 域中的对象}
三元运算符
3.获取常见的web对象
4.调用java的方法
///////////////////
el内置对象(11个)
cookie:
${cookie.cookie的key.value}
pageContext
${pageContext.request.contextPath}://动态获取项目名
day13-事务&mvc&反射补充
jsp的设计模式
model1:jsp+javabean(了解)
model2:jsp+servlet+javabean
jsp:展示数据
servlet:接受请求,处理业务逻辑
javabean:封装数据,封装对数据的访问
MVC:
将业务逻辑 代码 显示相分离
M:model 模型 封装数据,封装对数据的访问
V:view 视图 展示数据,目前jsp担任
C:ctrl 控制 接受请求
三层架构:
web:
作用:
展示数据
接受请求
调用service
页面跳转,信息的生成
service
作用:
处理业务逻辑
调用dao
dao
作用:
对数据库的curd操作
///////////////////////
反射:
1.获取class对象
2.通过class获取构造器
3.通过class获取字段
4.通过class获取指定的方法
5.可以执行方法
/////////////////////////
事务:
就是一件完整的事情,可以包含多个操作单元,这些单元要么全部成功,要么全部失败
mysql中的事务(了解)
默认自动提交.
控制事务:
1.关闭自动事务
2.手动打开一个事务
start transaction;
commit():事务提交
rollback():事务回滚
java中事务:(★)
Connection的api
setAutoCommit(false):手动开启事务
commit():事务提交
rollback():事务回滚
/////////////////////////////////
如何使用同一个connection
1.向下传递
2.将连接绑定到当前线程
ThreadLocal
set(Object value)
Object get()
remove()
//////////////////////////
DBUtils中事务控制
QueryRunner:
构造:
new QueryRunner(Datasource ds)://自动事务.调用方法的不需要传入connection,资源不用我们释放.
new QueryRunner()://手动事务.调用方法的必须传入connection,需要手动提交事务或者回滚事务.必须手动释放资源
/////////////////////////
事务的特性 ★★★
ACID
原子性 一致性 隔离性 持久性
不考虑隔离性会出现的读问题★★
脏读 不可重复度 虚读
数据库的隔离级别
read uncommitted 读未提交 不能避免任何问题
★read committed 读已提交 避免脏读
★repeatable read 可重复度 避免脏读和不可重复读的发生
serializable 串行化 避免所有的问题
/////////////////////////
servlet
会创建一个servlet
会更改web.xml
servletContext:
全局管理者 上下文
资源共享(域对象)
获取资源文件
getRealPath()
getResourceAsStream()
获取mimetype
getMimeType()
面试题:
serlvet的生命周期
rr
response:往浏览器写东西
重定向:response.sendRedirect(绝对路径)
定时刷新:refresh
setHeader("refresh","秒数;url=跳转路径")
meta
getWriter():字符流
getOutputStream():字节流
文件下载:
setContentType(mime类型)
setHeader("content-disposition","attachment;filename="+文件名);
request:获取浏览器发送过来的数据
获取参数:3个
中文乱码:
通用的方式
new String(名字.getBytes("iso-8859-1"),"utf-8");
针对post请求
request.setCharacterEncoding("utf-8");
请求转发(域对象)
request.getRequestDispatcher(内部路径).forward(..);
cookie和session
cookie:浏览器端会话技术
常用方法:
new Cookie(String key,String value);
写回浏览器
response.addCookie(Cookie c)
获取cookie
request.getCookies()
cookie的api
getName()
getValue()
setMaxAge(int 秒)
setPath(String path)
session:服务器端的会话技术
常用方法:
获取session
request.getSession
域对象:私有的数据
创建:
销毁:
服务器非正常关闭
session超时
手动删除:
session.invalidate()
jsp el jstl
jsp的指令 include taglib
jsp的内置对象 面试题
jsp:forward
jsp:include
el:全部
获取数据
执行运算
jstl:
if
foreach