笔记
多表约束 外键约束,用来保证数据完整性 ( 多表之间 ) [ 表与表之间的连系 ] foreign key () alter table 表名称 add foreigh key (列名称) references did () ; 设置外键[一个表指向另一个表]alter bable 表名 add foreigh key (列名) references key dept(列名); 表与表之间的关系一对多的关系 例如 : 一个部门下可以有多个员工,一个员工只能属于某一个部门 建表原则 : 在多的一方创建外键指向一的一方的主键 [ 多的外键指向一的主键 ] 多对多的关系 例如 : 一个学生可以选择多门课程,一门课程可以被多个学生选择 建表原则 : 需要创建第三种表 ( 中间表 ) , 在中间表中至少两个字段分别作为作为外键 , 指向多对多双发的主键 一对一的关系 例如 : 一个公司可以有一个注册地址,一个注册地址只能对应一个公司 建表原则 : 假设一对一是一个一对多的关系,需要在多的一方创建外键指向一的一方的主键,将外键设置为唯一 ( unique ) 班级,学生,课程 多表查询的分类连接查询交叉连接[cross join]查询到的是连哥哥表的笛卡尔积 select * from 表1 cross join 表2; select * from 表1,表2; 内连接[inner join]inner 是可以省略的 显示内连接 在SQL中显示的调用 inner join 关键字 select * from 表1 别名 inner join 表2 别名 on 关联条件; 隐式内连接 在SQL中没有调用 inner join 关键字 外连接[outer join]outer 可以省略 左外连接 以左表为基准,根据关联条件去右表查询,如果匹配上了则返回匹配上的数据,如果匹配不是则返回null 右外连接子查询 一个查询语句条件需要依赖另一个查询结果 带in的子查询 意思 : 范围 例如查询学生生日在91年之后的班级信息 select * from classes where cid in ( 把下面的语句放进来 ) ; select * from student where birthday > '1991-01-01' ; 带exists的子查询 意思 : 存在 [ 相当于 if ] 例如查询学生生日大于91年,如果记录存在,前面的SQL语句就会执行 select * from classes where exists ( 把下面的语句放进来 ) ; select * from student where birthday > '1991-01-01' ; 带any的组查询 意思 : 任意一个 例如 select * from classes where cid > any ( select cno from student ) ; 带all的子查询 意思 : 所有 例如 select * from classes where cid > all ( select cno from student ) ; 事务管理[ 在财务上 , 比如支付宝转账 , A转账给B , B接收到才算成功 , 要不然就没有转过去 ] 指的是逻辑上的一组操作,组成这组操作的各个逻辑单元,要么全成功,要么全失败 开启事务 start transaction ; 提交事务 commit ; 回滚事务 rollback ; 重要!!!!!事务的特性ACID原子性 事务的不可分割 , 组成事务的各个逻辑单元不可分割 [ 每一个步骤都不可分割 ] 一致性 事务执行的前后 , 数据完整性保持一致 隔离性 必须要做的 , 控制并发 事务执行不应该受到数据库中其他事务的干扰 持久性 事务一旦提交 ( 结束或者回滚) , 数据就持久化到数据库中 [ 硬盘中 ] ACID [原子性 ,一致性 ,隔离性 ,持久性 ] 隔离级别出现的安全问题脏读 一个事务读到了另一个事务未提交的数据 , 导致查询结果不一致 不可重复读 一个事务读到了另一个事务已经提交到update的数据 , 导致多次查询结果不一致 虚度/幻读 一个事务读到了另一个事务已经提交到insert的数据 , 导致多次查询结果不一致 解决这些安全性问题 read uncommitted : 脏读 , 不可重复读 ,虚度都有可能发生 [ 读到未提交的] read committed : 避免脏读 , 但是不可重复读和虚读是有可能发生 [ 读到提交的] repeatable read : 避免脏读和不可重复读 ,但是虚读有可能发生 [ 读到了insert的] serializable : 避免脏读,不可重复读 ,虚读 [ 排队来就会都避免了]串行化 【 一般采取中间两个级别 , 两端太极端 】 设置事务的隔离级别 set session transaction isolation level 隔离级别 ; 查看当前的隔离级别 select @@tx_isolation ; //这是关闭自动提交,在数据业务逻辑层写
Connection conn = nu;
try{
conn = JDBCUtils.getConnection(); -----获得一个连接
conn.setAutoCommit(false); ----关闭自动提交
}ThreadLocal : 当前线程 反射 一个Java类加载到内存,只有一个class文件 构造方法:Constructor 成员属性:Field 方法:Method【重要,反射操作方法,让方法执行】 ==:比的是地址 执行方法:invoke(); 获得无参构造 前提有一个类对象,里面有一个run()方法,而且获得了这个类的字节码对象,
【Class clazz=Class.forName(类的全路径)】
Person person = (Person)clazz.newInstance();
person.run();获得有参构造
前提有一个类对象,而且获得了这个类的字节码对象
【Class clazz=Class.forName(类的全路径)】
Constructor c = clazz.getConstructor(String.class,Integer.class);
Person p =(Person) c.newInstance("哈哈",23);获得类中属性
【Class clazz=Class.forName(类的全路径)】
Field field = clazz.getDeclaredField("类的属性名称"比如name); -----获得属性
field.setAccessible(true); ----设置
Field field = clazz.getDeclaredField("类的属性名称"比如age); -----获得属性
field.setAccessible(true); ----设置
Person p =(Person) c.newInstance("哈哈",23); ---
String name = (String)field.get(p);
Integer age = (Integer)field.get(p);重要!!!!!获得方法并执行
//无参方法
前提有一个类对象,而且获得了这个类的字节码对象
【Class clazz = Class.forName(类的全路径)】
Method method = clazz.getDeclaredMethod("方法名");
method.setAccessible(true);
method.invoke(clazz.newInstance()); ---执行
//有参方法
Method method2 = clazz.getDeclaredMethod("方法名",传的方法参数,String.class);
String s = (String) method2.invoke(clazz.newInstance(),"哈哈"); ---执行Serclet执行过程【Web.xml】里面的执行过程
Clazz clazz = Class.forName(全路径);
Method method = clazz.getMethod("service",HttpServletRequest.class,HttpServletResponse.class);
method.invoke(clazz.newInstance(),request,response);内省 用来获得JavaBean的属性及属性的get 或set 方法 JavcBean:就是一个满足了特定格式的Java类:私有属性,无参构造,有参构造,get/set 获得Bean
//获得Bean的信息
BeanInfo beanInfo = Introspector.getBeanInfo(User.class);
//获得Bean的属性描述
PropertyDescriptor [] pds = beanInfo.getPropertyDescriptor();
//遍历 pds
for(PropertyDescriptor pd: pds){
Method get = pd.getReadMethod(); //获得get方法
Method set = pd.getWriteMethod(); //获得set方法
}DbUtils 商品添加重复提交问题的解决办法:【令牌机制叫:token】 令牌机制(一次性) 生成随机的令牌保存在 session 中 在表单的提交的时候,将随机的令牌放入到表单的隐藏字段中 在 Servlet 中获得 session 中和表单中的令牌是否一致 如果一致执行插入操作,不一致跳转到其他页面,将令牌销毁 商品的信息修改 在列表页面点击【修改】 商品信息删除页面写跳转Servlet 在Servlet 1,接收pid 2,调用业务层,方法delete(pid); 在Service 1,调用Dao 在Dao 1,连接 2,sql语句 3, 批量删除 1,在;页面加入一列复选框,实现全选全不选 2, 分页 分页功能的实现 【推荐】物理分页:一次只查10条记录,点击下一页,再去查询后10页使用SQL语句进行控制的分页 缺点:经常需要和数据库交互, 优点:如果数据量特别大,不会导致内存溢出 逻辑分页:一次性将所有数据全部查询出来,根据需要进行截取,List集合进行控制subList(); 缺点:数据量如果特别大,容易导致内存溢出 优点:与数据库交互次数少 不同的数据库对分页的语句也不是一样的 MYSQL进行分页:使用limit关键字 select * from xxx where ... Group by ... Having ...Order by ... Limit a , b; a:代表从哪儿开始 b:代表查询的记录数 根据页数计算limit后面的两个参数:a和b 当前页数 a条数 b显示的个数 1 0 10 2 10 20 a条数 = (页数 - 1)* b显示个数 参数的传递: 前台 ----> 后台 : 当前页数 后台 ----> 前台 : 当前页数,总共页数,总记录数,显示个数,数据 使用JavaBean封装参数: 后台 ----->前台 :传递一个JavaBean就可以 Oracle进行分页:使用SQL语句嵌套 SQL Server数据库进行分页,使用top关键字 AJAX 响应的数据: 文本,一段HTML的数据,XML,JSON 使用工具生成XML的文件: 通常使用xStream工具,将集合,数组,对象转成XML XStream修改标签名 xstream.alias("city",City.class); 把后面的换成前面的 将类中属性作为标签的属性 xstream.useAttributeFor(City.class,"cid"); 把前面的换成后面的属性标签 xstream.useAttributeFor(City.class,"cname"); xstream.useAttributeFor(City.class,"pid"); JSON 轻量级的数据交换格式, JSON的数据格式: 对象表示为键值对 数据由逗号分割 字符串(在双引号中) 逻辑值(true或false) 花括号保存对象 { } 方括号保存数组 [ ] null {"id":1,"name":aaa} ---单个值
{"id":1,"name":aaa},{"id":2,"name":bbb} ---多个值
{
“city”:{"cid":1,"cname":"xxx"}
}JSON的生成工具 JSONlib: JSONArray :将数组或List集合转成JSON JSONArray.fromObject(list集合名称); JsONObject :将对象或Map集合转成JSON fastjson: JSON 的 JS里面写法
$(function(){
$("#province").change(function(){ ---绑定事件
var pid = $(this).val(); ---获取pid的值
$.post("/day22/cityServlet",{"pid":pid},function(data){
----提交方式和JSON方式
var $city = $("#city"); ---获取市的列表
$city.html("<option>-请选择-</option>"); ----覆盖原有option的内容
$(data).each(function(i,n){ ----遍历
// ---- 往option里面填写 value值和 内容
$city.append("<option value='"+n.cid+"'>"+n.cname+"</option>");
});
},"json"); ----json方式
});
});监听器(Listener) 就是一个Java类,用来监听其他的Java的状态的变化 都是实现相应的类 配置监听器
< listener >
< listener-class >监听器的全路径< /listener-class >
< /listener >用途 用来监听其他的对象的变化的 主要应用在图形化界面中比较多 GUI,Android 监听器的术语 事件源 :指的是被监听的对象(汽车) 监听器 :指的是监听的对象(报警器) 事件源与监听器的绑定 :就是在汽车上安装报警器 事件 :指的是事件源的改变(踹汽车一脚) ---主要的功能获得事件源对象 web中的监听器 Web中的Listener和Filter是属于Servlet规范中的高级的技术 Web中监听器共有三类八种(监听三个域对象) 事件源:Servlet中三个域对象:ServletContext,HttpSession,ServletRequest 监听器:自定义类实现 8 个接口 事件源和监听器的绑定:配置 三类八种第一类创建销毁 需要配置 一类:监听三个域对象的创建和销毁的监听器 ServletContextListener -----监听ServletContext的创建和销毁【重点】 HttpSessionListener -----监听HttpSession的创建和销毁 ServletRequestListener ------监听ServletRequest的创建和销毁 二类:监听三个域对象的属性变更的监听器(属性添加,移除,替换) ServletContextAttributeListener -----监听ServletContext对象的属性变更 HttpSessionAttributeListener -----监听HttpSession对象的属性变更 ServletRequestAttributeListener -----监听ServletRequest对象的属性变更 三类:监听HttpSession中的JavaBean的状态改变(绑定,解除绑定,钝化,活化) HttpSessionBindingListener -----监听HttpSession中的JavaBean的绑定和解除绑定 HttpSessionActivationListener -----监听HttpSession中的JavaBean的钝化和活化 ServletContextListener【重点】 程序优化,写到这里面,在服务器启动时就创建 创建:服务器启动的时候,服务器为每个web应用都创建一个 销毁:服务器关闭的时候或者从项目中移除的时候 监听ServletContext的创建和销毁【重点】 方法: contextInitialized ---创建 contextDestroyed ---销毁 【企业中的应用】 1 . 加载框架的配置文件:Spring框架 ContextLoaderListener 2 . 定时任务调度 -----比如qq生日发邮件,定时的 Timer schedule(任务,日期,延时) schedule(任务,延时,) TimerTask HttpSessionListener【了解】 创建:调用geiSession 销毁:非正常关闭。。。。 访问Servlet不会被创建Session 访问JSP会创建Session 访问html不会创建 ServletRequestListener【了解】 创建:客户端向服务器发送一次请求,服务器就会创建request对象 销毁:服务器对这次请求做出响应后就会销毁request对象 访问Servlet会创建request对象 访问JSP会创建request对象 访问HTML会创建request对象 第二类属性变更 需要配置 监听三个域的属性的添加,移除,替换 三个一样,方法名都一样 第三类JavaBean对象状态改变 不需要配置 钝化:序列化到硬盘 sessionWillPassivate() 活化:反序列化 sessionDidActivate() 优化Session 通过配置 < Context > 标签配置定时 session 序列化 在 tomcat / conf / context.xml 中配置 < Context > 在tomcat中所有的虚拟主机和虚拟路径都会按照这个配置执行 在tomcat / conf / Catalina / localhost / context.xml 配置 < Context > 在tomcat中的localhost虚拟主机中的所有虚拟路径按照这个配置执行 在当前工程下的META-INF / context.xml 配置 < Context > 在当前这个工程按照配置执行 过滤器
|