《Java EE互联网轻量级框架整合开发— —SSM框架(Spring MVC+Spring+MyBatis)和Redis实现》笔记

综合 同时被 2 个专栏收录
1 篇文章 0 订阅
2 篇文章 0 订阅

一、几个常识性错误

  1. SSH框架的概念
      其实很多初学者混淆了一个概念,SSH实际上指的是Struts 1.x + Spring + Hibernate,这个概念已经有十几年历史了。在Struts 1.x的时代,Struts 1.x是当之无愧的MVC框架的霸主,但是在新的MVC框架涌现的时代,形势已经完全不是这样了,Struts 2.x借助了 Struts 1.x 的好名声,让国内开发者认为Struts 2.x 是霸主继任者(两者在技术上无任何关系),导致国内程序员大多数学习基于 2.x 的框架,又一个貌似很火的概念出来了 S2SH(Struts 2.x + Spring + Hibernate)整合开发。

  2. MVC与三层架构的关系
      MVC: Model + View + Controller(数据模型+视图+控制器)
      三层架构: Presentation tier + Application tier + Data tier(展现层+应用层+数据访问层)
      那MVC和三层架构有什么关系呢?在我面试程序员的时候,经常有面试者回答:MVC的M就是数据访问层、V就是展现层、C就是应用层。怎么样?听上去是不是好像很有道理?
    实际上,MVC只存在三层架构的展现层,M实际上是数据模型,包含数据的对象。在SpringMVC里,有一个专门的类叫Model,用来和V之间的数据交互、传值;V指的是视图页面,包括JSP、freeMarket等;C就是控制器。
    三层架构是整个应用的架构,是由Spring框架负责管理的。一般项目结构中都有Service层、DAO层,这两个反馈在应用层和数据访问层。

第一章 认识SSM框架和Redis
1.1 Spring框架
  1.1.1 Spring IoC
    IoC是一个容器,认为一切Java资源都是Java Bean.
IoC的目标是管理这些Bean(bean的创建、事件、行为、依赖关系等)
  1.1.2 Spring AOP
    核心就是切面
1.2 Mybatis简介
1.2.1 Hibernate简介
    是对象关系映射框架(把POJO对象和数据库表相互映射),简称ORM框架。
1.2.2 Mybatis
    也对象关系映射框架(把POJO对象和数据库表相互映射)
    
1.2.3 Hibernate和Mybatis的区别

(1)Hibernate不需要编写SQL,Mybatis需要。

(2)Hibernate是全表映射(因为是全表映射,所以十分影响性能),Mybatis是部分映射。

(3)Hibernate适合管理系统,注重业务逻辑,其次才是性能。Mybatis适合互联网系统,虽需提供接口和SQL,导致工作量较Hibernate大,但正因此Mybatis更具有灵活性和可优化性。
1.3 Spring MVC简介

Model(模型),封装了应用程序的数据和由它们组成的POJO。

View(视图),负责把模型数据渲染到视图上,将数据以一定的形式展现给用户。

Controller(控制器),负责处理用户请求,并建立适当的模型把它传递给视图渲染。
1.4 最流行的NoSQL——Redis
  支持六种数据类型:字符串、哈希结构、列表、集合、可排序集合和基数。

优点:作为持久层,由于存储的数据是半结构化的,这意味着计算机在读入内存中有更少的规则,读入速度更快,更具性能优势。

作为缓存,可以支持大数据存入内存中,因为在内存中的数据读写比磁盘的读写快几十上百倍,所以响应速度快。
1.5 SSM+Redis结构框图及概述

第二章 Java设计模式

2.1 Java反射技术
  2.1.1 通过反射构建对象
  2.1.2 反射方法
  2.1.3 实例

2.2 动态代理模式和责任链模式
  2.2.1 JDK动态代理
    条件:需要借助一个借口才能生成代理对象
    方法:实现 java.lang.reflect.InvocationHandler接口,它里面定义了一个invoke方法,并提供接口数组用于下挂代理对象,如代码清单 2-9所示
  2.2.2 CGLIB动态代理
    优势:不需要接口(只要一个非抽象类就能实现动态代理)
  2.2.3 拦截器
  2.2.4 责任链模式
    当一个对象在一条链上被多个拦截器拦截处理时,这种设计模式称之为责任链模式。
例:程序员需要请教一周,请假条就是一个对象,它需要经过项目经理、部门经理和人事经理批准,这3个看作是3个拦截器。
2.3 观察者模式
  2.3.1 概述
    又称发布订阅模式,观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监视被观察者的状态,当被观察者的状态发生变化时,会通知所有观察者,并让其自动更新自己。
  2.3.2 实例

