SSM中常用知识点总结回顾

前言:学完SSM(Mybatis,Spring,SpringMVC)已经也一段时间,长时间不回顾有些知识点已经忘却了,写一篇文章简要回顾
分三个模块:
一.Mybatis框架
1.框架介绍:
mybatis本质就是一个持久层的框架,用于数据的持久化操作。为的是解决一般jdbc执行sql时候的代码冗余问题,和维护困难问题;
2.框架的使用流程分析:
mybatis上手是比较简单的,主要是就是,一个mapper接口绑定一个xml配置文件,然后接口中的每一个抽象方法,绑定一个具体的sql语句,也就是当执行接口中的某个方法时,自动的去调用sql语句,然后去操作数据库,对数据库中的数据进行传统的CRUD操作,然而,sql语句是怎么执行的呢?此时就引出一个mybatis中最关键的对象"SqlSession",为什么说他最关键,因为此对象封装着对数据库操作的所有方法,只需给这个对象传递一个sql语句就能使得该sql语句执行,所以,当你想使用sql必须将sqlsession这个对象的流程梳理清晰,那么我们如何拿到sqlsesion对象呢?接下来就引入了Mybatis的核心配置文件"myabtis-config.xml"(一般这么命名,不过自定义也都可以),这个配置文件可以说是内容丰富了,引入具体的头文件后,就是对其进行配置,就像传统的的jdbc会配置数据库连接池,数据库对象等,myabatis同样也可以进行配置,而mybatis-config.xml就是其配置为地方,相比于jdbc只会显得更加完善,更加有逻辑,因为配置的每一个信息都是有固定的顺序的,例如:properties(属性),setting(设置),typeAliases(别名),datasource(数据源),mapper(注册mapper接口)等,配置好后就会知道当前的数据库和一些其余操作的信息,接下来就是解决上文遗留的问题,sqlsession怎么拿到,是因为存在一个SqlsessionFactoryBuilder(可以叫做工厂制造器),它将以IO流的方式读取配置文件mybatis-config.xml文件,生产出一个仅仅生产只含有对于当前数据库操作方法的sqlsession的工厂SqlsessionFactory,因此以后所有的SqlSession都是从这个工厂当中去拿的,拿到之后就能使得整个流程连贯起来了,
总结:,调用接口中的抽象方法,拿到sqlsession对象,执行抽象方法绑定的sql语句,实现对数据库的操作;
在这里插入图片描述

3.使用过程中需要掌握的知识点(常用的):
(1).关于基本CRUD操作的sql语句的书写,主要是sql标签当中的属性需要搞清楚
id:就是mapper接口当中的抽象方法名字
parameterType:mapper接口当中参数的数据类型
resultType:sql语句执行后返回的具体数据的数据类型例如返回;List<Student>具体的数据类型就是Student

<select id="selectPerson" parameterType="int" resultType="hashmap">
  SELECT * FROM PERSON WHERE ID = #{id}
</select>
<insert id="insertAuthor" parameterType="domain.blog.Author"
  flushCache="true" statementType="PREPARED" keyProperty="" keyColumn="" 
  useGeneratedKeys="" timeout="20">
  insert语句
</insert>
<update id="updateAuthor" parameterType="domain.blog.Author"
  flushCache="true" statementType="PREPARED" timeout="20">
  update语句
</update>
<delete
  id="deleteAuthor" parameterType="domain.blog.Author"
  flushCache="true" statementType="PREPARED" timeout="20">
  delete语句
  </delete>

(2).如果传递的参数有多个可以使用万能的Map去传递:
首先是创建一个Map集合通过使用键值对<key,value>的格式存储数据,而此时parameterType的类型就是map,而sql语句获值的方式采用#{key}即可,
(3).ResultMap:用来处理数据库字段与实体类的属性不一直问题
方式一【简单但是不推荐】:

<select id="selectUserById" resultType="User">
  select id , name , pwd as password from user where id = #{id}
</select>

方式二【推荐使用】:

<resultMap id="UserMap" type="User">
   <!-- id为主键 -->
   <id column="id" property="id"/>
   <!-- column是数据库表的列名 , property是对应实体类的属性名 -->
   <result column="name" property="name"/>
   <result column="pwd" property="password"/>
</resultMap>

<select id="selectUserById" resultMap="UserMap">
  select id , name , pwd from user where id = #{id}
</select>

(4).日志的使用
配置在myabtis-config.xml的核心配置文件当中,具体采用哪个日志去myabtis的官网去拿就行

<settings>
       <setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>

(5).实现分页
在学习mybatis等持久层框架的时候,会经常对数据进行增删改查操作,使用最多的是对数据库进行查询操作,如果查询大量数据的时候,我们往往使用分页进行查询,也就是每次处理小部分数据,这样对数据库压力就在可控范围内。
方式一:limit分页
1、修改Mapper文件

<select id="selectUser" parameterType="map" resultType="user">
  select * from user limit #{startIndex},#{pageSize}
</select>

2、Mapper接口,参数为map

//选择全部用户实现分页
List<User> selectUser(Map<String,Integer> map);

3、在测试类中传入参数测试

