【SSM框架】Mybatis详解07(源码自取)之动态代理的实现

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: ✨前言上一篇节我们复习了对象分析,注册别名,设置日志输出本篇节我们将复习在框架中动态代理的实现和我一起复习下去你可以获得一个比较完美框架demo,并且深刻体会框架。坚持到最后的源码解析你会收获更多哦,加油坚持!!!

文章目录


·        


动态代理存在的意义


在三层架构中,业务逻辑层要通过接口访问数据访问层的功能.我们只能访问什么功能就要手动创建什么功能的实现类。
那么动态代理就可以实现自动创建所需要的类对象.


动态代理的实现规范


在框架中实现动态代理需要遵循7个规范,框架才会自动接管。
1)UsersMapper.xml
文件与UsersMapper.java的接口必须同一个目录下.
2)UsersMapper.xml
文件与UsersMapper.java的接口的文件名必须一致,后缀不管.
3)UserMapper.xml
文件中标签的id值与与UserMapper.java的接口中方法的名称完全一致.
4)UserMapper.xml
文件中标签的parameterType属性值与与UserMapper.java的接口中方法的参数类型完全一致.
5)UserMapper.xml
文件中标签的resultType值与与UserMapper.java的接口中方法的返回值类型完全一致.
6)UserMapper.xml
文件中namespace属性必须是接口的完全限定名称com.bjpowernode.mapper.UsersMapper
7)
SqlMapConfig.xml文件中注册mapper文件时,使用class=接口的完全限定名称com.bjpowernode.mapper.UsersMapper.

动态代理实现的步骤

下面就利用一个例子实现动态代理的具体步骤:


1)建表Users


下面提供sql代码,可以直接导入哦,如果是跟着之前的过程直接导入就好,如果不是需要自己实例化数据库ssm

use ssm;
-- ----------------------------
-- Table structure for `users`
-- ----------------------------
DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(32) COMMENT '用户名称',
  `birthday` date DEFAULT NULL COMMENT '生日',
  `sex` char(2) DEFAULT NULL COMMENT '性别',
  `address` varchar(256) DEFAULT NULL COMMENT '地址',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `users` VALUES (1, '王五', '2000-09-10', '2', '安徽');
INSERT INTO `users` VALUES (2, '张三', '2001-07-12', '1', '北京市');
INSERT INTO `users` VALUES (3, '张小明', '1999-02-22', '1', '河南');
INSERT INTO `users` VALUES (4, '陈小亮', '2002-11-19', '1', '辽宁');
INSERT INTO `users` VALUES (5, '张三丰', '2001-03-10', '1', '上海市');
INSERT INTO `users` VALUES (6, '陈小明', '2002-01-19', '1', '重庆市');
INSERT INTO `users` VALUES (7, '王五四', '2001-05-13', '2', '天津市');
select * from users;

2)新建maven工程,刷新可视化

刷新可视化,显示存在users就表示数据库创建成功

新建maven工程,这里就不在显示创建过程了,如果有需要请查找 mybatis框架详解04

3)修改目录

这里就不再显示修改目录过程了,如果有需要请查找 mybatis框架详解04

4)修改pom.xml文件,添加依赖

这里并没有添加新的依赖哦,具体解释请查找 mybatis框架详解04

<dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.6</version>
    </dependency>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.15</version>
    </dependency>
  </dependencies>
  <build>
    <resources>
      <resource>
        <directory>src/main/java</directory>
        <includes>
          <include>**/*.xml</include>
          <include>**/*.properties</include>
        </includes>
      </resource>
      <resource>
        <directory>src/main/resources</directory>
        <includes>
          <include>**/*.xml</include>
          <include>**/*.properties</include>
        </includes>
      </resource>
    </resources>
  </build>

5)添加jdbc.propertis文件到resources目录下

jdbc.driverclassName=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssm?useUnicode=true&characterEncoding=utf8
jdbc.username=root
jdbc.password=********

