MyBatis框架+Spring框架

MyBatis框架

目录

  • MyBatis框架
    • 为什么要使用框架
    • 主流框架介绍MyBatis
    • 持久化与ORM
    • MyBatis 介绍
    • 搭建MyBatis 开发环境
    • my baits核心文件
    • encironments 配置文件
    • 设置别名
      • 操作Mybaits
    • properties元素
    • settings 元素
    • mappers 元素
      • 配置文件
        • Mapper 文件配置
      • SqlSessionFactory
    • 实现类编写
    • 以实体类封装查询结果
    • 核心接口和类的关系
    • SqlSession
    • 小结
  • SQL 映射文件
    • 回顾
    • SQL 映射的 XML 文件
    • mapper
    • select 单一条件查询
      • 示例
    • select 多条件查询
    • 根据 entity 来查
    • 更具map来查
    • 多参数情况下
    • resultMap
    • 示例
      • 一对一映射association
        • 示例
      • 一对多映射关系 collection
        • 示例
    • 添加数据
    • 修改数据
    • 删除数据
  • 动态 SQL
    • 什么是动态 SQL
    • if 标签
      • 示例
    • where 标签
    • choose(when、otherwise)标签
    • foreach标签
      • List
      • map 集合
    • set标签
    • trim标签
  • 初识 Spring
    • Spring 框架
      • Spring 设计核心
    • 控制反转/依赖注入
      • 第一个Spring程序
      • 示例
        • 配置模板
    • 面向切面编程(AOP)
      • 名词
      • Spring AOP在项目中的运用
        • 示例
    • 总结
  • Spring 深入学习
    • 异常抛出增强
    • 最终增强
    • 环绕增强
    • 构造注入
    • p命名空间注入
    • 不同数据类型注入
    • 使用注解实现Spring IoC
    • 使用Java标准注解完成装配
    • 使用注解实现Spring AOP
      • 示例
  • Spring 整合 MyBatis
    • 基本整合方式
      • 示例
    • 映射器整合方式
      • 示例
    • 配置声明式事务
    • 使用注解实现声明式事务
    • 掌握更多配置数据源的方法
      • 使用properties 文件配置数据源
      • 使用 JNDI 配置数据源
    • 拆分Spring 配置文件
      • 引入拆分后的配置文件
      • 示例
    • Spring 中Bean 的自动装配
      • 示例
        • 更改自动装配的方式
        • 设置全局自动装配的方式
    • Spring 中的Bean 的作用域
  • Spring MVC
    • 理解MVC设计模式
      • jsp model 1
      • jsp model 2
      • MVC 处理过程
    • MVC 的优点
    • 使用注解开发Spring MVC
    • 配置视图解析器
    • Spring MVC请求处理流程
    • @RequestMapping 注解
      • 入参处理
        • 示例
      • 出参
      • 使用注解
    • 使用 spring MVC
      • 示例 MVC 的基本使用
        • 方法一
        • 方式二 注解的方式
  • 单例模式及统一异常处理
    • 单列模式
      • 示例
      • 懒汉模式
      • 饿汉模式
        • 饿汉模式实现延迟加载(使用内部内)
    • Spring MVC中的单例模式
    • Spring MVC 的整合
      • 实例
    • 异常处理
      • 局部异常处理
      • 全局异常处理
  • 数据校验及文件上传
    • 改造添加功能
      • 体验
    • REST 风格
      • 改造查询功能
        • 演示
    • Spring 表单标签
      • 体验
    • 数据校验
      • 实例
    • Spring MVC的文件上传
      • 体验
  • Spring MVC扩展和SSM框架整合
    • JSON数据的传递处理
      • 演示
    • JSON数据传递过程中的中文乱码和日期问题
      • 解决中文乱码
        • 第一种写法
        • 第二种方法
      • 解决日期乱码问题
        • 第一种
        • 第二种方法(这里版本问题就不演示了)
    • 多视图解释器
    • Spring MVC框架中的数据格式转换
      • 编写自定义转换器
    • SSM整合
  • 分页框架
    • 分页插件 pageHelper
    • 拦截器

为什么要使用框架

MyBatis框架+Spring框架_第1张图片

MyBatis框架+Spring框架_第2张图片

主流框架介绍MyBatis

MyBatis框架+Spring框架_第3张图片

MyBatis框架+Spring框架_第4张图片

MyBatis框架+Spring框架_第5张图片

持久化与ORM

MyBatis框架+Spring框架_第6张图片

MyBatis框架+Spring框架_第7张图片

MyBatis框架+Spring框架_第8张图片

MyBatis 介绍

MyBatis框架+Spring框架_第9张图片

搭建MyBatis 开发环境

使用Maven
编辑路径

直接写路径访问官网下载

MyBatis框架+Spring框架_第10张图片

my baits核心文件

MyBatis框架+Spring框架_第11张图片

encironments 配置文件

MyBatis框架+Spring框架_第12张图片

MyBatis框架+Spring框架_第13张图片

MyBatis框架+Spring框架_第14张图片

MyBatis框架+Spring框架_第15张图片

设置别名

如果类太多,就用第二个
这里强烈建议用第二个

MyBatis框架+Spring框架_第16张图片

操作Mybaits

输入这串代码,下载mybatis

 <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.7</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.32</version>
        </dependency>

MyBatis框架+Spring框架_第17张图片

properties元素

MyBatis框架+Spring框架_第18张图片

settings 元素

MyBatis框架+Spring框架_第19张图片

mappers 元素

MyBatis框架+Spring框架_第20张图片

MyBatis框架+Spring框架_第21张图片

配置文件

新建配置文件里面存放 连接字符串 数据库用户名 数据库密码 注册驱动

新建文件名 dataSource.properties

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/test220707
user=root
password=root123

MyBatis框架+Spring框架_第22张图片

配置文件,头文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd" >

新建文件名 mybatis-config.xml 记得改后缀

注意编写配置文件一定要一步步来

MyBatis框架+Spring框架_第23张图片

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd" >
<configuration>
<!--    读取外部properties 文件-->
    <properties resource="dataSource.properties"/>

<!--    设置别名-->
    <typeAliases>
<!--        第一种一个一个设置别名-->
<!--        <typeAlias type="com.A1207.A1207MyBalischat01.userInfo" alias="userInfo"/>-->
<!--        第二种设置某个包的所有类作为别名-->
        <package name="com.A1207.A1207MyBalischat01.entity"/>
    </typeAliases>

<!--    配置运行环境-->
    <environments default="userDB">
        <environment id="userDB">
<!--            设置事务管理 这里就用JDBC-->
            <transactionManager type="JDBC"></transactionManager>
<!--            设置数据源-->
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${user}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
<!--    读取sql映射文件-->


</configuration>

设置 sql 映射文件前要把之前的build 里面的代码替换掉

