SSM框架学习笔记

时间:2022-04-26 13:16:02
框架部分


spring 第一天


思想:高内聚、低耦合
IOC底层原理(XML方式):
1 xml配置文件
2 dom4j解析xml
3 工厂设计模式
4 反射


属性注入三种方式:
构造器,setter注入,接口注入
注意在Spring框架中只支持前两种方式!setter注入用得最多!


注入复杂类型的属性(List、Map等),详见配套的文档资料,Spring4_day01讲义.pdf


spring 第二天
注意看每一个资料里面的PDF讲义!!!
**********
使用注解方式来代替配置文件,但是不能完全代替,配置文件还是要有的,只是不需要写那么多东西了。
一般实际中是两者结合使用的,配置文件方式创建对象,注解方式注入属性。


注意applicationContext.xml文件中要重新引入约束,开始我没引入(以为MyEclipse会自动引入),结果
报错了。引入方式按照视频中说的,找到Spring解压包HTML文件夹最后一个html,从后往前找,找到相应的
复制过来就行。然后再写一句话(这句话告诉IOC要去哪扫描!!)
<context:component-scan base-package="cn.itcast.anno"></context:component-scan>
注:
<!-- 只会扫描属性上的注解,不建议使用 ,开发中使用上面那句-->
<!-- <context:annotation-config></context:annotation-config> -->


这样就能通过注解方式创建对象了。另外引入约束后提示也就有了。
书上好像不是用这种引入另外约束的方式,而是另写了一个Config类 见237页。


04
注解方法注入对象,可以用 @Autowired 和 @Resource(name="")
用得最多的还是第二种,更准确


——————
博客中的某个评论:
讲的还不错,但是我觉得有些地方讲的还是不大妥当,比如缺点中的第二条,理论上spring是提高了
应用的运行效率的,一般IoC容器是启动时根据依赖关系将所有的普通对象全部创建出来并放在容器中,
是常驻内存的,除非配置为启动时不创建对象,所以IoC的缺点应该是对内存的要求比较高,并且在
启动时比较慢而已,但是一旦启动完成,几乎所有用到的对象都已经创建完毕,使用时直接从容器中
拿就是了,效率非常高


10
使用aspectJ实现AOP有两种方式:
1 基于aspectJ的xml配置
2 基于aspectJ的注解方式


还得加入新的约束(参见之前的方法),可以在项目中另加一个Spring配置文件,里面写现在需要的约束。


*****
第2天最后一节好像有点用,教你怎么通过配置(主要配置web.xml)来用Spring整合web框架
SSM整合的话没准也是这样


day03
奇怪,在Spring的配置文件中开启了AOP操作,即
<!-- 配置AOP -->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
就可以使用注解方式实现AOP了,不用在另外开启注解扫描?或者说上一句话已经自动开启了注解扫描?
已解决:
之所以不用开启注解扫描是因为我们是通过配置文件方式创建的对象,如果采用纯注解方式,即用
@Component来创建对象,那么就报错了!因此还得开启注解扫描。


jdbcTemplate
****
别忘了导入mysql的驱动包!!MyEclipse不会自动加上
jdbc:mysql://localhost:3306/mydb1 可以简写为 jdbc:mysql:///mydb1


就jdbcTemplate和dbutils而言,其实后者更方便些!


第三天后面的spring事务管理的测试挺好的,我没有写,详见视频!
分别写了XML和注解两种方式,注解简便些!


*******java8 中可使用lambda表达式代替匿名内部类,使程序看起来更简单
详见书 312页
我尝试使用了lambda发现报错,原因应该是我的JRE是1.6的(我应该一直用的1.8的JDK,1.6的JRE...)
把JRE改为1.8以后就没问题了,和匿名内部类一样可以实现jdbcTemplate的查询。






-----------------------MyBatis---------------------
可以多看看资料中的MyBatis教案文档和每天的笔记,很详细!
下载MyBatis,里面有它的核心jar包 和一些依赖jar包,使用MyBatis首先要创建
核心配置文件,sqlMapConfig.xml 可以从教案上复制
最新发现:
要把资源放到类路径下,除了放src文件夹,还可以新建一个 source folder文件夹 和src并列
里面写的东西也会在类路径下!!