2.4 工厂模式和抽象工厂模式
  2.4.1 普通工厂模式
  2.4.2 抽象工厂模式

2.5 建造者模式
  2.5.1 概述
  2.5.2 Builder模式实例
  
第三章 认识 Mybatis核心组件

3.1 持久层的概念和Mybatis的特点

3.2 准备Mybatis环境

3.3 Mybatis的核心组件
SqlSessionFactoryBuilder:它会根据配置或者代码来生成SqlSessionFactory,采用的是分布构建的builder模式。
SqlSessionFactory(工厂接口):依靠它来生成SqlSession,采用的是工厂模式。
SqlSession(会话):一个既可以发送Sql执行返回结果,也可以获取Mapper的接口。
SqlMapper(映射器):MyBatis新设计的组件,它由一个JAVA和XML文件构成,需要给出对应得SQL和映射规则。

3.4 SqlSessionFactory(工厂接口)
  3.4.1 使用XML构建 SqlSessionFactory
  3.4.2 使用代码构建 SqlSessionFactory

3.5 SqlSession

3.6 映射器
  3.6.1 用XML实现映射器
  3.6.2 注解实现映射器
  3.6.3 SqlSession发送SQL
  3.6.4 用Mapper接口发送SQL
  3.6.5 对比两种发送SQL方式

3.7 生命周期
  3.7.1 SqlSessionFactoryBuilder
  3.7.2 SqlSessionFactory
  3.7.3 SqlSession
  3.7.4 Mapper

3.8 实例

第四章 Mybatis配置

4.1 概述

4.2 properties属性
  4.2.1 property子元素
  4.2.2 使用properties文件
创建jdbc.propertities放到classpath的路径下,代码如下

  		database.driver = com.mysql.jdbc.Driver; 
  		database.url = jdbc:mysql//localhost:3306/ssm;
  		database.username =  root ;
  		database.password =  123456; 

在MyBatis中通过属性resource来引入properties文件。

     <properties resource = "jdbc.properties"/>

4.2.3 使用程序传递方式传递参数
  在真是的环境中,数据库的用户密码是对开发人员和其他人员保密的。运维人员为了保密,一般都需要把用户名和密码加密成密文后,配置到properties文件中,对于开发人员和其他人员,就不知道用户名和密码了,数据库也不可能使用已经加密的字符串去拼接,此时就需要解密。假设系统已经提供了CodeUtil.decode(str)进行解密,那么我们在创建SqlSessionFactory之前,就需要把用户名和密码解密,然后把解密后的字符串重置到properties属性中,代码如下:

  String resource = "MyBatis-config.xml"; //MyBatis的总配置文件 
  InputStream inputStream;
  InputStream in = Resources.getResourceAsStream("jdbc.propertities");
  Properties prop = new Propertities();
  prop.load(in);
  String username = prop.getProperty("database.username");
  String password= prop.getProperty("database.password");
  //解密用户和密码,并在属性中配置
  prop.put("database.username",CodeUtil.decode(username));
  prop.put("database.password",CodeUtil.decode(password));
  inputStream= Resources.getResourceAsStream(resource);
  //使用程序传递的方式覆盖原有的properties属性参数
  SqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream,prop);

首先使用Resources对象读取一个jdbc.properties配置文件,然后获取原来配置的用户名和密码,进行解密并重置,最后使用SqlSessionFactoryBuilder的build方法,传递properties参数来完成。

4.2.4 总结
从4.2.1到4.2.3,是MyBatis使用properties的3种方式。优先级最高的是使用程序传递的方式,其次是使用properties文件方式,最后是property子元素的方式。MyBatis会根据优先级覆盖原先配置的属性值。

4.3 setting设置
大部分情况下使用默认配置即可。
代码如下:

<settings>
	<setting name = "CacheEnabled" value = "true"/>//缓存,默认为true
<settings>

4.4 typeAliases别名

4.4.1 系统定义别名

4.4.2 自定义别名

4.5 typeHandler类型转换器

4.5.1 系统定义的 typeHandler
  在resultMap中定义转换类型就可以了。表示在获取查询结果生成bean对象的时候,使用org.apache.ibatis.type.DateTypeHandler进行处理。

  <mapper namespace="com.wang.MyBatis.model.UserMapper">
     <!-- 自定义返回结果集 -->
     <resultMap id="userMap" type="com.wang.MyBatis.model.UserBean">
          <id property="id" column="id" javaType="java.lang.Integer"></id>
          <result property="username" column="username" javaType="java.lang.String"></result>
          <result property="password" column="password" javaType="java.lang.String"></result>
          <result typeHandler="org.apache.ibatis.type.DateTypeHandler" column="regTime" javaType="java.util.Date"
                  jdbcType="VARCHAR"
                 property="regTime"/>
      </resultMap>