<build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties
                    **/*.xml</include>
                </includes>
            </resource>
        </resources>
    </build>

MyBatis框架+Spring框架_第24张图片
配置 sql 映射文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd" >
<configuration>
    <!--    读取外部properties 文件-->
    <properties resource="dataSource.properties"/>

    <!--    设置别名-->
    <typeAliases>
        <!--        第一种一个一个设置别名-->
        <!--        <typeAlias type="com.A1207.A1207MyBalischat01.userInfo" alias="userInfo"/>-->
        <!--        第二种设置某个包的所有类作为别名-->
        <package name="com.A1207.A1207MyBalischat01.entity"/>
    </typeAliases>

    <!--    配置运行环境-->
    <environments default="userDB">
        <environment id="userDB">
            <!--            设置事务管理 这里就用JDBC-->
            <transactionManager type="JDBC"/>
            <!--            设置数据源-->
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${user}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
    <!--    读取sql映射文件-->
    <mappers>
        <!--挨个读取sql映射文件-->
<!--        <mapper resource="com/A1207/A1207MyBalischat01/dao/userInfoMapper.xml"/>-->
        <!--    读取某个包下面的所有的sqL映射文件:接口和sqL映射文件必须在同一个包下面,并且名称要相同-->
        <package name="com.A1207.A1207MyBalischat01.dao"/>
    </mappers>

</configuration>



编写dao 文件

接口名: UserInfoMapper

package com.A1207.A1207MyBalischat01.dao;

import com.A1207.A1207MyBalischat01.entity.UserInfo;

import java.util.List;

public interface UserInfoMapper {
    public List<UserInfo> queryAll();
}


MyBatis框架+Spring框架_第25张图片

Mapper 文件配置

这个配置文件和上面的不一样

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >

具体配置

id 写方法名,resultType写bean名

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.A1207.A1207MyBalischat01.dao.UserInfoMapper">
    <select id="queryAll" resultType="UserInfo">
        select * from userInfo;
    </select>
</mapper>

SqlSessionFactory

MyBatis框架+Spring框架_第26张图片

MyBatis框架+Spring框架_第27张图片

实现类编写

在java里新建 Test 类

import com.A1207.A1207MyBalischat01.dao.UserInfoMapper;
import com.A1207.A1207MyBalischat01.entity.UserInfo;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class Test {
    public static void main(String[] args) throws IOException {
        InputStream ins = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(ins);
        SqlSession ss = ssf.openSession();

        List<UserInfo> lu = ss.getMapper(UserInfoMapper.class).queryAll();
        System.out.println(lu);
    }
}

以实体类封装查询结果

MyBatis框架+Spring框架_第28张图片

核心接口和类的关系

MyBatis框架+Spring框架_第29张图片

MyBatis框架+Spring框架_第30张图片

MyBatis框架+Spring框架_第31张图片

SqlSession

MyBatis框架+Spring框架_第32张图片

小结

MyBatis框架+Spring框架_第33张图片

SQL 映射文件

回顾

MyBatis框架+Spring框架_第34张图片

MyBatis框架+Spring框架_第35张图片

SQL 映射的 XML 文件

MyBatis框架+Spring框架_第36张图片

mapper

MyBatis框架+Spring框架_第37张图片

MyBatis框架+Spring框架_第38张图片

select 单一条件查询

resultType 返回对应的类型

MyBatis框架+Spring框架_第39张图片

示例

MyBatis框架+Spring框架_第40张图片

#{} 和 ${} 区别 #{}: 会根据传过来的参数类型做预编译 , ${} :字节值替换表达式

这里最好用 #{}

MyBatis框架+Spring框架_第41张图片

MyBatis框架+Spring框架_第42张图片

MyBatis框架+Spring框架_第43张图片

但是注意 如果我们传的是多个参数 这里的指定Interger 就不行

在这里插入图片描述

在这里插入图片描述

select 多条件查询

这就是 select 多条件查询

MyBatis框架+Spring框架_第44张图片

根据 entity 来查

MyBatis框架+Spring框架_第45张图片

MyBatis框架+Spring框架_第46张图片

更具map来查

MyBatis框架+Spring框架_第47张图片

MyBatis框架+Spring框架_第48张图片

多参数情况下

MyBatis框架+Spring框架_第49张图片

MyBatis框架+Spring框架_第50张图片

resultMap

我们把 id 改成 uid

这里和我们的表不对应了,所以我们得自己写映射关系

MyBatis框架+Spring框架_第51张图片

MyBatis框架+Spring框架_第52张图片

MyBatis框架+Spring框架_第53张图片

MyBatis框架+Spring框架_第54张图片

示例

MyBatis框架+Spring框架_第55张图片
MyBatis框架+Spring框架_第56张图片

MyBatis框架+Spring框架_第57张图片

一对一映射association

MyBatis框架+Spring框架_第58张图片

示例

MyBatis框架+Spring框架_第59张图片

首先新建一个 entity 类

注意这里一定要创建 UserInfo 这个属性

MyBatis框架+Spring框架_第60张图片

然后在添加映射文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.A1207.A1207MyBalischat01.dao.UserInfoMapper">
<!--    查询所有-->
    <select id="queryAll" resultType="UserInfo">
        select * from userInfo;
    </select>

<!--    更具id来查数据 parameterType定位到找到对应的类型-->
    <select id="queryById" resultType="UserInfo" parameterType="java.lang.Integer">
        select * from userInfo where id = #{id};
    </select>

<!--     更具 UserInfo 来查-->
    <select id="queryByLogin" resultType="UserInfo" parameterType="UserInfo">
        select * from userInfo where name=#{name} and sex=#{sex};
    </select>

<!--     传一个map集合-->
    <select id="queryByMap" resultType="UserInfo" parameterType="java.util.Map">
        select  * from userInfo where id = #{id}
    </select>

<!--    多个参数情况下-->
    <select id="queryByDg" resultType="UserInfo">
        select * from userInfo where id=#{id} and name=#{name};
    </select>

<!--    自义定映射文件-->
    <resultMap id="useri" type="UserInfo">
        <id property="uid" column="id"/>
        <result property="name" column="name"/>
        <result property="sex" column="sex"/>

<!--        一堆多映射关系-->
<!--    <collection property="ls" ofType="Scores" resultMap="sc"/>-->
    </resultMap>


    <select id="queryByScores" resultMap="sc">
        select s.*,ui.* from scores as s inner join userInfo as ui on s.uid=ui.id;
    </select>
    <resultMap id="sc" type="Scores">
        <id property="sid" column="sid"/>
        <result property="uid" column="uid"/>
        <result property="score" column="score"/>

<!--        一对一映射关系-->
        <association property="ui" javaType="UserInfo" resultMap="useri"/>
    </resultMap>

<!--    <select id="queryByUserScore" resultMap="useri">-->
<!--        select s.*,ui.* from userInfo ui inner join scores s on s.uid=ui.id;-->
<!--    </select>-->
</mapper>

MyBatis框架+Spring框架_第61张图片

MyBatis框架+Spring框架_第62张图片

编写测试类

MyBatis框架+Spring框架_第63张图片

数据结果
可以看到一个 成绩对应一个人 这个就是 一对一

比如 scores 这个表中
sid=1 uid=1 score=50 ui就对应的小明这个数据

[Scores{sid=1, uid=1, score=50, ui=UserInfo{uid=1, name='小明', sex='男'}}, Scores{sid=2, uid=1, score=23, ui=UserInfo{uid=1, name='小明', sex='男'}}, Scores{sid=3, uid=1, score=23, ui=UserInfo{uid=1, name='小明', sex='男'}}, Scores{sid=4, uid=2, score=50, ui=UserInfo{uid=2, name='小红', sex='女'}}, Scores{sid=5, uid=2, score=80, ui=UserInfo{uid=2, name='小红', sex='女'}}, Scores{sid=6, uid=2, score=90, ui=UserInfo{uid=2, name='小红', sex='女'}}]

一对多映射关系 collection

在这里插入图片描述

示例

一对多 首先要把一对一的数据注释掉

添加SQL语句

    <select id="queryByUserScore" resultMap="useri">
        select s.*,ui.* from scores as s inner join userInfo as ui on s.uid=ui.id;
    </select>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.A1207.A1207MyBalischat01.dao.UserInfoMapper">
<!--    查询所有-->
    <select id="queryAll" resultType="UserInfo">
        select * from userInfo;
    </select>

<!--    更具id来查数据 parameterType定位到找到对应的类型-->
    <select id="queryById" resultType="UserInfo" parameterType="java.lang.Integer">
        select * from userInfo where id = #{id};
    </select>

<!--     更具 UserInfo 来查-->
    <select id="queryByLogin" resultType="UserInfo" parameterType="UserInfo">
        select * from userInfo where name=#{name} and sex=#{sex};
    </select>

<!--     传一个map集合-->
    <select id="queryByMap" resultType="UserInfo" parameterType="java.util.Map">
        select  * from userInfo where id = #{id}
    </select>

<!--    多个参数情况下-->
    <select id="queryByDg" resultType="UserInfo">
        select * from userInfo where id=#{id} and name=#{name};
    </select>

<!--    自义定映射文件-->
    <resultMap id="useri" type="UserInfo">
        <id property="uid" column="id"/>
        <result property="name" column="name"/>
        <result property="sex" column="sex"/>

<!--        一堆多映射关系-->
    <collection property="score" ofType="Scores" resultMap="sc"/>
    </resultMap>


    <select id="queryByScores" resultMap="sc">
        select s.*,ui.* from scores as s inner join userInfo as ui on s.uid=ui.id;
    </select>
    <resultMap id="sc" type="Scores">
        <id property="sid" column="sid"/>
        <result property="uid" column="uid"/>
        <result property="score" column="score"/>

<!--        一对一映射关系-->
<!--        <association property="ui" javaType="UserInfo" resultMap="useri"/>-->
    </resultMap>

    <select id="queryByUserScore" resultMap="useri">
        select s.*,ui.* from scores as s inner join userInfo as ui on s.uid=ui.id;
    </select>
</mapper>


userInfo 类添加 Score 对象

MyBatis框架+Spring框架_第64张图片

MyBatis框架+Spring框架_第65张图片

编写测试类

在这里插入图片描述

结果

可以看到这里的一个用户对应的多个成绩,我的表有 2个用户,每个用户对应三个成绩

[UserInfo{uid=1, name='小明', sex='男', score=null}, UserInfo{uid=1, name='小明', sex='男', score=null}, UserInfo{uid=1, name='小明', sex='男', score=null}, UserInfo{uid=2, name='小红', sex='女', score=null}, UserInfo{uid=2, name='小红', sex='女', score=null}, UserInfo{uid=2, name='小红', sex='女', score=null}]

添加数据

MyBatis框架+Spring框架_第66张图片

MyBatis框架+Spring框架_第67张图片

修改数据

MyBatis框架+Spring框架_第68张图片

MyBatis框架+Spring框架_第69张图片

删除数据

MyBatis框架+Spring框架_第70张图片

MyBatis框架+Spring框架_第71张图片

动态 SQL

导图

MyBatis框架+Spring框架_第72张图片

什么是动态 SQL

MyBatis框架+Spring框架_第73张图片

if 标签

MyBatis框架+Spring框架_第74张图片

这里我们就可以用if 标签解决

MyBatis框架+Spring框架_第75张图片

示例

编写配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd" >

<configuration>
<!--    导入配置文件-->
    <properties resource="dataSource.properties"/>
<!--    设置别名-->
    <typeAliases>
        <package name="com.A1207.A1207mybaitch03.entity"/>
    </typeAliases>
<!--    配置运行环境 数据源等-->
   <environments default="ScoresDB">
       <environment id="ScoresDB">
<!--           设置事务管理器-->
           <transactionManager type="JDBC"/>
<!--           设置数据源-->
           <dataSource type="POOLED">
               <property name="driver" value="${driver}"/>
               <property name="url" value="${url}"/>
               <property name="username" value="${user}"/>
               <property name="password" value="${password}"/>
           </dataSource>
       </environment>
   </environments>
    
<!--    设置Sql映射文件-->

    <mappers>
<!--        先新建 dao-->
        <package name="com.A1207.A1207mybaitch03.dao"/>
    </mappers>
</configuration>

配置文件

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/test220707
user=root
password=root123

MyBatis框架+Spring框架_第76张图片

新建实体类

package com.A1207.A1207mybaitch03.entity;

public class Scores {
    private int sid;
    private int uid;
    private String score;

    @Override
    public String toString() {
        return "Scores{" +
                "sid=" + sid +
                ", uid=" + uid +
                ", score=" + score +
                '}';
    }

    public int getSid() {
        return sid;
    }

    public void setSid(int sid) {
        this.sid = sid;
    }

    public int getUid() {
        return uid;
    }

    public void setUid(int uid) {
        this.uid = uid;
    }

    public String getScore() {
        return score;
    }

    public void setScore(String score) {
        this.score = score;
    }
}

新建接口

package com.A1207.A1207mybaitch03.dao;

import com.A1207.A1207mybaitch03.entity.Scores;
import org.apache.ibatis.annotations.Param;

import java.util.List;

public interface ScoresMapper {
    public List<Scores> queryById(@Param("sid") int id);
}

新建 Sql 映射文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.A1207.A1207mybaitch03.dao.ScoresMapper">
    <select id="queryById" resultType="Scores">
        SELECT * FROM scores
        <if test="sid>0">
            where sid=#{sid}
        </if>
    </select>
</mapper>

测试类编写

import com.A1207.A1207mybaitch03.dao.ScoresMapper;
import com.A1207.A1207mybaitch03.entity.Scores;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class Test {
    public static void main(String[] args) throws IOException {
        InputStream ins = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(ins);
        SqlSession ss = ssf.openSession();

        ScoresMapper sm = ss.getMapper(ScoresMapper.class);
        List<Scores> scores = sm.queryById(0);

        ss.close();

        System.out.println(scores);

    }
}

这是 id 给 0 的结果

[Scores{sid=2, uid=1, score=23}, Scores{sid=3, uid=1, score=23}, Scores{sid=4, uid=2, score=50}, Scores{sid=5, uid=2, score=80}, Scores{sid=6, uid=2, score=90}]

这是 id 给 2 的结果

[Scores{sid=2, uid=1, score=23}]

where 标签

MyBatis框架+Spring框架_第77张图片

MyBatis框架+Spring框架_第78张图片

接口编写

package com.A1207.A1207mybaitch03.dao;

import com.A1207.A1207mybaitch03.entity.Scores;
import org.apache.ibatis.annotations.Param;

import java.util.List;

public interface ScoresMapper {
    public List<Scores> queryById(@Param("sid") int sid,@Param("score") int score);
}

测试类

import com.A1207.A1207mybaitch03.dao.ScoresMapper;
import com.A1207.A1207mybaitch03.entity.Scores;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class Test {
    public static void main(String[] args) throws IOException {
        InputStream ins = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(ins);
        SqlSession ss = ssf.openSession();

        ScoresMapper sm = ss.getMapper(ScoresMapper.class);
        List<Scores> scores = sm.queryById(2,23);

        ss.close();

        System.out.println(scores);

    }
}

结果

[Scores{sid=2, uid=1, score=23}]

注意:在动态Sql中使用参数作为变量一定要加上 @Param() 哪怕只有一个参数,他也会报错

这个问题我找了半天,不仔细看很容易忽略

choose(when、otherwise)标签

如果其中的一个 when 为 true 就会执行里面的语句 ,如果不符合就会寻找符合的条件,如果都不符合就会执行 otherwise 里面的语句

MyBatis框架+Spring框架_第79张图片

package com.A1207.A1207mybaitch03.dao;

import com.A1207.A1207mybaitch03.entity.Scores;
import org.apache.ibatis.annotations.Param;

import java.util.List;

public interface ScoresMapper {
    public List<Scores> queryById(@Param("sid") int sid,@Param("score") int score);

    public  List<Scores> queryByScore(@Param("score") int score);
}

这里注意的是 动态 Sql 不可以使用 < 必须使用转义符号 才可以

> &gt;

< &lt;
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.A1207.A1207mybaitch03.dao.ScoresMapper">
    <select id="queryById" resultType="Scores">
        SELECT * FROM scores
        <where>

            <if test="sid>0">
                sid=#{sid}
            </if>

            <if test="score>90">
                and score=#{score}
            </if>
        </where>
    </select>

    <select id="queryByScore" resultType="Scores">
        SELECT * FROM scores
        <where>
            <choose>
                <when test="score>90">
                    score = 99
                </when>
                <when test="score>80 and score < 90">
                    score = 88
                </when>
                <when test="score>70 and score < 80">
                    score = 77
                </when>
                <otherwise>
                    score &lt; #{score}
                </otherwise>
            </choose>
        </where>
    </select>
</mapper>

foreach标签

MyBatis框架+Spring框架_第80张图片

MyBatis框架+Spring框架_第81张图片

如果我么要查 张三就好查
在这里插入图片描述

但是我们要查 张三 李四 王五 就不好查了

在这里插入图片描述
我们可以设置一个集合 然后在进行遍历

在这里插入图片描述

List

package com.A1207.A1207mybaitch03.dao;

import com.A1207.A1207mybaitch03.entity.Scores;
import org.apache.ibatis.annotations.Param;

import java.util.List;

public interface ScoresMapper {
    public List<Scores> queryById(@Param("sid") int sid,@Param("score") int score);

    public  List<Scores> queryByScore(@Param("score") int score);

    public  List<Scores> queryByIn(@Param("li") List<Integer> li);
}

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.A1207.A1207mybaitch03.dao.ScoresMapper">
    <select id="queryById" resultType="Scores">
        SELECT * FROM scores
        <where>

            <if test="sid>0">
                sid=#{sid}
            </if>

            <if test="score>90">
                and score=#{score}
            </if>
        </where>
    </select>

    <select id="queryByScore" resultType="Scores">
        SELECT * FROM scores
        <where>
            <choose>
                <when test="score>=90">
                    score = 99
                </when>
                <when test="score>=80 and score < 90">
                    score = 88
                </when>
                <when test="score>=70 and score < 80">
                    score = 77
                </when>
                <otherwise>
                    score &lt; #{score}
                </otherwise>
            </choose>
        </where>
    </select>

    <select id="queryByIn" resultType="Scores" parameterType="java.util.List">
        select * from scores
        <where>
            uid in
            <foreach collection="li" item="uid" open="(" separator="," close=")">
                #{uid}
            </foreach>
        </where>
    </select>
</mapper>
import com.A1207.A1207mybaitch03.dao.ScoresMapper;
import com.A1207.A1207mybaitch03.entity.Scores;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

public class Test {
    public static void main(String[] args) throws IOException {
        InputStream ins = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(ins);
        SqlSession ss = ssf.openSession();

        ScoresMapper sm = ss.getMapper(ScoresMapper.class);
        // 名字集合
        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(3);

        List<Scores> scores = sm.queryByIn(list);

        ss.close();

        System.out.println(scores);

    }
}

结果

[Scores{sid=2, uid=1, score=23}, Scores{sid=3, uid=1, score=23}, Scores{sid=7, uid=1, score=99}, Scores{sid=9, uid=1, score=88}]

map 集合

如果是 map 呢

package com.A1207.A1207mybaitch03.dao;

import com.A1207.A1207mybaitch03.entity.Scores;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

public interface ScoresMapper {
    public List<Scores> queryById(@Param("sid") int sid,@Param("score") int score);

    public  List<Scores> queryByScore(@Param("score") int score);

    public  List<Scores> queryByIn(@Param("li") List<Integer> li);

    public List<Scores> queryByInMap(Map<String,Object> mso);
}

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.A1207.A1207mybaitch03.dao.ScoresMapper">
    <select id="queryById" resultType="Scores">
        SELECT * FROM scores
        <where>

            <if test="sid>0">
                sid=#{sid}
            </if>

            <if test="score>90">
                and score=#{score}
            </if>
        </where>
    </select>

    <select id="queryByScore" resultType="Scores">
        SELECT * FROM scores
        <where>
            <choose>
                <when test="score>=90">
                    score = 99
                </when>
                <when test="score>=80 and score < 90">
                    score = 88
                </when>
                <when test="score>=70 and score < 80">
                    score = 77
                </when>
                <otherwise>
                    score &lt; #{score}
                </otherwise>
            </choose>
        </where>
    </select>

    <select id="queryByIn" resultType="Scores" parameterType="java.util.List">
        select * from scores
        <where>
            uid in
            <foreach collection="li" item="uid" open="(" separator="," close=")">
                #{uid}
            </foreach>
        </where>
    </select>
    
    <select id="queryByInMap" parameterType="java.util.Map" resultType="Scores">
        select * from scores
        <where>
            uid in
--             uids key 的名称
            <foreach collection="uids" item="uid" open="(" separator="," close=")">
                #{uid}
            </foreach>
        </where>
    </select>
</mapper>

MyBatis框架+Spring框架_第82张图片

import com.A1207.A1207mybaitch03.dao.ScoresMapper;
import com.A1207.A1207mybaitch03.entity.Scores;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Test {
    public static void main(String[] args) throws IOException {
        InputStream ins = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(ins);
        SqlSession ss = ssf.openSession();

        ScoresMapper sm = ss.getMapper(ScoresMapper.class);
        // 名字集合
        Map<String,Object> mso = new HashMap<>();
        int[] uids = {1,2};
        mso.put("uids",uids);

        List<Scores> scores = sm.queryByInMap(mso);

        ss.close();

        System.out.println(scores);

    }
}

结果

[Scores{sid=2, uid=1, score=23}, Scores{sid=3, uid=1, score=23}, Scores{sid=4, uid=2, score=50}, Scores{sid=5, uid=2, score=80}, Scores{sid=6, uid=2, score=90}, Scores{sid=7, uid=1, score=99}, Scores{sid=8, uid=2, score=77}, Scores{sid=9, uid=1, score=88}]

set标签

MyBatis框架+Spring框架_第83张图片

set 标签解决下面 的问题

在这里插入图片描述

package com.A1207.A1207mybaitch03.dao;

import com.A1207.A1207mybaitch03.entity.Scores;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

public interface ScoresMapper {
    public List<Scores> queryById(@Param("sid") int sid,@Param("score") int score);

    public  List<Scores> queryByScore(@Param("score") int score);

    public  List<Scores> queryByIn(@Param("li") List<Integer> li);

    public List<Scores> queryByInMap(Map<String,Object> mso);

    public int updateUserInfo(@Param("name") String name,@Param("sex") String sex,@Param("id") int id);
}

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.A1207.A1207mybaitch03.dao.ScoresMapper">
    <select id="queryById" resultType="Scores">
        SELECT * FROM scores
        <where>

            <if test="sid>0">
                sid=#{sid}
            </if>

            <if test="score>90">
                and score=#{score}
            </if>
        </where>
    </select>

    <select id="queryByScore" resultType="Scores">
        SELECT * FROM scores
        <where>
            <choose>
                <when test="score>=90">
                    score = 99
                </when>
                <when test="score>=80 and score < 90">
                    score = 88
                </when>
                <when test="score>=70 and score < 80">
                    score = 77
                </when>
                <otherwise>
                    score &lt; #{score}
                </otherwise>
            </choose>
        </where>
    </select>

    <select id="queryByIn" resultType="Scores" parameterType="java.util.List">
        select * from scores
        <where>
            uid in
            <foreach collection="li" item="uid" open="(" separator="," close=")">
                #{uid}
            </foreach>
        </where>
    </select>

    <select id="queryByInMap" parameterType="java.util.Map" resultType="Scores">
        select * from scores
        <where>
            uid in
            -- uids key 的名称
            <foreach collection="uids" item="uid" open="(" separator="," close=")">
                #{uid}
            </foreach>
        </where>
    </select>

    <update id="updateUserInfo">
        update userInfo
        <set>
            <if test="name!=null and name!=''">
                name=#{name},
            </if>
            <if test="sex!=null and sex!=''">
                sex=#{sex},
            </if>
        </set>
        where id=#{id}
    </update>
</mapper>

注意 添加和修改 一定要提交事务

这里姓名 和 性别 输入 null 或者 为空的话 原数据不会改变

import com.A1207.A1207mybaitch03.dao.ScoresMapper;
import com.A1207.A1207mybaitch03.entity.Scores;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Test {
    public static void main(String[] args) throws IOException {
        InputStream ins = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(ins);
        SqlSession ss = ssf.openSession();

        ScoresMapper sm = ss.getMapper(ScoresMapper.class);
//        // map
//        Map mso = new HashMap<>();
//        int[] uids = {1,2};
//        mso.put("uids",uids);

//        List scores = sm.queryByInMap(mso);

        int i = sm.updateUserInfo("aa", "保密", 2);

        ss.commit();

        ss.close();

        System.out.println(i);

    }
}

返回结果 1
修改成功

MyBatis框架+Spring框架_第84张图片

trim标签

MyBatis框架+Spring框架_第85张图片

在这里插入图片描述

MyBatis框架+Spring框架_第86张图片

trim 这里改了 第一个查询的where 和最后一个修改的 set ,trim 可以看到这个语句非常好用

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.A1207.A1207mybaitch03.dao.ScoresMapper">
    <select id="queryById" resultType="Scores">
        SELECT * FROM scores
        <!--        <where>-->

        <!--            <if test="sid>0">-->
        <!--                sid=#{sid}-->
        <!--            </if>-->

        <!--            <if test="score>90">-->
        <!--                and score=#{score}-->
        <!--            </if>-->
        <!--        </where>-->
        <trim prefix="where" prefixOverrides="and|or">
            <if test="sid>0">
                sid=#{sid}
            </if>

            <if test="score>90">
                and score=#{score}
            </if>
        </trim>
    </select>

    <select id="queryByScore" resultType="Scores">
        SELECT * FROM scores
        <where>
            <choose>
                <when test="score>=90">
                    score = 99
                </when>
                <when test="score>=80 and score < 90">
                    score = 88
                </when>
                <when test="score>=70 and score < 80">
                    score = 77
                </when>
                <otherwise>
                    score &lt; #{score}
                </otherwise>
            </choose>
        </where>
    </select>

    <select id="queryByIn" resultType="Scores" parameterType="java.util.List">
        select * from scores
        <where>
            uid in
            <foreach collection="li" item="uid" open="(" separator="," close=")">
                #{uid}
            </foreach>
        </where>
    </select>

    <select id="queryByInMap" parameterType="java.util.Map" resultType="Scores">
        select * from scores
        <where>
            uid in
            -- uids key 的名称
            <foreach collection="uids" item="uid" open="(" separator="," close=")">
                #{uid}
            </foreach>
        </where>
    </select>

    <update id="updateUserInfo">
        update userInfo
        <!--        <set>-->
        <!--            <if test="name!=null and name!=''">-->
        <!--                name=#{name},-->
        <!--            </if>-->
        <!--            <if test="sex!=null and sex!=''">-->
        <!--                sex=#{sex},-->
        <!--            </if>-->
        <!--        </set>-->
        <!--        where id=#{id}-->
        <trim prefix="set" suffix="where id=#{id}" suffixOverrides=",">
            <if test="name!=null and name!=''">
                name=#{name},
            </if>
            <if test="sex!=null and sex!=''">
                sex=#{sex},
            </if>
        </trim>
    </update>
</mapper>

初识 Spring

理解Spring loC原理
掌握Spring loC配置
理解Spring AOP原理
掌握Spring AOP配置

Spring 框架

我们MyBatis 和 JDBC 都是持久层也可以叫数据层

我们Spring 那个层都不是,而是贯穿式的

MyBatis框架+Spring框架_第87张图片

在这里插入图片描述

Spring 体系结构

MyBatis框架+Spring框架_第88张图片

Spring 设计核心

MyBatis框架+Spring框架_第89张图片

控制反转/依赖注入

以往的方法
这个方法耦合度太高了
我们可以使用工厂设计模式来解决

MyBatis框架+Spring框架_第90张图片

下面就是工厂方法,但是代码太多了,有没有耦合度低代码少的方法
有就是下面的 Ioc 和 DI

MyBatis框架+Spring框架_第91张图片

第一个Spring程序

步骤

1.下载依赖jar包,并引入到项目中
2.编写Springi配置文件
3.编写测试代码通过Spring进行属性注入

MyBatis框架+Spring框架_第92张图片

示例

创建 spring 模板

头文件

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


</beans>

配置模板

MyBatis框架+Spring框架_第93张图片

这里要把头文件粘贴进去
MyBatis框架+Spring框架_第94张图片

设置 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" xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd ">
    <bean id="us" class="com.A1207.A1207Springch05.entity.Users">
        <property name="id" value="1"/>
        <property name="name" value="李四"/>
        <property name="age" value="20"/>
    </bean>
</beans>

然后就可以使用了

ClassPathXmlApplicationContext 括号里放 applicationContext.xml 的路径

import com.A1207.A1207Springch05.entity.Users;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.applet.AppletContext;

public class MainTest {
    public static void main(String[] args) {
         ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
         // 获取bean
        Users us = (Users) ac.getBean("us");
        System.out.println(us);
    }
}

结果

Users{id=1, name='李四', age=20}

MyBatis框架+Spring框架_第95张图片

面向切面编程(AOP)

MyBatis框架+Spring框架_第96张图片

MyBatis框架+Spring框架_第97张图片

名词

AOP相关术语

Aspect(切面)
Advice(增强处理)
Pointcut(切入点)
Join Point(连接点)
Target Object(目标对象)
AOP proxy(AOP 代理)
Weaving(织入)

MyBatis框架+Spring框架_第98张图片

Spring AOP在项目中的运用

MyBatis框架+Spring框架_第99张图片

MyBatis框架+Spring框架_第100张图片

MyBatis框架+Spring框架_第101张图片

MyBatis框架+Spring框架_第102张图片

public * addNewUser(entity.User)"*"表示匹配所有类型的返回值
public void *(entity.User)"*"表示匹配所有方法名
public void addNewUser(..)".."表示匹配任意参数个数和类型
* com.service.*.*(..):匹配com.service包下所有类的所有方法
* com.service..*.*(..):匹配com.service包及其子包下所有类的所有方法

添加增强类

MyBatis框架+Spring框架_第103张图片

示例

编写 service

package com.A1207.A1207Springch05.service;

import com.A1207.A1207Springch05.entity.Users;

public class UserService {
    public void save(Users u){
        System.out.println("正在添加数据,数据添加成功");
    }
}

MyBatis框架+Spring框架_第104张图片

编写 前置增强 和 后置增强

package com.A1207.A1207Springch05.advice;

import org.aspectj.lang.JoinPoint;

public class UserAdvice {
    // 前置增强
    public void before(JoinPoint jp){
        System.out.println("方法开始执行了");
    }

    // 后置增强
    public void afterReturning(JoinPoint jp){
        System.out.println("方法执行完毕");
    }
}

MyBatis框架+Spring框架_第105张图片

分辨添加 bean 和 配置aop信息

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd ">
    <bean id="us" class="com.A1207.A1207Springch05.entity.Users">
        <property name="id" value="1"/>
        <property name="name" value="李四"/>
        <property name="age" value="20"/>
    </bean>

    <bean id="ua" class="com.A1207.A1207Springch05.advice.UserAdvice"/>
    <bean id="uservice" class="com.A1207.A1207Springch05.service.UserService"/>

<!--    配置aop信息-->
    <aop:config>
<!--        配置切入点-->
        <aop:pointcut id="upc" expression="execution(public void save(..))"/>
<!--        织入增强-->
        <aop:aspect ref="ua">
<!--            前置增强-->
            <aop:before method="before" pointcut-ref="upc"/>
<!--            后置增强-->
            <aop:after-returning method="afterReturning" pointcut-ref="upc"/>
        </aop:aspect>
    </aop:config>
</beans>

MyBatis框架+Spring框架_第106张图片

编写测试类

import com.A1207.A1207Springch05.entity.Users;
import com.A1207.A1207Springch05.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.applet.AppletContext;

public class MainTest {
    public static void main(String[] args) {
         ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
         // 获取bean
//        Users us = (Users) ac.getBean("us");
        UserService us =(UserService) ac.getBean("uservice");
        us.save(new Users());

//        System.out.println(us);
    }
}

MyBatis框架+Spring框架_第107张图片

总结

MyBatis框架+Spring框架_第108张图片

Spring 深入学习

异常抛出增强

MyBatis框架+Spring框架_第109张图片

MyBatis框架+Spring框架_第110张图片

最终增强

MyBatis框架+Spring框架_第111张图片

MyBatis框架+Spring框架_第112张图片

MyBatis框架+Spring框架_第113张图片

环绕增强

MyBatis框架+Spring框架_第114张图片

这里用环绕增强是没有执行方法的,我们的在环绕增强里调用方法

MyBatis框架+Spring框架_第115张图片

//    环绕增强
    public void around(ProceedingJoinPoint pjp){
        try {
            System.out.println("环绕增强开始执行");
            pjp.proceed();
            System.out.println("环绕增强执行完毕");
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
    }
}

可以看到用环绕增强后可以使用方法了

MyBatis框架+Spring框架_第116张图片

构造注入

MyBatis框架+Spring框架_第117张图片

MyBatis框架+Spring框架_第118张图片

p命名空间注入

MyBatis框架+Spring框架_第119张图片

MyBatis框架+Spring框架_第120张图片

不同数据类型注入

MyBatis框架+Spring框架_第121张图片

MyBatis框架+Spring框架_第122张图片
结果

Users{id=1, name='李四', age=20, uu=Users{id=2, name='王五', age=20, uu=null, ls=null}, ls=[aa, bb, cc]}

使用注解实现Spring IoC

MyBatis框架+Spring框架_第123张图片

@Component:实现Bean组件的定义
@Repository:用于标注DAO类
@Service:用于标注业务类
@Controller:用于标注控制器类

MyBatis框架+Spring框架_第124张图片

MyBatis框架+Spring框架_第125张图片

先新建 bean

MyBatis框架+Spring框架_第126张图片
进行注解

MyBatis框架+Spring框架_第127张图片

MyBatis框架+Spring框架_第128张图片

MyBatis框架+Spring框架_第129张图片

这就非常简洁了,减少了许多代码

使用Java标准注解完成装配

MyBatis框架+Spring框架_第130张图片

MyBatis框架+Spring框架_第131张图片

MyBatis框架+Spring框架_第132张图片

使用注解实现Spring AOP

注意我们AOP 一般都是用配置的方式,不用注解的方式

MyBatis框架+Spring框架_第133张图片

MyBatis框架+Spring框架_第134张图片

@AfterThrowing注解定义异常抛出增强

@After注解定义最终增强

@Around注解定义环绕增强

示例

编写注解

package com.A1207.A1207Springch05.advice;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;

@Aspect
public class UserAdvice {
    // 配置切入点
    @Pointcut(value = "execution(public void save(..))")
    public void pointcut(){

    }

    // 前置增强
    @Before(value = "pointcut()")
    public void before(JoinPoint jp){
        System.out.println("方法开始执行了");
    }

    // 后置增强
    @AfterReturning("pointcut()")
    public void afterReturning(JoinPoint jp){
        System.out.println("方法执行完毕");
    }

    // 异常增强
    @AfterThrowing(value = "pointcut()",throwing = "e")
    public void afterThrowing(Exception e){
        System.out.println("异常增强执行");
    }

    // 最终增强
    @After("pointcut()")
    public void after(){
        System.out.println("最终执行");
    }

//    环绕增强
    @Around("pointcut()")
    public void around(ProceedingJoinPoint pjp){
        try {
            System.out.println("环绕增强开始执行");
            pjp.proceed();
            System.out.println("环绕增强执行完毕");
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
    }
}



开启注解

MyBatis框架+Spring框架_第135张图片

Spring 整合 MyBatis

基本整合方式

MyBatis框架+Spring框架_第136张图片

MyBatis框架+Spring框架_第137张图片

Spring 整合 MyBaits
坐标

   <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.3.19</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.32</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.7</version>
        </dependency>
        <!--    Spring操作数据库的花,还需要spring-jdbc-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.3.14</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.7</version>
        </dependency>


        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.3.2</version>
        </dependency>


        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-dbcp2</artifactId>
            <version>2.8.0</version>
        </dependency>

Spring 配置文件

applicationcontext.xml 文件

MyBatis框架+Spring框架_第138张图片
ApplicationContext.xml 文件

MyBatis框架+Spring框架_第139张图片

示例

首先导入连接

   <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.3.19</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.32</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.7</version>
        </dependency>
        <!--    Spring操作数据库的花,还需要spring-jdbc-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.3.14</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.7</version>
        </dependency>


        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.3.2</version>
        </dependency>


        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-dbcp2</artifactId>
            <version>2.8.0</version>
        </dependency>

 <build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties
                    **/*.xml</include>
                </includes>
            </resource>
        </resources>
    </build>