6)添加SqlMapConfig.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>
<!--   读取属性文件(jdbc.properties)
    属性:
        resources:从resouces目录下找指定名称的文件加载
        url:使用绝对路径加载属性文件
-->
<properties resource="jdbc.properties"></properties>
<!--    设置日志输出-->
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>
<!--注册实体类-->
    <typeAliases>
        <package name="com.longlong.pojo"/>
    </typeAliases>
    <!--    配置数据库的环境变量(数据库链接配置)
        default:使用下面的environment标签下的id属性进行指定配置
-->
    <!--    <settings>-->
    <!--        <setting name="" value=""/>-->
    <!--    </settings>-->
<environments default="development">
<!--    开发时再公司使用的数据库配置
        id;就是提供给environment的default属性使用
        -->
    <environment id="development">
<!--        配置事务管理器
            type:指定事务管理的方式
                JDBC:事务的控制交给管理员来处理
                MANAGED:由容器(Spring)来管理事务
-->
        <transactionManager type="JDBC"></transactionManager>
<!--        配置数据源:
            type:指定不同的配置方式
                JNDI:java命名目录接口,在服务器端进行数据库连接池的管理
                POOLED:使用数据库连接池
                UNPOOLED:不使用数据库连接池
-->
        <dataSource type="POOLED">
<!--      配置数据库连接的基本参数
            private String driver;
            private String url;
            private String username;
            private String password;
-->
            <property name="driver" value="${jdbc.driverclassName}"/>
            <property name="url" value="${jdbc.url}"/>
            <property name="username" value="${jdbc.username}"/>
            <property name="password" value="${jdbc.password}"/>
        </dataSource>
    </environment>
<!--在家时候数据库配置-->
<!--    <environment id="home">-->
<!--        <transactionManager type=""></transactionManager>-->
<!--        <dataSource type=""></dataSource>-->
<!--    </environment>-->
<!--&lt;!&ndash;上线的数据库配置&ndash;&gt;-->
<!--    <environment id="online">-->
<!--        <transactionManager type=""></transactionManager>-->
<!--        <dataSource type=""></dataSource>-->
<!--    </environment>-->
</environments>
<!--    注册mappe.xml文件
        resouces:从resouces目录下找指定名称的文件注册
        url:使用绝对路径注册
        class:动态代理方式下的注册
-->
    <mappers>
<!--        <mapper class="com.longlong.mapper.UserMapper"></mapper>-->
        <package name="com.longlong.mapper"/>
    </mappers>
</configuration>

需要注意的是:在注册mapper的时候一定要选择类注册,或者包批量注册,否则无法检测到哦,包批量注册默认名称为首字母小写的驼峰命名法的类名


7)添加实体类


实体类,最好按照数据库的类名写哦,可以自动识别并且装配。当然不一样也是可以的,后续介绍哦

package com.longlong.pojo;
import java.util.Date;
/**
 * @Author DELL longlong
 * @Date 2022/7/3 15:59
 * @Version 1.0
 * @Function users实体类
 */
public class Users {
    private Integer id;
    private String userName;
    private Date birthday;
    private String sex;
    private String address;
    public Users(Integer id, String userName, Date birthday, String sex, String address) {
        this.id = id;
        this.userName = userName;
        this.birthday = birthday;
        this.sex = sex;
        this.address = address;
    }
    public Users(String userName, Date birthday, String sex, String address) {
        this.userName = userName;
        this.birthday = birthday;
        this.sex = sex;
        this.address = address;
    }
    public Users() {
    }
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", userName='" + userName + '\'' +
                ", birthday=" + birthday +
                ", sex='" + sex + '\'' +
                ", address='" + address + '\'' +
                '}';
    }
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public Date getBirthday() {
        return birthday;
    }
    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
}

8)添加mapper文件夹,新建UserMapper接口


重点来了,Usermapper文件和UserMapper接口一定要放在同级目录下,大家看到名字和文件位置都非常的像,就是为了方便框架可以把他们两个更好的对应起来。