User.xml中有很多sql,都会封装到mappedStatement对象中!是一个底层对象
里面sql语句是以statement为单位的,id也称为Statement的id


占位符不再是写?啦,而是#{}


搞了一个小时的日志,终于知道了为啥输出不到文件,
log4j.rootLogger=debug,stdout,file
之前没写file,把file加上就行了。另外最好调成debug,用info的话可能也没有日志信息。


最新发现:insert 语句里面用value和values都行!


当主键是自增时,插入就没必要指定主键了。但是插入后我想获取主键咋办?
如果直接获取(比如user.getId()),那么得到的是0,因为你不指定它默认就是0。
解决办法:可以在insert元素中配置 <selectKey><selectKey/>,详见笔记。


****select uuid();可以得到一个uuid值!!!


//默认是不自动提交的,所以还得提交,和spring整合了以后就不用了
//增删改都得提交
sqlSession.commit();


SqlSession是一个面向用户(程序员)的接口。
SqlSession中提供了很多操作数据库的方法:如:selectOne(返回单个对象)、
selectList(返回单个或多个对象)、。
SqlSession是线程不安全的,在SqlSesion实现类中除了有接口中的
方法(操作数据库的方法)还有数据域属性。
SqlSession最佳应用场合在方法体内,定义成局部变量使用。


mybatis开发dao两种方法:
   原始dao开发方法(程序需要编写dao接口和dao实现类)(掌握)
   mybaits的mapper接口(相当于dao接口)代理开发方法(掌握,建议这种)


MyBatis会自动完成类型转换,比较java里面的Date和JDBC的Date,因为有个类型处理器默默
帮我们完成了!!


******
resultType和resultMap
使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。
如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间作
一个映射关系。


动态SQL
我的理解是动态SQL和JSTL比较相似,但不同的是JSTL里面写变量要用EL ${...}
动态SQL里面可以在引号里面直接写传入POJO的属性名


*****后面很多笔记都没记,详见上课的文档!!!


-----------------SpringMVC-----------------
SpringMVC是spring框架的一个模块,无需整合!


前端控制器其实就是一个Servlet
Handler、controller说的都是一个东西,需要我们编写


映射器就是根据url找Handler,适配器就是根据要求规则执行Handler


注意:注解方式的映射器和适配器必须配套使用(即不能用了注解的适配器又用非注解的映射器)
搞了很久没想明白的是:
对于这种注解方式,直接在容器中注册单个bean能用,用注解扫描的方式就不行(一开自动扫描就报错)。
但视频中就是可以啊。。


第一天中间有一个很好SSM整合的小案例,虽然功能简单,但整合的一整套流程还是比较清楚的!!
可以多看几遍!!!


把视频中的项目导入进去,发现MyBatis的映射文件(xml文件)第一行都报错,后来发现
在网址上加上www可以解决。(把项目设置为jdk1.8就没这个问题了)


web.xml 中路径配置 /WEB-INF/classes/spring/xxx 也可以写成 classpath:spring/xxx


SSM小整合项目总结:
花费了整整一天的时间找到之前不能成功的原因,居然是JDK版本问题。
新建项目的时候直接建jdk1.8的,然后MyEclipse自动导入的spring4.1版本,也包括SpringMVC模块,
然后再把MyBatis的包加进去,别忘了还有整合包。
这样把视频中的项目复制进去就不会出来扫描不生效、404等奇怪的错误。
不过还有一个未解决的问题是:
在xml中通过配置自动扫描来使用注解当然没问题,但采用书上写配置类的方法却没有用,
在普通的测试代码中通过 new 出IOC容器的方式还是有用的,但在这样的web项目中没用,还没找到原因。
具体项目见SSM




BeanUtils.copyProperties(items,itemsCustom);
把items的属性拷贝到itemsCustom,一般itemsCustom是items的一个封装类(扩展了其他属性)