MyBatis框架+Spring框架_第140张图片
mybaits-config.xml 文件只用设置别名就可以

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd" >

<configuration>
<!--    &lt;!&ndash;    导入配置文件&ndash;&gt;-->
<!--    <properties resource="dataSource.properties"/>-->
    <!--    设置别名-->
    <typeAliases>
        <package name="com.A1207.A1207springAndMyBatisch7.entity"/>
    </typeAliases>
<!--    &lt;!&ndash;    配置运行环境 数据源等&ndash;&gt;-->
<!--    <environments default="随便起但要和id保持一致">-->
<!--        <environment id="随便起但要和id保持一致">-->
<!--            &lt;!&ndash;           设置事务管理器&ndash;&gt;-->
<!--            <transactionManager type="JDBC"/>-->
<!--            &lt;!&ndash;           设置数据源&ndash;&gt;-->
<!--            <dataSource type="POOLED">-->
<!--                <property name="driver" value="${driver}"/>-->
<!--                <property name="url" value="${url}"/>-->
<!--                <property name="username" value="${user}"/>-->
<!--                <property name="password" value="${password}"/>-->
<!--            </dataSource>-->
<!--        </environment>-->
<!--    </environments>-->

<!--    &lt;!&ndash;    设置Sql映射文件&ndash;&gt;-->