插入和更新的时候:

<insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
        insert into t_user_timeStamp (username,password,regTime) values (#{username},#{password},#{regTime,typeHandler=org.apache.ibatis.type.DateTypeHandler})
</insert>
    
<update id="updateUser" >
      update t_user_timeStamp set username=#{username},password=#{password},regTime=#{regTime,typeHandler=org.apache.ibatis.type.DateTypeHandler} where id=#{id}
</update>

4.5.2 自定义 typeHandler

4.5.3 枚举 typeHandler

4.5.4 文件操作

4.6 ObjectFactory(对象工厂)

4.7 插件

4.8 environments(运行环境)

4.8.1 transactionManager(事务管理)
  主要就是提交(commit),回滚(rollback)和关闭(close)
MyBatis主要为transaction提供两大实现类:JdbcTransaction和ManagedTransaction。两个实现类对应着两大工厂:JdbcTransactionFactory和ManagedTransactionFactory,通过它们会生成Transaction对象,所以事务管理器可以有如下两种配置:

<transactionManager type = "JDBC"/>
<transactionManager type = "MANAGED"/>

4.8.2 environment数据源环境
  environment主要作用是配置数据库。
  数据库主要是通过三个工厂类:PooledDataSourceFactory,UnPooledDataSourceFactory,JndiDataSourceFactory。对应得配置:

<dataSource type = "POOLED"/>
<dataSource type = "UNPOOLED"/>
<dataSource type = "JNDI"/>

4.9 databaseIdProvider 数据库厂商标识
databaseIdProvider 主要是支持不同厂商的数据库
4.9.1 使用系统默认

<databaseIdProvider type = "DB_VENDOR" >
	<property name = "Oracle" value = "oracle"/>
	<property name = "MySql" value = "mysql"/>
	<property name = "DB2" value = "db2"/>
</databaseIdProvider>

属性name是数据库的名字,value是别名,在MyBatis里可以通过这个别名标识一条SQL适用于哪种数据库。

<select id = "getRole" patameterType = "long" resultType = "role" databaseId = "mysql">
	select id,role_name from t_role where id = # {id}
</select>

4.9.2 不使用系统规则

4.10 引入映射器的方法
引入映射器方法很多,主要有:

//用文件路径引入映射器
<mapper>
	<mapper resource = "com/learn/ssm/mapper/roleMapper.xml">
</mapper>
//用包名引入映射器
<mapper>
	<package resource = "com.learn.ssm.mapper">
</mapper>
//用类注册引入映射器
<mapper>
	<mapper class = "com.learn.ssm.mapper.UerMapper">
</mapper>

第五章 映射器

5.1 概述

5.2 select 元素-查询语句

5.2.1 简单的select元素的应用

5.2.2 自动映射和驼峰映射

5.2.3 传递多个参数

5.2.4 使用 resultMap映射结果集

5.2.5 分页参数 RowBounds

5.3 insert元素-插入语句

5.3.1 概述

5.3.2 简单的insert语句的应用

5.3.3 主键回镇

5.3.4 自定义主键

5.4 updata元素和delete元素

5.5 sql元素

5.6 参数

5.6.1 概述

5.6.2 存储过程参数支持

5.6.3 特殊字符串的替换和处理(#和$)

5.7 resultMap元素

5.7.1 resultMap元素的构成

5.7.2 使用map存储结果集

5.7.3 使用POJO存储结果集

5.8 级联

5.8.1 MyBatis中的级联

5.8.2 建立POJO

5.8.3 配置映射文件

5.8.4 N+1问题

5.8.5 延迟加载

5.8.6 另一种级联

5.8.7 多对多级联

5.9 缓存

5.9.1 一级缓存和二级缓存

5.9.2 缓存配置项、自定义和引用

5.10 存储过程

5.10.1 IN和OUT参数存储过程

5.10.2 游标的使用

第六章 动态SQL

6.1 概述

6.2 if元素

6.3 choose、when、otherwise元素

6.4 trim、where、set元素

6.5 foreach元素

6.6 用test的属性判断字符串

6.7 bind元素

第七章 MyBatis的解析和运行原理

7.1 构建SqlSessionFactory过程

7.1.1 构建Configuration

  • 0
    点赞
  • 1
    评论
  • 1
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

philsonzhao

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值