SSM整合/spring boot整合mybatis

1. Mybatis-驼峰映射

1.1 案例演示

问题说明: 工作中使用驼峰规则的定义的场景比较多的.但是如果每个属性都需要自己手动的封装,则比较繁琐. 所以框架应该提供自动映射的功能.
在这里插入图片描述

1.2 驼峰规则说明

  1. 官网描述:
    在这里插入图片描述
  2. 设置settings
  <!--配置settings信息-->
    <settings>
        <!--开启驼峰映射规则-->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
    
    <typeAliases>
        <!--type:  POJO对象的路径  alias: 为当前的POJO对象起的别名-->
        <!--<typeAlias type="com.jt.pojo.User" alias="User"/>-->

        <!--设置别名包 -->
        <package name="com.jt.pojo"/>
    </typeAliases>
  1. 驼峰规则映射说明
 <!--查询用户信息  开启驼峰映射规则
        resultType:
                1.适用与单表查询,同时要求属性名称与字段相同.
                2.如果属性与字段满足驼峰命名规则,开启驼峰映射之后,
                  可以使用resultType
        resultMap:
                1.如果字段不一致时使用
                2.多表关联查询时使用.
                3.如果开启了驼峰映射规则, 则自动映射的属性可以省略,最好标识主键
                4.如果使用驼峰规则映射时,需要映射封装对象时(一对一/一对多),默认条件下.驼峰规则失效.
                  可以使用: autoMapping="true" 要求开启驼峰映射.
                5.默认条件下 一对一,一对多不会自动完成驼峰规则映射.
                  需要配置 autoMapping="true"才能自动映射
     -->
    <select id="getAll" resultMap="getEmpMap">
        select e.emp_id,e.emp_name,
               d.dept_id,d.dept_name
	    from emp e,dept d
	    where e.dept_id = d.dept_id
    </select>
    <resultMap id="getEmpMap" type="Emp" autoMapping="true">
        <id column="emp_id" property="empId"/>
        <!--其它属性自动映射-->
        <!--实现部门映射-->
        <association property="dept" javaType="Dept" autoMapping="true">
            <id column="dept_id" property="deptId"/>
        </association>
    </resultMap>

2. Mybatis 缓存机制

2.1 缓存概念

如果有大量相同的请求查询数据库,则数据库需要执行多次重复的sql,那么并发压力高,查询效率低. 如果引入缓存机制,则可以极大的提升用户的查询的效率.
在这里插入图片描述

2.2 Mybatis 提供缓存机制

Mybatis中有2级缓存
一级缓存 SqlSession 在同一个sqlSession内部 执行多次查询 缓存有效. 一级缓存默认开启状态.
二级缓存 SqlSessionFactory级别. 利用同一个工厂,创建的不同的SqlSession 可以实现数据的共享(缓存机制). 二级缓存默认也是开启的.

2.3 一级缓存测试

结论: 利用同一个SqlSession,执行多次数据库操作, 则缓存有效.sql只执行一次.

 @Test
    public void testCache(){
    
    
        SqlSession sqlSession = sqlSessionFactory.openSession();
        EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);
        List<Emp> list1 = empMapper.getAll();
        List<Emp> list2 = empMapper.getAll();
        List<Emp> list3 = empMapper.getAll();
        sqlSession.close();
    }

2.4 二级缓存测试

2.4.1 指定使用二级缓存

语法: 在各自的xml 映射文件中 指定缓存标签.
在这里插入图片描述

2.4.2 二级缓存测试

注意事项: sqlSession关闭之后,二级缓存才能生效

 //测试二级缓存
    @Test
    public void testCache2(){
    
    
        SqlSession sqlSession1 = sqlSessionFactory.openSession();
        EmpMapper empMapper = sqlSession1.getMapper(EmpMapper.class);
        List<Emp> list1 = empMapper.getAll();
        sqlSession1.close(); //sqlSession使用之后必须关闭.否则二级缓存不生效.
        //利用同一个SqlSessionFactory 创建不同的SqlSession
        SqlSession sqlSession2 = sqlSessionFactory.openSession();
        EmpMapper empMapper2 = sqlSession2.getMapper(EmpMapper.class);
        List<Emp> list2 = empMapper2.getAll();
        sqlSession2.close();
    }