<!--    <mappers>-->
<!--        &lt;!&ndash;        先新建 dao&ndash;&gt;-->
<!--        <package name="dao 文件夹位置"/>-->
<!--    </mappers>-->
</configuration>
<?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">

<!--    读取 properties 文件-->
    <bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
        <property name="location" value="classpath:dataSource.properties"/>
    </bean>

<!--    配置数据源-->
    <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
        <property name="driverClassName" value="${driver}"/>
        <property name="url" value="${url}"/>
        <property name="username" value="${user}"/>
        <property name="password" value="${password}"/>
    </bean>

<!--    配置 sqlSessionFactory-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="configLocation" value="classpath:mybaits-config.xml"/>
    </bean>

<!--    配置 dao-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.A1207.A1207springAndMyBatisch7.dao"/>
    </bean>
</beans>

映射器整合方式

MyBatis框架+Spring框架_第141张图片

MyBatis框架+Spring框架_第142张图片

我们上面用的就是这个

MyBatis框架+Spring框架_第143张图片

示例

dao 文件
接口
UserInfoMapper

package com.A1207.A1207springAndMyBatisch7.dao;

import com.A1207.A1207springAndMyBatisch7.entity.UserInfo;

import java.util.List;

public interface UserInfoMapper {
    public List<UserInfo> selectAll();
}

UserInfoMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.A1207.A1207springAndMyBatisch7.dao.UserInfoMapper">
    <select id="selectAll" resultType="UserInfo">
        SELECT * FROM userinfo;
    </select>
</mapper>

entity

package com.A1207.A1207springAndMyBatisch7.entity;

public class UserInfo {
    private int id;
    private String name;
    private String sex;

    @Override
    public String toString() {
        return "UserInfo{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                '}';
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }
}

service

package com.A1207.A1207springAndMyBatisch7.service;

import com.A1207.A1207springAndMyBatisch7.dao.UserInfoMapper;
import com.A1207.A1207springAndMyBatisch7.entity.UserInfo;
import org.aspectj.lang.annotation.Around;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;

@Service
public class UserInfoService {
    @Autowired
    private UserInfoMapper userInfoMapper;

    public List<UserInfo> selectAll(){
        return userInfoMapper.selectAll();
    }
}

配置文件

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/test220707
user=root
password=root123

applicationContext.xml

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

<!--    读取 properties 文件-->
    <bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
        <property name="location" value="classpath:dataSource.properties"/>
    </bean>

<!--    配置数据源-->
    <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
        <property name="driverClassName" value="${driver}"/>
        <property name="url" value="${url}"/>
        <property name="username" value="${user}"/>
        <property name="password" value="${password}"/>
    </bean>

<!--    配置 sqlSessionFactory-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="configLocation" value="classpath:mybaits-config.xml"/>
    </bean>

<!--    配置 dao-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.A1207.A1207springAndMyBatisch7.dao"/>
    </bean>

<!--    开启注解扫描-->
    <context:component-scan base-package="com.A1207.A1207springAndMyBatisch7.service"/>
</beans>

mybaits-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd" >

<configuration>
<!--    &lt;!&ndash;    导入配置文件&ndash;&gt;-->
<!--    <properties resource="dataSource.properties"/>-->
    <!--    设置别名-->
    <typeAliases>
        <package name="com.A1207.A1207springAndMyBatisch7.entity"/>
    </typeAliases>
<!--    &lt;!&ndash;    配置运行环境 数据源等&ndash;&gt;-->
<!--    <environments default="随便起但要和id保持一致">-->
<!--        <environment id="随便起但要和id保持一致">-->
<!--            &lt;!&ndash;           设置事务管理器&ndash;&gt;-->
<!--            <transactionManager type="JDBC"/>-->
<!--            &lt;!&ndash;           设置数据源&ndash;&gt;-->
<!--            <dataSource type="POOLED">-->
<!--                <property name="driver" value="${driver}"/>-->
<!--                <property name="url" value="${url}"/>-->
<!--                <property name="username" value="${user}"/>-->
<!--                <property name="password" value="${password}"/>-->
<!--            </dataSource>-->
<!--        </environment>-->
<!--    </environments>-->

<!--    &lt;!&ndash;    设置Sql映射文件&ndash;&gt;-->

<!--    <mappers>-->
<!--        &lt;!&ndash;        先新建 dao&ndash;&gt;-->
<!--        <package name="dao 文件夹位置"/>-->
<!--    </mappers>-->
</configuration>

