整个涉及到很多内容,写不完,只能把整个代码包发上来,在之后有空整理
项目需要登陆,数据库配置文件如下,我放在resource文件夹下了
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost/cn_test
jdbc.username=root
jdbc.password=root
initialSize=2
maxActive=2
内部包含了AOP切面,Spring事务等等很多内容,
IOC:负责管理Controller/service/dao,维护它们之间的关系。
AOP:面向切面编程,不修改原有代码,给系统增加新的功能。
mybatis:对数据库进行操作。
整体规范:
- 所有的请求ajax方式访问
- 前端页面采用HTML
- 请求结果进行JSON响应
{"status":0(成功)/1(失败),"msg":, "data":}
项目流程
cmmi,前身是CMM,软件成熟度模型,认证。
SSM框架:springMVC + spring + Mybatis
创建云笔记项目环境
- 导包
- 添加配置文件
- conf/spring-mvc.xml
- conf/spring-mybatis.xml
- mapper/SQL文件
- web.xml
- 划分包结构
- cloud_note.dao
- cloud_note.service
- cloud_note.controller
- cloud_note.entity
- cloud_note.util
使用UUID来生成字符串算法,用于当数据库主键
数据库中自动生成主键会有两次操作数据库(一次是插入,一次是返回插入自动生成的id)损耗性能。
Dao接口的传值特点:
public interface Dao{
public void fn();
public void fn(String str);
public void fn(Map map);
public void fn(User user);
}
总结:mybatis中Dao方法要么没有参数,要么一个参数。
JavaScript中在函数中阻止事件冒泡,直接在函数结束写上return false就行了。
Spring AOP(aspect oriented programming)面向切面编程
将共同的业务处理从传统业务处理中抽离出来,单独封装,
然后以配置的形式进行关联。
可以在不修改原有逻辑代码的情况下,给系统追加功能。
AOP典型应用:
- 追加事务控制
- 异常日志记录
AOP:
切面(aspect)
指的是封装了共同处理的组件,并且能够切入到其他组件的方法上。
切入点(pointcut)
用于指定目标组件的方法。
- 方法限定表达式
可以给某个组件中部分方法追加共同功能。
execution(修饰符? 返回类型 方法名(参数) 异常抛出?)
execution(* add*(..)) --匹配到add开头的所有方法
execution(* service.*(..)) --匹配service包下的所有方法
execution(* service.*.*(..)) --匹配service包下所有类的所有方法
execution(* service..*(..)) --匹配service包及子包的所有方法
- 类型限定表达式
可以给某个组件的所有方法追加功能
within(类型)
with(service.UserService) --匹配UserService组件下所有方法
with(service.*) --匹配service包下所有类的所有方法
with(service..*) --匹配service包及子包的所有方法
- bean名称限定表达式
可以给某个组件中所有的方法追加功能
bean(id名)
bean(userService) --匹配id=userService的组件的所有方法
bean(*Service) --匹配以Service结尾的所有组件的所有方法
通知
用于指定切入的时机,spring提供了五种通知类型
try{
前置通知<aop:before>
--执行的目标方法
后置通知<aop:after-returning>
}catch(){
异常通知<aop:after-throwing>
}finally{
最终通知<aop:after>
}
@around=前置+后置通知
切面:追加单独封装的代码
切入点:切入点,给特定的模块追加
通知:什么时候切?前置/后置/环绕
动态代理
AOP原理:使用动态代理技术,可以创建一个新的类型,
重写目标接口或目标类的方法,在重写方法中,追加要
切入的功能代码和方法代码
spring有两种动态技术:
- 基于目标接口的
- 基于目标类的
public class $Proxy20 implements UserService{
public void check_login(){
-- 追加了事务处理
-- 重写了UserServiceImpl.check_login()
}
}
public class $Proxy20 extends UserService(){
}
AOP注解配置
- 注解标记,@Component,起到定义<bean>的作用
@Aspect <aop:aspect ref="loggerBean">
@Before <aop:Before pointcut="within()">
案例:
- 要求:当系统发生service异常,将异常信息写入日志文件
- 切面:将异常信息写入文件
- 切入点:after-throwing("with(service..*)")
Mybatis关联映射
将数据库中有关联关系的表,以实体对象引用的方式体现出来
当业务需要对数据库进行关联查询的时候。
可以通过一条SQL语句完成关联查询,也可以通过两条SQL语句进行关联查询。
案例:通过userId查询用户信息和关联的笔记本信息。
1.User实体类
2.定义Dao接口,配置Mapper文件
3.测试
2个SQL语句:语句简单,但配置繁琐,与DB两次交互
1个SQL语句:语句复杂,配置较简单,与数据库交互一次
主键的字段处理
在数据库使用自增列或序列作为主键时,如何再insert执行后,
立即获取ID值
spring事务管理
什么是事务?程序为了保证业务处理的完整性,执行一个或多个SQL语句。
管理:对事务中的SQL语句进行提交或回滚,叫做事务管理。
作用与service方法上。
- oracle: commit/rollback (DML操作)
- JDBC: 自动commit
通过spring对事务进行管理
1.配置spring-transaction.xml
2.使用@Transactional
可读可写:select @Transaction(readOnly=true)
回滚特性:默认RuntimeException回滚,其他异常不回滚
@Transaction(rollback=IOException)
传播特性:
隔离特性:针对事务并发进行处理,脏读/幻读
String... 动态参数,就是String[]
前端样式用的是layui,一个十分好用的前端框架
1.png
有分页搜索的功能
2.png
校验登陆
3.png
AOP切面原理
aop.png
关于事务
事务.png
源代码:链接:https://pan.baidu.com/s/13SkSFaioLhd0FlwpujBIeg 密码:r2zl
网友评论