2.4.3 注意事项

如果需要使用一级/二级缓存,则POJO对象必须实现序列化接口. 否则数据不可以被缓存.
在这里插入图片描述图解序列化规则:
在这里插入图片描述

3. SpringBoot整合Mybatis

3.1 创建项目

在这里插入图片描述

3.2 修改pom.xml文件

说明: 在新项目中添加依赖信息

 <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <!--引入插件lombok 自动的set/get/构造方法插件  -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

        <!--mybatis依赖包-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.0</version>
        </dependency>

        <!--jdbc依赖包-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

    </dependencies>

3.3 代码结构

在这里插入图片描述

3.4 SpringBoot整合Mybatis

3.4.1 编辑application.yml

#配置端口号
server:
  port: 8090

#管理数据源
spring:
  datasource:
    #高版本驱动使用
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/jt?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
    #设定用户名和密码
    username: root
    password: root

#SpringBoot整合Mybatis
mybatis:
  #指定别名包
  type-aliases-package: com.jt.pojo
  #扫描指定路径下的映射文件
  mapper-locations: classpath:/mybatis/mappers/*.xml
  #开启驼峰映射
  configuration:
    map-underscore-to-camel-case: true

3.4.2 将Mapper接口交给容器管理

  1. 通过@Mapper注解 管理对象
@Mapper //将Mapper接口交给Spring容器管理.
public interface UserMapper {
    
    

    List<User> findAll();
}
  1. 通过包扫描的方式,管理mapper接口 编辑主启动类, 指定包扫描路径
@SpringBootApplication
//按照指定的包路径,扫描mapper的接口管理对象
@MapperScan("com.jt.mapper")
public class SpringbootSsmApplication {
    
    

    public static void main(String[] args) {
    
    
        SpringApplication.run(SpringbootSsmApplication.class, args);
    }
}

3.4.3 Mybatis 单元测试案例

@SpringBootTest
class SpringbootSsmApplicationTests {
    
    

    @Autowired  //注入指定的对象
    private UserMapper userMapper; //IDEA 编译提示 不影响执行

    /**
     * 测试SpringBoot整合Mybatis
     */
    @Test
    public void testfindAll(){
    
    
        List<User> userList = userMapper.findAll();
        System.out.println(userList);
    }
}

3.5 关于Mapper接口对象的说明

在这里插入图片描述
解释:

  1. 将接口交给Spring容器管理,spring会根据class类型,动态的选择创建代理对象. 最终将代理对象交给spring容器管理.
    在这里插入图片描述
  2. 代理对象的使用
    在这里插入图片描述

3.5.1 代理方式介绍

3.5.1.1 JDK动态代理

特点:

  1. 要求被代理者,必须有接口.
  2. 默认条件下如果有接口,则使用JDK动态代理

6.5.1.2 CGLIB动态代理

特点:

  1. 不管被代理者是否有接口,都可以为其创建代理对象.
  2. 代理对象是目标对象的子类. 继承关系.

结论:

  1. Spring中如果有接口,默认使用JDK代理方式,如果没有接口,则默认使用CGLIB代理方式.
  2. Spring5以后,自身接口对象创建代理对象时,使用cglib

3.6 SSM框架案例

3.6.1 业务需求

用户访问URL: http://localhost:8090/findAll
返回值: List 的JSON串.

3.6.2 框架关系图

在这里插入图片描述

3.6.3 层级代码实现

在这里插入图片描述

3.6.4 编辑UserController

@RestController  //@ResponseBody 将list集合转化为json
public class UserController {
    
    

    @Autowired
    private UserService userService;