测试文件
MainTest

注意后面那个 userInfoService 要小写 因为我们没有指定 所以要小写

import com.A1207.A1207springAndMyBatisch7.service.UserInfoService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainTest {
    public static void main(String[] args) {
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserInfoService ui = (UserInfoService)ac.getBean("userInfoService");

        System.out.println(ui.selectAll());

    }
}

配置声明式事务

MyBatis框架+Spring框架_第144张图片

MyBatis框架+Spring框架_第145张图片

导入命名空间
定义事务管理器
设置事务属性
定义事务切面

MyBatis框架+Spring框架_第146张图片

MyBatis框架+Spring框架_第147张图片

MyBatis框架+Spring框架_第148张图片

timeout:事务超时时间
允许事务运行的最长时间,以秒为单位
超过给定的时间自动回滚,防止事务执行时间过长而影响系统性能
read-only:事务是否为只读
默认值为false,对于仅执行查询功能的事务设置为true,提高事务处理性能
rollback-for:设定能够触发回滚的异常类型
Spring默认只在抛出RuntimeException时才标识事务回滚
可以通过全限定类名自行指定需要回滚事务的异常
no-rollback-for:设定不触发回滚的异常类型
Spring默认CheckedException不会触发事务回滚
可以通过全限定类名自行指定不需回滚事务的异常

MyBatis框架+Spring框架_第149张图片

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

    <!--    读取 properties 文件-->
    <bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
        <property name="location" value="classpath:dataSource.properties"/>
    </bean>

    <!--    配置数据源-->
    <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
        <property name="driverClassName" value="${driver}"/>
        <property name="url" value="${url}"/>
        <property name="username" value="${user}"/>
        <property name="password" value="${password}"/>
    </bean>

    <!--    配置 sqlSessionFactory-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="configLocation" value="classpath:mybaits-config.xml"/>
    </bean>

    <!--    配置 dao-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.A1207.A1207springAndMyBatisch7.dao"/>
    </bean>

    <!--    开启注解扫描-->
    <context:component-scan base-package="com.A1207.A1207springAndMyBatisch7.service"/>

<!--    &lt;!&ndash;    配置声明事务&ndash;&gt;-->
<!--    &lt;!&ndash;    配置事务管理器&ndash;&gt;-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>

<!--    &lt;!&ndash;    开启注解事务&ndash;&gt;-->
<!--    <tx:annotation-driven/>-->
    <!--        配置事务属性-->
    <tx:advice id="txAdvice">
        <tx:attributes>
            <tx:method name="*" propagation="REQUIRED" isolation="DEFAULT"/>
            <tx:method name="update*" propagation="REQUIRED"/>
        </tx:attributes>
    </tx:advice>

    <aop:config>
        <aop:pointcut id="userPointCut" expression="execution(* com.A1207.A1207springAndMyBatisch7.service.*.*(..))"/>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="userPointCut"/>
    </aop:config>
</beans>

使用注解实现声明式事务

MyBatis框架+Spring框架_第150张图片

MyBatis框架+Spring框架_第151张图片

使用上面的方法有代码有点多

我们可以使用注解的方式

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

    <!--    读取 properties 文件-->
    <bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
        <property name="location" value="classpath:dataSource.properties"/>
    </bean>

    <!--    配置数据源-->
    <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
        <property name="driverClassName" value="${driver}"/>
        <property name="url" value="${url}"/>
        <property name="username" value="${user}"/>
        <property name="password" value="${password}"/>
    </bean>

    <!--    配置 sqlSessionFactory-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="configLocation" value="classpath:mybaits-config.xml"/>
    </bean>

    <!--    配置 dao-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.A1207.A1207springAndMyBatisch7.dao"/>
    </bean>

    <!--    开启注解扫描-->
    <context:component-scan base-package="com.A1207.A1207springAndMyBatisch7.service"/>

<!--    &lt;!&ndash;    配置声明事务&ndash;&gt;-->
<!--    &lt;!&ndash;    配置事务管理器&ndash;&gt;-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <!--    开启注解事务-->
    <tx:annotation-driven/>
<!--    &lt;!&ndash;        配置事务属性&ndash;&gt;-->
<!--    <tx:advice id="txAdvice">-->
<!--        <tx:attributes>-->
<!--            <tx:method name="*" propagation="REQUIRED" isolation="DEFAULT"/>-->
<!--            <tx:method name="update*" propagation="REQUIRED"/>-->
<!--        </tx:attributes>-->
<!--    </tx:advice>-->

<!--    <aop:config>-->
<!--        <aop:pointcut id="userPointCut" expression="execution(* com.A1207.A1207springAndMyBatisch7.service.*.*(..))"/>-->
<!--        <aop:advisor advice-ref="txAdvice" pointcut-ref="userPointCut"/>-->
<!--    </aop:config>-->
</beans>
package com.A1207.A1207springAndMyBatisch7.service;

import com.A1207.A1207springAndMyBatisch7.dao.UserInfoMapper;
import com.A1207.A1207springAndMyBatisch7.entity.UserInfo;
import org.aspectj.lang.annotation.Around;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.List;

@Service
public class UserInfoService {
    @Autowired
    private UserInfoMapper userInfoMapper;

    @Transactional(propagation = Propagation.REQUIRED,isolation = Isolation.DEFAULT)
    public List<UserInfo> selectAll(){
        return userInfoMapper.selectAll();
    }
}

掌握更多配置数据源的方法

使用properties 文件配置数据源

MyBatis框架+Spring框架_第152张图片

MyBatis框架+Spring框架_第153张图片

使用 JNDI 配置数据源

MyBatis框架+Spring框架_第154张图片

拆分Spring 配置文件

MyBatis框架+Spring框架_第155张图片

引入拆分后的配置文件

MyBatis框架+Spring框架_第156张图片

示例

MyBatis框架+Spring框架_第157张图片

MyBatis框架+Spring框架_第158张图片

依然可以运行

MyBatis框架+Spring框架_第159张图片

MyBatis框架+Spring框架_第160张图片

Spring 中Bean 的自动装配

MyBatis框架+Spring框架_第161张图片

MyBatis框架+Spring框架_第162张图片
MyBatis框架+Spring框架_第163张图片

示例

在这里插入图片描述

MyBatis框架+Spring框架_第164张图片

MyBatis框架+Spring框架_第165张图片

更改自动装配的方式

在这里插入图片描述

MyBatis框架+Spring框架_第166张图片

MyBatis框架+Spring框架_第167张图片

MyBatis框架+Spring框架_第168张图片

设置全局自动装配的方式

MyBatis框架+Spring框架_第169张图片

MyBatis框架+Spring框架_第170张图片

Spring 中的Bean 的作用域

MyBatis框架+Spring框架_第171张图片

MyBatis框架+Spring框架_第172张图片

MyBatis框架+Spring框架_第173张图片

在这里插入图片描述

Spring MVC

理解MVC设计模式

MyBatis框架+Spring框架_第174张图片

jsp model 1

MyBatis框架+Spring框架_第175张图片

jsp model 2

MyBatis框架+Spring框架_第176张图片

MVC 处理过程

MyBatis框架+Spring框架_第177张图片

MVC 的优点

MyBatis框架+Spring框架_第178张图片

MyBatis框架+Spring框架_第179张图片

使用注解开发Spring MVC

MyBatis框架+Spring框架_第180张图片

配置视图解析器

MyBatis框架+Spring框架_第181张图片

MyBatis框架+Spring框架_第182张图片

Spring MVC请求处理流程

MyBatis框架+Spring框架_第183张图片

MyBatis框架+Spring框架_第184张图片

MyBatis框架+Spring框架_第185张图片

MyBatis框架+Spring框架_第186张图片

MyBatis框架+Spring框架_第187张图片

@RequestMapping 注解

MyBatis框架+Spring框架_第188张图片

MyBatis框架+Spring框架_第189张图片

入参处理

就是把 userName 你传过来的参数 给到 realName

如果 括号里的代码 什么都不写那传过来的参数要和参数一直,不然接受不到

MyBatis框架+Spring框架_第190张图片

示例

MyBatis框架+Spring框架_第191张图片

MyBatis框架+Spring框架_第192张图片

MyBatis框架+Spring框架_第193张图片

可以看到不给参数就报错

出参

MyBatis框架+Spring框架_第194张图片

要传键和值

MyBatis框架+Spring框架_第195张图片

MyBatis框架+Spring框架_第196张图片

MyBatis框架+Spring框架_第197张图片

这里建议用 model 出参

package com.example.a1207SpringmvcCh9.control;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

import javax.management.modelmbean.ModelMBean;
import java.util.Map;

@Controller
public class HelloControl1 {

//    @RequestMapping(value = "/hello1",method = RequestMethod.GET)
    @RequestMapping("/hello1")
    public String hello1(){
    // 返回给哪个 jsp 页面
        return "hello";
    }

    // 入参 不加value的话要和传过来的值的变量名要一致
    @RequestMapping("/hello2")
    public String hello2(@RequestParam(value = "aid") int id){
        System.out.println(id);
        return "hello";
    }

    // 出参 ModelAndView
    @RequestMapping("/hello3")
    public ModelAndView hello3(){
        ModelAndView mav = new ModelAndView();
        mav.addObject("text","你好");
        mav.setViewName("hello1");
        return mav;
    }

    // 出参 model
    @RequestMapping("/hello4")
    public String hello4(Model m){
        m.addAttribute("text","你好1207");
        return "hello1";
    }

    // 出参 map
    @RequestMapping("/hello5")
    public String hello5(Map m){
        m.put("text","你好,我是渣渣会");
        return "hello1";
    }
}

使用注解

MyBatis框架+Spring框架_第198张图片

使用 spring MVC

MyBatis框架+Spring框架_第199张图片

示例 MVC 的基本使用

导入这两个 jar 包

<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>5.3.19</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.3.19</version>
        </dependency>

在 web.xml 里面添加

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
<!--    配置前端控制器-->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc-servlet.xml</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