package com.longlong.mapper;
import com.longlong.pojo.Users;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
 * @Author DELL longlong
 * @Date 2022-08-05 16:26
 * @Version 1.0
 * @Function 数据访问层的接口,规定的数据库中可进行的各种操作
 */
public interface UserMapper {
    //查询全部用户信息
    List<Users> getAll();
}

9)在mapper文件夹下,新建UsersMapper.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.longlong.mapper.UserMapper">
   <!--    //查询全部用户信息-->
<!--    List<Users> getAll();-->
    <select id="getAll" resultType="users">
        select <include refid="allColumns"></include>
        from users
    </select>

10)添加测试类,测试功能


package com.longlong.test;
import com.longlong.mapper.UserMapper;
import com.longlong.pojo.Users;
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 org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.List;
import java.util.UUID;
/**
 * @Author DELL longlong
 * @Date 2022/7/3 19:32
 * @Version 1.0
 * @Function 测试类
 */
public class Mytest {
   SqlSession sqlSession;
   //动态代理的对象
   UserMapper userMapper;
   //日期格式化刷子
   SimpleDateFormat sf =  new SimpleDateFormat("yyyy-MM-dd");
   @Before
    public void openSqlSession() throws IOException {
       //1.读取核心配置文件按
       InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
       //2.创建工厂对象
       SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
       //3.取出sqlsession
       sqlSession = factory.openSession();
      //取出动态代理的对象,完成接口中方法的调用,实则是调用xml文件中相应的标签功能
      userMapper = sqlSession.getMapper(UserMapper.class);
   }
   @After
    public void closeSqlSession(){
       sqlSession.close();
   }
   @Test
    public void testGetAll(){
       System.out.println(userMapper);
       List<Users> list = userMapper.getAll();
       list.forEach(users -> System.out.println(users));
   }

结果演示



✨总结


今天我们加入了动态代理,由于篇幅问题过的代码没有放入到文章里面,有需要请到仓库自取。小编会及时更新仓库。

本次源码放在代码仓库gitee,自取链接





相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
22小时前
|
Java
SSM框架整合
SSM框架整合
16 3
|
22小时前
ssm(Spring+Spring mvc+mybatis)——updateDept.jsp
ssm(Spring+Spring mvc+mybatis)——updateDept.jsp
11 0
|
22小时前
ssm(Spring+Spring mvc+mybatis)——showDept.jsp
ssm(Spring+Spring mvc+mybatis)——showDept.jsp
10 0
|
22小时前
|
机器学习/深度学习 编解码 数据可视化
Mamba入局遥感图像分割 | Samba: 首个基于SSM的遥感高分图像语义分割框架
Mamba入局遥感图像分割 | Samba: 首个基于SSM的遥感高分图像语义分割框架
9 3
|
22小时前
|
JavaScript 小程序 Java
基于SSM框架的购物商城系统设计与实现
基于SSM框架的购物商城系统设计与实现
24 2
|
22小时前
|
SQL Java 数据库连接
一文细说Mybatis八大核心源码
以上 是V哥给大家整理的8大核心组件的全部内容,为什么说选择 Java 就是选择未来,真正爱 Java 的人,一定喜欢深入研究,学习源码只是第一步,要有一杆子捅到操作系统才够刺激。
|
22小时前
|
SQL 缓存 Java
|
22小时前
|
XML Java 数据库连接
探秘MyBatis:手写Mapper代理的源码解析与实现
探秘MyBatis:手写Mapper代理的源码解析与实现
21 1
|
22小时前
|
SQL Java 数据库连接
深入源码:解密MyBatis数据源设计的精妙机制
深入源码:解密MyBatis数据源设计的精妙机制
33 1
深入源码:解密MyBatis数据源设计的精妙机制
|
22小时前
|
Java
SSM框架实现分页功能,没有用thymeleaf
SSM框架实现分页功能,没有用thymeleaf