    /**
     * URL: http://localhost:8090/findAll
     * 参数: 无
     * 返回值: List<User>
     */
    @RequestMapping("/findAll")
    public List<User> findAll(){
    
    

        return userService.findAll();
    }
}

3.6.5 编辑UserService

@Service
public class UserServiceImpl implements UserService{
    
    

    @Autowired
    private UserMapper userMapper;


    @Override
    public List<User> findAll() {
    
    

        return userMapper.findAll();
    }
}

3.6.5 编辑UserService

@Service
public class UserServiceImpl implements UserService{
    
    

    @Autowired
    private UserMapper userMapper;


    @Override
    public List<User> findAll() {
    
    

        return userMapper.findAll();
    }
}

3.6.6 编辑UserMapper

mapper接口

public interface UserMapper {
    
    

    List<User> findAll();
}

mapper映射文件

<mapper namespace="com.jt.mapper.UserMapper">

    <!--必须配置别名包-->
    <select id="findAll" resultType="User">
        select * from demo_user
    </select>
</mapper>

3.6.7 页面效果展现

在这里插入图片描述

4. 框架代码案例练习

4.1 根据ID查询数据

4.1.1 需求说明

根据Id查询数据库
URL: http://localhost:8090/findUserById?id=1
返回值: User对象

4.1.2 编辑UserController

 /**
     * 需求: http://localhost:8090/findUserById?id=1
     * 参数接收: id=1
     * 返回值: User对象
     */
    @RequestMapping("/findUserById")
    public User findUserById(Integer id){
    
    

        return userService.findUserById(id);
    }

4.1.3 编辑UserService

 @Override
    public User findUserById(Integer id) {
    
    

        return userMapper.findUserById(id);
    }

4.1.4 编辑UserMapper

  //注解和映射文件只能二选一
    @Select("select * from demo_user where id = #{id}")
    User findUserById(Integer id);

4.1.5 页面效果展现

在这里插入图片描述

4.2 根据age和sex查询数据

4.2.1 业务需求

URL: http://localhost:8090/findUserByAS
返回值: List集合封装.

4.2.2 编辑UserController

 /**
     * URL地址: http://localhost:8090/findUserByAS?age=18&sex=女
     * 参数:  age=18  sex=女
     * 返回值: List<集合>
     * 参数接收: 如果是多个参数,并且参数名称与属性名称一致,可以使用对象接收
     */
    @RequestMapping("/findUserByAS")
        public List<User> findUserByAS(User user){
    
    

            return userService.findUserByAS(user);
    }

4.2.3 编辑UserService

@Override
    public List<User> findUserByAS(User user) {
    
    

        return userMapper.findUserByAS(user);
    }

4.2.4 编辑UserMapper

在这里插入图片描述## 4.3 RestFul参数传递

4.3.1 业务需求

说明: 要求按照id修改数据
restFul请求路径: http://localhost:8090/updateById/1/黑熊精/3000/男

4.3.2 编辑UserController

/**
     * URL:  http://localhost:8090/updateById/1/黑熊精/3000/男
     * 参数: 4个
     * 返回值: "修改成功!!!!"
     * restFul结构 参数分析 {属性名称}
     * 参数接收:
     *      1. 单个参数使用 @PathVariable Integer id接收
     *      2. 如果多个参数接收 使用对象 mvc自动提供的功能.
     */
    @RequestMapping("/updateById/{id}/{name}/{age}/{sex}")
    public String updateById(User user){
    
    

        userService.updateById(user);
        return "用户修改成功";
    }

4.3.2 编辑UserService

 //spring整合mybatis之后,事务自动提交.
    @Override
    public void updateById(User user) {
    
    

        userMapper.updateById(user);
    }

4.3.2 编辑UserMapper

@Update("update demo_user set name=#{name},age=#{age},sex =#{sex} where id=#{id}")
    void updateById(User user);

猜你喜欢

转载自blog.csdn.net/weixin_43770110/article/details/121107985