MyBatis框架+Spring框架_第200张图片

方法一

新建control包,在新建类名为helloControl ,让他继承 AbstractController

MyBatis框架+Spring框架_第201张图片

使用方法一的话有一个响应就得写一个bean

MyBatis框架+Spring框架_第202张图片

MyBatis框架+Spring框架_第203张图片

这样就可以显示了

方式二 注解的方式

MyBatis框架+Spring框架_第204张图片

新建 helloControl1

MyBatis框架+Spring框架_第205张图片

就出来了,比上面的简单多了,所有更多用这个

MyBatis框架+Spring框架_第206张图片

单例模式及统一异常处理

MyBatis框架+Spring框架_第207张图片

单列模式

MyBatis框架+Spring框架_第208张图片

MyBatis框架+Spring框架_第209张图片

MyBatis框架+Spring框架_第210张图片

示例

package com.A1207.A1207SpringMvcCh10.entity;

// 设计成为单列
public class Users {
    // 2. 设置当前类型的属性并且设置为静态私有的
    private static Users u = new Users();

    // 1.私有构造函数
    private Users() {

    }

    // 3.设置共有的静态方法,返回属性
    public static Users getUsers(){
        return u;
    }
}

可有看到不可以直接调用

MyBatis框架+Spring框架_第211张图片

这里使用 getUsers 方法可以看到两次的都是Users 对象

MyBatis框架+Spring框架_第212张图片

注意使用上面的方法会出现问题,线程不安全

MyBatis框架+Spring框架_第213张图片

懒汉模式

MyBatis框架+Spring框架_第214张图片

使用这个模式会出现线程不安全,要给代码上锁(synchronized)

MyBatis框架+Spring框架_第215张图片

饿汉模式

MyBatis框架+Spring框架_第216张图片

MyBatis框架+Spring框架_第217张图片

饿汉模式很安全,但是不具备延迟加载

饿汉模式实现延迟加载(使用内部内)

新建 Stu 类

package com.A1207.A1207SpringMvcCh10.entity;

// 实现饿汉模式延迟加载
public class Stu {

    private static Stu s ;

    private Stu() {


    }

    public static Stu getStu() {
        Stunbl sn = new Stunbl();
        s = sn.getStu();
        return s;
    }

    // 使用内部内来实现延迟加载
    static class Stunbl {
        static Stu s = new Stu();
        public Stu getStu() {
            return s;
        }
    }
}

MyBatis框架+Spring框架_第218张图片

Spring MVC中的单例模式

MyBatis框架+Spring框架_第219张图片

Spring MVC 的整合

MyBatis框架+Spring框架_第220张图片

实例

首先先新建

MyBatis框架+Spring框架_第221张图片

UserControl 控制类代码

package com.A1207.A1207SpringMvcCh10.control;

import com.A1207.A1207SpringMvcCh10.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class UserControl {
    @Autowired
    UserService us;

    @RequestMapping("/msg")
    public String getMsg(Model m) {
        m.addAttribute("msg",us.getMsg());
        return "msg";
    }
}

UserService 中的代码

package com.A1207.A1207SpringMvcCh10.service;

import org.springframework.stereotype.Service;

@Service
public class UserService {

    public String getMsg(){
        return "获取类业务运行完毕";
    }
}

在新建这连个文件
在这里插入图片描述

applicationContext 文件代码

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!--    开启注解-->
<context:component-scan base-package="com.A1207.A1207SpringMvcCh10.service"/>
</beans>

springmvc-servlet 文件代码

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd   http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
    <!--mvc注解开启-->
    <mvc:annotation-driven/>
    <!--    springioc注解-->
    <context:component-scan base-package="com.A1207.A1207SpringMvcCh10.control"/>

<!--    视图解释器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
<!--设置静态资源的映射-->
    <mvc:resources mapping="/statics/*" location="/statics/"/>
</beans>

然后在 web.xml 里面编写

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
        <!--    配置前端控制器-->
        <servlet>
            <servlet-name>springmvc</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>classpath:springmvc-servlet.xml</param-value>
            </init-param>
        </servlet>
        <servlet-mapping>
            <servlet-name>springmvc</servlet-name>
            <url-pattern>/</url-pattern>
        </servlet-mapping>
<!--    监听器-->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
<!--    加载spring 配置文件-->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>
</web-app>

导入js 代码

MyBatis框架+Spring框架_第222张图片

最后编写页面

MyBatis框架+Spring框架_第223张图片

异常处理

MyBatis框架+Spring框架_第224张图片

局部异常处理

MyBatis框架+Spring框架_第225张图片

MyBatis框架+Spring框架_第226张图片

全局异常处理

MyBatis框架+Spring框架_第227张图片

MyBatis框架+Spring框架_第228张图片

可以看到跳转到这个页面了,但是没有显示异常,因为全局异常处理只可以条转到对应的页面,不可以把异常对象传过来

MyBatis框架+Spring框架_第229张图片

数据校验及文件上传

改造添加功能

MyBatis框架+Spring框架_第230张图片

MyBatis框架+Spring框架_第231张图片

体验

pom 导入jar 包

编写 springmvc-servlet

MyBatis框架+Spring框架_第232张图片

编写 web.xml

MyBatis框架+Spring框架_第233张图片

MyBatis框架+Spring框架_第234张图片

MyBatis框架+Spring框架_第235张图片

在这里插入图片描述

可以看到我们传过去的生日 是 String 类型的,但我控制层接受的是Date 类型的(控制层里面接受的是Users 类型的 Users 类型里面的生日是 Date )

可以看到下面报错


有几种解决办法比如把Date 类型改成String 类型
但是很麻烦,这里有个更好的方法

解决这个问题 添加一个注释就可以解决

在这里插入图片描述

MyBatis框架+Spring框架_第236张图片

REST 风格

MyBatis框架+Spring框架_第237张图片

看一下,下面豆瓣的例子

MyBatis框架+Spring框架_第238张图片

改造查询功能

MyBatis框架+Spring框架_第239张图片

MyBatis框架+Spring框架_第240张图片

演示

分别添加下面的代码

MyBatis框架+Spring框架_第241张图片

在这里插入图片描述

MyBatis框架+Spring框架_第242张图片

Spring 表单标签

MyBatis框架+Spring框架_第243张图片

Spring 常用标签

MyBatis框架+Spring框架_第244张图片

MyBatis框架+Spring框架_第245张图片

MyBatis框架+Spring框架_第246张图片

体验

MyBatis框架+Spring框架_第247张图片

MyBatis框架+Spring框架_第248张图片

数据校验

MyBatis框架+Spring框架_第249张图片

MyBatis框架+Spring框架_第250张图片

MyBatis框架+Spring框架_第251张图片

MyBatis框架+Spring框架_第252张图片

实例

MyBatis框架+Spring框架_第253张图片

MyBatis框架+Spring框架_第254张图片

MyBatis框架+Spring框架_第255张图片

MyBatis框架+Spring框架_第256张图片

可以看到可以跳转,控制台输出的name 是为 “” 但是还是可以跳转,所以这里校验个人感觉不是很好用

MyBatis框架+Spring框架_第257张图片

这里再试试是生日

MyBatis框架+Spring框架_第258张图片

MyBatis框架+Spring框架_第259张图片

MyBatis框架+Spring框架_第260张图片

Spring MVC的文件上传

MyBatis框架+Spring框架_第261张图片

依赖jar 包

MyBatis框架+Spring框架_第262张图片
MyBatis框架+Spring框架_第263张图片

体验

在 pom.xml 中导入jar包

<dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.2</version>
        </dependency>
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.2</version>
        </dependency>

然后在页面编写

MyBatis框架+Spring框架_第264张图片

<form action="${pageContext.request.contextPath}/add" method="post" enctype="multipart/form-data">
    上传文件:<input type="file" name="sc">
    <br>
    <input type="submit" value="上传">
</form>

然后到 springmvc-servlet.xml 中设置文件大小和文件类型(图片还是文本)

MyBatis框架+Spring框架_第265张图片
我这里只设置文件上传大小

    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize" value="500000"/>
    </bean>

再到控制层编写

// 因为文件上传是 post 请求所以这里用 PostMapping
@PostMapping("/add")
    public String add(@RequestParam(value = "sc") MultipartFile file) throws IOException {
   		 // 获取文件名称
        System.out.println("文件名称"+file.getOriginalFilename());
        // 获取文件大小
        System.out.println("文件大小"+file.getSize());
        // 获取文件类型
        System.out.println("文件类型"+file.getContentType());
        // 新建文件对象,传一个路径 + 文件名称
        File file1 = new File("D:\\JavaEnterpriseWeb\\A1207springmvcCh11\\src\\main\\webapp\\static\\"+file.getOriginalFilename());
        // 文件上传
        file.transferTo(file1);
        // 返回页面
        return "hello";
    }

MyBatis框架+Spring框架_第266张图片

如果是多文件上传就在外面加上 for ,接受的是数组

演示

这里为了方便,就多添加一个 input

MyBatis框架+Spring框架_第267张图片

<form action="${pageContext.request.contextPath}/add" method="post" enctype="multipart/form-data">
    上传文件:<input type="file" name="sc" id="aa">
    上传文件:<input type="file" name="sc" id="bb">
    <br>
    <input type="submit" value="上传">
</form>

MyBatis框架+Spring框架_第268张图片

    @PostMapping("/add")
    public String add(@RequestParam(value = "sc") MultipartFile[] file) throws IOException {

        for (int i = 0;i < file.length ;i++){
            // 获取文件名称
            System.out.println("文件名称"+file[i].getOriginalFilename());
            // 获取文件大小
            System.out.println("文件大小"+file[i].getSize());
            // 获取文件类型
            System.out.println("文件类型"+file[i].getContentType());
            // 新建文件对象,传一个路径 + 文件名称
            File file1 = new File("D:\\JavaEnterpriseWeb\\A1207springmvcCh11\\src\\main\\webapp\\static\\"+
                    file[i].getOriginalFilename());
            // 文件上传
            file[i].transferTo(file1);
        }

        // 返回页面
        return "hello";
    }