推断:起始位置 =  (当前页面 - 1* 页面大小
//分页查询 , 两个参数startIndex , pageSize
@Test
public void testSelectUser() {
   SqlSession session = MybatisUtils.getSession();
   UserMapper mapper = session.getMapper(UserMapper.class);

   int currentPage = 1;  //第几页
   int pageSize = 2;  //每页显示几个
   Map<String,Integer> map = new HashMap<String,Integer>();
   map.put("startIndex",(currentPage-1)*pageSize);
   map.put("pageSize",pageSize);

   List<User> users = mapper.selectUser(map);

   for (User user: users){
       System.out.println(user);
  }
   session.close();
}

方式二:Rowbounds分页
我们除了使用Limit在SQL层面实现分页,也可以使用RowBounds在Java代码层面实现分页,当然此种方式作为了解即可。我们来看下如何实现的!
1、mapper接口

//选择全部用户RowBounds实现分页
List<User> getUserByRowBounds();

2、mapper文件

<select id="getUserByRowBounds" resultType="user">
select * from user
</select>

3、测试类
在这里,我们需要使用RowBounds类

@Test
public void testUserByRowBounds() {
   SqlSession session = MybatisUtils.getSession();

   int currentPage = 2;  //第几页
   int pageSize = 2;  //每页显示几个
   RowBounds rowBounds = new RowBounds((currentPage-1)*pageSize,pageSize);

   //通过session.**方法进行传递rowBounds,[此种方式现在已经不推荐使用了]
   List<User> users = session.selectList("com.kuang.mapper.UserMapper.getUserByRowBounds", null, rowBounds);

   for (User user: users){
       System.out.println(user);
  }
   session.close();
}

方式三:PageHelper插件分页
在这里插入图片描述
(6).一对多,多对一
(7).动态sql
(8).缓存cache
mybatis当前我认为重点的知识点也就是上面这一些了,后续持续补充
二.Spring框架
Spring使用的具体提流程:Spring的核心配置文件一般命名为applicationContext.xml,导入头文件后和命名空间将所有的实体类对象注册到当中即可,
Spring主要就是引入了IOC和AOP两大思想,所以我们又称Spring为非入侵式的控制反转IOC和面向切面变成AOP的轻量级框架
IOC:控制反转的思想,主要是实现控制权的反转,是由原本的程序员主动去new对象,替代控制权交给用户,只是提供一个接口,被动的接受对象
AOP:面向切面编程思想,主要是方便后期的维护,在不改动原有的代码的条件下,给原有代码增加功能等一系列操作。

常用知识点总结:
1.注册bean:
【方式一】:通过配置文件的方式去注册bean对象,并为其属性赋值

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd">

   <!--bean就是java对象 , 由Spring创建和管理-->
   <bean id="hello" class="com.kuang.pojo.Hello">
       <property name="name" value="Spring"/>
   </bean>

</beans>

【方式二】:通过注解的方式去注册bean对象,等价于配置文件,但是注入属性的时候可操作性低于配置文件
@Component:一般情况下,下面三个是其衍生注解,功能相同用于区分
@Repository:一般用于Dao层
@Controller:一般用于Controller层
@Service:一般用于Service层

【方式三】:javaConfig的方式去注册bean对象
JavaConfig 原来是 Spring 的一个子项目,它通过 Java 类的方式提供 Bean 的定义信息,在 Spring4 的版本, JavaConfig 已正式成为 Spring4 的核心功能 。
@configuration和@Bean2个注解的联合使用

@Configuration  //代表这是一个配置类
public class MyConfig {
 
    @Bean //通过方法注册一个bean,这里的返回值就Bean的类型,方法名就是bean的id!
    public Dog dog(){
        return new Dog();
    }
 
}

2.属性注入问题
(1)如果是通过无参构造,set注入(要求被注入的属性 , 必须有set方法 , set方法的方法名由set + 属性首字母大写 , 如果属性是boolean类型 , 没有set方法 , 是 is .):默认注册bean是通过set方法为其属性赋值的

<bean id="user" class="com.sqx.pojo.User" >
    <property name="name" value="宋淇祥"/>
</bean>

(2)反之是通过有参构造,(index,type,name)注入:

-index

<bean id="user" class="com.sqx.pojo.User">
    <constructor-arg index="0" value="宋淇祥"/>
</bean>
  • Type:参数多的时候不推荐使用
<bean id="user" class="com.sqx.pojo.User">
<constructor-arg type="java.lang.String" value="宋淇祥"/>
</bean>
  • name:比较容易理解
<bean id="user" class="com.sqx.pojo.User">
    <constructor-arg name="name" value="宋淇祥"/>
</bean>

3.byName和byType的原理:

  • byName:如果是byName自动装配,首先是查看需要装配属性的set方法名并且将其首字母小写,例如:(setName–>name),查看Spring的容器当中是否存在即id为name的bean对象,如果存在则完成自动装配
  • byType:如果是byType的方式的话,知识查看Spring的容器当中是否存在与需要自动装配属性的类型一致的bean对象,如果存在那么自动装配成功;

4.自动装配问题:

前提是只有引用数据类型对象才可进行自动装配,而且如果要使用自动装配则需要:

开启扫描包:使得spring可以发现当前包下如果某个类的头上带有特定的注解@Component,@Repository,@Service,@Controller,就会将这个对象作为Bean注册进Spring容器。
 <context:component-scan base-package="com.sqx.service" />
开启属性注解支持
<context:annotation-config/>
  • 通过属性实现自动装配:
    autowire属性:byName | byType
 <bean id="user" class="com.kuang.pojo.User" autowire="byName">
    <property name="str" value="qinjiang"/>
</bean>
  • 通过注解实现自动装配:
    @Autowired:属于Spring的注解:默认是通过byType,可以与Qualifire搭配来实现通过byName完成自动装配
    @Qualifier:一般情况下不会单独使用,然而在后期Springboot中可以单独使用
    @Resource:属于java的原生注解:默认是通过byName,但是如果不存在对象的name那么,自动转化为byType的自动装配方式

三.SpringMVC框架

posted @ 2022-01-23 20:36  爪洼ing  阅读(88)  评论(0编辑  收藏  举报