发表于: 2017-11-16 22:04:28
1 614
一;学习多表查询
1;一对多的查询,以一个大学对应多个学生为例
数据库里通过uid关联,
student类,属性getter以及setter方法
package com.pojo;
//多个学生对应一个大学
public class Student
private int id;
private String name;
private float weight;
university类,同样;就是多了一个students集合
package com.pojo;
import java.util.List;
//一个大学对应多个学生
public class University
private int id;
private String name;
//增加student集合
private List<Student> students;
public int getId()
mybatis配置文件就不说了;直接看映射xml;区分两个同名字段,需要取不同的别名uid以及sid; 不用resultType,用resultMap,通过resultMap把数据取出来放在对应的对象属性里;两表是通过left join关联,u s是表的别名;对University和Student表进行关联查询;也可用where关联,没感觉区别,这样可能更规范;
然后是测试类,也就嵌套一个student的遍历
说一下type和map的区别;
MyBatis查询select映射,返回类型可以用Type,也可以用Map,前者直接表示返回类型的,而Map是对外部ResultMap的引用,resultType跟resultMap不能同时存在。
在MyBatis进行查询映射时,其实查询出来的每一个属性都是放在一个对应的Map里面的,其中键是属性名,值则是其对应的值。
①当提供的返回类型属性是Type时,MyBatis会将Map里面的键值对取出赋给resultType所指定的对象对应的属性。
②当提供的返回类型是resultMap时,因为Map不能很好表示领域模型,就需要自己再进一步的把它转化为对应的对象,这常常在复杂查询中很有作用.结论,嗯,看不太懂,就是多表的时候用map….
再说一下外键约束的问题;
外键指的是本表的某一个字段,指向另一张表的主键(或者是有唯一约束的字段),而约束的作用,是保证插入的数据的一致性,也就是说, 表与表之间的关系能在数据库层面进行关联,就是通过外键约束来搞定,这里没有在数据库用约束,只是通过left join来关联多表.都可以吧
还有一点就是,外键关联主要是为了确保数据的安全性和一致性,因为使用外键也会带来性能上的开销;在某些场合,比如高并发实时电商,还会特意不用外键,以提升数据库性能表现。
2;学习多对一的查询;多个学生对应一个大学
两个bean就不多说了,只是student属性增加一个university
然后是映射配置;换了一下位置名称,估计也是规范……
测试类也就遍历的形式变了一下;
3;本来准备学习多对多的查询,增加一个模型,科目;也就是一门科目可以由多个学生来学;同时一个学生也可以学习多个科目;比较麻烦,而且为了维系多对多关系,似乎还必须要一个中间表,再设置一个科目详情类似的东西……暂时搁置一下,后期再学…………
二,学习cookie和session
最近学的cookie还有session以及token什么的,似乎都是基于web应用,也就牵涉到servlet;又牵涉到jsp,关系简单理一理,刚之前学习Servlet有一个比较弊端,就是在Servlet编写html代码,效率不高,可读性差,难以维护。这就引入jsp,Java Server Pages也就是java服务器页面,算是一个简化的Servlet设计, 不仅在html文件里面写html代码,同时又能在里面调用java的变量.到这里就可以解决servlet了,但是它本身不能独立运行,需要在一个web应用中运行的;而一个web应用是部署在tomcat中的;到这里服务器端基本上完成,就需要浏览器来访问请求了,一个完整的流程;
1;为什么需要cookie和session,牵涉到http协议的无状态性;
上面提到了web应用程序开发流程,其中最后一个交互环节来传输数据,使用的就是HTTP协议,但是Http协议是无状态的,也就是说无法对用户的状态进行保存管理;简单说就是,当浏览器发送请求给服务器的时候,服务器响应客户端请求,但是当同一个浏览器再次发送请求给服务器的时候,服务器并不知道它就是刚才的那个浏览器;服务器无法记忆,所以称作无状态协议。
那么问题来了,正是由于HTTP无状态的协议,一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话;但是要跟踪该会话,必须引入一种机制……
Cookie就是这样的一种机制。它可以弥补HTTP协议无状态的不足。在Session出现之前,基本上所有的网站都采用Cookie来跟踪会话,session也是一样的,都是一种会话跟踪技术,用来跟踪用户的整个会话;只不过Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。
2,cookie的简单学习应用;
概念已经说的够多了,还是再明确总结一下Cookie是一种浏览器和服务器交互数据的方式;也是一种会话跟踪技术,也算是一种缓存机制,它由服务器端创建,但是不会保存在服务器;创建好之后,发送给浏览器。浏览器保存在用户本地;下一次访问网站的时候,就会把该Cookie发送给服务器。Ok
从jsp的小demo开始;理解一下底层的机制
设置一个简单hello cookie
验证调试
获取cookie
验证调试,除了刚刚设置的hellocookie还有一个tomcat的设置的
总结;这是一个简单的cookie生成以及获取流程,设置一个cookie,访问路径,tomcat服务器会把用户名放进cookie里,然后相应给浏览器,保存在本地,然后get路径再次访问,这个时候就会获取客户端的cookie,从而取出用户信息.
3;session的学习应用
概念不说了,前面提的够清晰了,实际理解就是,从用户打开浏览器访问一个网站开始,无论在这个网站中访问了多少页面,点击了多少链接,都属于同一个会话。 直到该用户关闭浏览器为止,都属于同一个会话.而会话是在服务器里的,也可以抽象理解为服务器里的一个个小盒子.
一个小demo
设置属性信息
获取属性信息
调试获取
总结一下流程,客户端第一次访问,没有对应的cookie信息,服务器会创建一个新的session,把name2放进session中,然后带上对应的jsessionid相应给浏览器,保存到cookie中,访问get路径,这个时候会带上再服务器里创建好的jsessionid,访问服务器,与服务器里的session匹配,找到对应的会话,取出信息.
到这里可以理解为,session是服务器里的小盒子,而cookie是浏览器的小钥匙;两者匹配之后完成一次访问请求;这样看起来一次访问流程的处理,有两种方法;
A,只用cookie,把信息直接保存到客户端,似乎不安全
B,用session和cookie的联合,一个放到客户端,一个放到服务器,这样看起来肯定比只用cookie安全,毕竟验证了两次信息
4;关于session上面看起来必须要和cookie一起用才行,但是当浏览器把cookie关闭了,就麻烦了,因为没有jessionid,每一次的访问服务器找不到jsessionid就会自动创建要给新的session,这样的话,服务器大概会爆炸吧???解决办法是response.encodeURL方法; 会把之后重复请求的getSession.jsp这个url转换为一个对应的jsessionid
关闭并清除浏览器的cookie
试一下cookie,果然访问没有了cooie,而且有效期就是整个会话结束,也就是关闭浏览器
排除干扰之后,来验证session没有cookie怎么工作的,每一次的访问jsessionid都不一样,也即是每一次都重新生成了session
Ok加上encodeurl方法试一下;
再访问,每一次都转换了统一的jsessionid
第一次创建session并且生成jessionid
第二次访问,第三次访问都会用第一次生成的jsessionid,经过转化来匹配session
5;cookie以及session的原理操作基本上已经完了,然后百度一下做个总结
A,Session
在服务器端保存用户信息(保存在服务端的内存里面)
Session中保存的是object类型
随会话的结束而将其存储的数据销毁
保存重要的信息(安全性比较高的信息)
B,cookie
在客户端保存用户信息(以文本文件的形式存在)
cookie中保存的是String类型
cookie可以长期保存在客户端
保存不重要的用户信息(浏览记录,访问习惯)
6..用session以及cookie验证登陆……简单写了点….今天学完token加密之后再完善...
明日计划的事情:
1;学习加密知识概念流程
2;完成加密内容代码
3;学习拦截器
遇到的问题及解决方法:
1;联表查询的时候,突然发现有一个属性值为0……刚开始还没注意,第二次看到时候发现的
数据库没问题
最后发现,写顺手了…体重字段不需要别名来区分,因为学校没有这个字段….加上别名,sql语句又没有注明,匹配不到就默认为0了……
解决办法就是去掉,正常写就可以了;
还有一种就是继续用别名,但是sql语句里加上也可以;虽然也可以解决,不过不可取,多此一举………
2,jsp乱码了………起初以为一个小demo,什么过滤器的都没用,
不过按道理来说;指令开头已经标识了utf8….
捣鼓了一通………先入为主,一直认定为中文乱码问题,回头仔细看报错信息…….
哎,仅仅是一个空格引发的问题而已……嗯,报错,不要主观判断,有报错信息必须看信息,有日志看日志,不要自己瞎搞,快速定位,才能快速解决
3;为什么设置cookie有效期不一致,设置一天,为什么浏览器显示16个小时
c1.setMaxAge(60 * 60 * 24);
又换了一个浏览器查看,发现是一天24小时…..
最后问题是时间格式的区别,上面的那个时间带T以及Z,是世界UTC通用标准时,主要以z来标识,大概意思是,t表示占位符,代表am/pm ,而z表示时区的偏移量,我们这里东八区加8就可以了,那样就是21点了,刚好24小时一天;很ok.
收获:
1;学习了一对多以及多对一的联表查询
2;学习了cookie以及session
3;掌握小技能
评论