Spring MVC扩展和SSM框架整合

JSON数据的传递处理

MyBatis框架+Spring框架_第269张图片

MyBatis框架+Spring框架_第270张图片

直接把返回结果添加到response 头文件中,不经过视图解释器
@ResponseBody

演示

先导入jar包

 <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>2.0.7</version>
        </dependency>

编写页面

<%--
  Created by IntelliJ IDEA.
  User: SSOA
  Date: 2022/8/8
  Time: 8:37
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="fm" uri="http://www.springframework.org/tags/form" %>
<html>
<head>
    <title>Title</title>
    <script src="statics/js/jquery-1.8.2.min.js"></script>

    <script>
        function exitsName (){
            var name = $("#name").val()
            $.ajax({
                url:"exitsName?name="+name,
                type:"json",
                success:function (res){
                    if (res.check){
                        $("#ts").text("用户名可用")
                    }else{
                        $("#ts").text("用户名不可用")
                    }
                }
            })
        }

            function queryById(){
                $.ajax({
                    url:"queryById",
                    type: "json",
                    success:function (res){
                        $("#xs").text(res);
                    }
                })
            }

    </script>
</head>
<body>
<%--<form action="add" method="post">--%>
<%--    姓名:<input type="text" name="name">--%>
<%--    生日:<input type="text" name="birthday">--%>
<%--    <input type="submit" value="添加">--%>
<%--</form>--%>

<%--<fm:form action="add" method="get" modelAttribute="users">--%>
<%--    id:<fm:input path="id"/><fm:errors path="id"/>--%>
<%--    <br>--%>
<%--    姓名:<fm:input path="name"/><fm:errors path="name"/>--%>
<%--    <br>--%>
<%--    生日:<fm:input path="birthday"/><fm:errors path="birthday"/>--%>
<%--    <br>--%>
<%--    <input type="submit" value="添加">--%>
<%--</fm:form>--%>

<%--<form action="${pageContext.request.contextPath}/add" method="post" enctype="multipart/form-data">--%>
<%--    上传文件:<input type="file" name="sc" id="aa">--%>
<%--    上传文件:<input type="file" name="sc" id="bb">--%>
<%--    <br>--%>
<%--    <input type="submit" value="上传">--%>
<%--</form>--%>

<form action="add">
    姓名:<input type="text" name="name" id="name" onblur="exitsName()"/><span id="ts"></span><br>
    生日:<input type="text" name="birthday"/><br>

    <input type="submit" value="注册">
</form>

<a href="queryById" onclick="queryById()">根据id 来查询</a>

<div id="xs">

</div>
</body>
</html>

在 springmvc-servlet 添加静态路径映射

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:p="http://www.springframework.org/schema/p" xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!--    开启mvc注解-->
    <mvc:annotation-driven/>
<!--    ioc 注解-->
    <context:component-scan base-package="com.A1207.A1207springmvcCh11.control"/>
<!--    静态路径映射-->
    <mvc:resources mapping="/statics/**" location="/statics/"/>
<!--    视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

<!--    设置上传文件的大小-->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize" value="500000"/>
    </bean>


</beans>

编写控制层

package com.A1207.A1207springmvcCh11.control;

import com.A1207.A1207springmvcCh11.entity.Users;
import com.alibaba.fastjson.JSON;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.validation.Valid;
import java.awt.font.MultipleMaster;
import java.io.File;
import java.io.IOException;
import java.util.Date;

@Controller
public class UserControl {

    @RequestMapping("/toAdd")
    public String toAdd(@ModelAttribute(value = "users") Users users, Model model){
//        model.addAttribute("user",u);
        return "add";
    }

    @RequestMapping("/add")
    public String add(@Valid Users u, BindingResult br,Model m) {
        if (br.hasErrors()){// 校验是否通过
//            m.addAttribute("user",this.u);
            System.out.println(br.getModel());
            return "add";
        }
        System.out.println(u);
        return "hello";
    }

    @RequestMapping("/query/{id}")
    public String query(@PathVariable String id){
        System.out.println(id);
        return "hello";
    }

    @PostMapping("/add")
    public String add(@RequestParam(value = "sc") MultipartFile[] file) throws IOException {

        for (int i = 0;i < file.length ;i++){
            // 获取文件名称
            System.out.println("文件名称"+file[i].getOriginalFilename());
            // 获取文件大小
            System.out.println("文件大小"+file[i].getSize());
            // 获取文件类型
            System.out.println("文件类型"+file[i].getContentType());
            // 新建文件对象,传一个路径 + 文件名称
            File file1 = new File("D:\\JavaEnterpriseWeb\\A1207springmvcCh11\\src\\main\\webapp\\static\\"+
                    file[i].getOriginalFilename());
            // 文件上传
            file[i].transferTo(file1);
        }

        // 返回页面
        return "hello";
    }

    // 验证用户名是否可用
    @RequestMapping("/exitsName")
    @ResponseBody // 直接把返回结果添加到response 头文件中,不经过视图解释器
    public String exits(@RequestParam String name){
        if ("a1207".equals(name)){// 不可用
            // {"check":true}
            return "{\"check\":false}";
        }else {// 可用
            return "{\"check\":true}";
        }
    }

    @RequestMapping("/queryById")
    @ResponseBody
    public String queryById(){
        Users u = new Users();
        u.setId(1);
        u.setName("张三");
        u.setBirthday(new Date());
        return JSON.toJSONString(u);
    }

}

JSON数据传递过程中的中文乱码和日期问题

MyBatis框架+Spring框架_第271张图片

MyBatis框架+Spring框架_第272张图片

解决中文乱码

第一种写法

MyBatis框架+Spring框架_第273张图片

MyBatis框架+Spring框架_第274张图片

这里是不行的,必须要 res.什么 才可以

MyBatis框架+Spring框架_第275张图片

在这里插入图片描述

第二种方法

在这里插入图片描述

MyBatis框架+Spring框架_第276张图片

这个也可以
MyBatis框架+Spring框架_第277张图片

解决日期乱码问题

MyBatis框架+Spring框架_第278张图片

第一种

在这里插入图片描述

MyBatis框架+Spring框架_第279张图片

第二种方法(这里版本问题就不演示了)

我的版本

IntelliJ IDEA 2020.3.1 (Ultimate Edition)

MyBatis框架+Spring框架_第280张图片

多视图解释器

MyBatis框架+Spring框架_第281张图片

MyBatis框架+Spring框架_第282张图片

MyBatis框架+Spring框架_第283张图片

MyBatis框架+Spring框架_第284张图片

MyBatis框架+Spring框架_第285张图片

多视图解释器

 <bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
        <!-- 是否启用参数支持,默认为true(支持),即xxx?format=json、xml等形式。 -->
        <property name="favorParameter" value="true" />
        <!-- favorPathExtension:是否支持扩展名,默认为true(支持),扩展名指xxx.json、xxx.xml等形式 -->
        <property name="favorPathExtension" value="true" />
        <!-- 默认ContentType -->
        <property name="defaultContentType" value="application/json" />
        <!-- 配置映射关系 -->
        <!--扩展名到MIME的映射;favorPathExtension, favorParameter是true时起作用  -->
        <property name= "mediaTypes">
            <value>
                json=application/json
                xml=application/xml
                html=text/html
            </value>
        </property>
    </bean>
    <!-- VIEW解析定义。内容协商视图解析器;根据contentNegotiationManager使用的不同mediaTypes决定不同的 view进行响应  默认使用json-->
    <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
        <!-- 内容协商管理器 用于决定media type -->
        <property name="contentNegotiationManager" ref="contentNegotiationManager"/>
        <!-- 默认视图 解析 -->
        <property name="defaultViews">
            <list>
                <bean class="com.alibaba.fastjson.support.spring.FastJsonJsonView">
<!--                    <property name="charset" value="UTF-8"/>-->
                </bean>
            </list>
        </property>
        <property name="viewResolvers">
            <list>
                <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
                    <property name="prefix" value="/WEB-INF/jsp/"/>
                    <property name="suffix" value=".jsp"/>
                </bean>
            </list>
        </property>
    </bean>

Spring MVC框架中的数据格式转换

MyBatis框架+Spring框架_第286张图片

MyBatis框架+Spring框架_第287张图片

MyBatis框架+Spring框架_第288张图片

编写自定义转换器

MyBatis框架+Spring框架_第289张图片

MyBatis框架+Spring框架_第290张图片
我们一开始用的是这个注解

这个是入参格式设置

MyBatis框架+Spring框架_第291张图片

SSM整合

MyBatis框架+Spring框架_第292张图片

MyBatis框架+Spring框架_第293张图片

具体项目见 Spring+springmvc+mybatis 文章

分页框架

分页插件 pageHelper

导入jar 包

 <dependency>
            <groupId>com.github.pagehelpergroupId>
            <artifactId>pagehelperartifactId>
            <version>5.1.4version>
        dependency>

添加配置
mybatis-config.xml

MyBatis框架+Spring框架_第294张图片

MyBatis框架+Spring框架_第295张图片

MyBatis框架+Spring框架_第296张图片

MyBatis框架+Spring框架_第297张图片

拦截器

新建拦截器类
interceptor 包
SysInterceptor 类

然后继承 HandlerInterceptorAdapter 有一个横杠是因为这个拦截器不建议使用,有更好的方法
然后重写 preHandle 方法

这里面判断作用域中有没有用户,没有的话进行拦截,并跳转到 403页面
MyBatis框架+Spring框架_第298张图片

然后再 springmvc-servlet.xml 里面添加 拦截器配置
path 设置拦截的路径
bean class 设置使用那个拦截器类


    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/manager/backend/**"/>
            <bean class="com.A1207.A1207Game.interceptor.SysInterceptor"/>
        mvc:interceptor>
    mvc:interceptors>

你可能感兴趣的:(java,后端,mybatis,java,mysql)