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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: ✨前言上一篇节我们复习了对象分析,注册别名,设置日志输出本篇节我们将复习在框架中动态代理的实现和我一起复习下去你可以获得一个比较完美框架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,自取链接





相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
4天前
|
前端开发 Java 关系型数据库
基于ssm的考研图书电子商务平台,附源码+数据库+论文
考研图书电子商务平台是一个基于Java的B/S架构系统,适用于Windows环境。该平台设有管理员和用户权限,管理员可管理商品、用户、留言板及订单,用户可管理收货地址、订单、收藏及购买商品。技术框架包括前端Vue+HTML+JavaScript+CSS+LayUI,后端SSM,数据库为MySQL。项目包含17个数据库表,支持Maven构建。提供演示视频和详细文档,支持免费远程调试安装,确保顺利运行。
27 13
基于ssm的考研图书电子商务平台,附源码+数据库+论文
|
2天前
|
小程序 Java 关系型数据库
weixin030英语学习交流平台小程序+ssm(文档+源码)_kaic
本文介绍了英语学习交流平台小程序的开发全过程,包括系统分析、设计与实现。该小程序基于Java的SSM框架进行后端管理开发,使用MySQL作为数据库,并借助微信开发者工具确保系统稳定性。小程序设有管理员和用户两个角色,功能涵盖个人中心、每日打卡、学习计划、论坛交流等,具有操作简单、界面清晰、功能齐全的特点。通过技术可行性、经济可行性和操作可行性分析,证明了系统的实用性和高效性,为英语学习者提供了一个便捷的交流平台。
|
2天前
|
小程序 Java 关系型数据库
weixin025移动学习平台的设计与实现+ssm(文档+源码)_kaic
基于微信小程序的移动学习平台旨在解决传统APP占用过多手机存储空间的问题,提升用户体验。该平台使用微信开发者工具开发前端,SSM框架和Java语言开发后台,并采用MySQL数据库保存数据。系统支持管理员对教师、课程、学生信息进行管理,教师可查看及审核作业,管理课程资源;学生能提交作业、查看审核结果并收藏或评论课程资源。此平台使用户无需安装独立APP即可访问学习内容,极大提升了便捷性和管理效率。 关键词:基于微信小程序的移动学习平台;微信开发者工具;SSM框架
|
2天前
|
安全 小程序 Java
weixin027校园二手平台的设计与实现+ssm(文档+源码)_kaic
本项目基于微信小程序开发校园二手交易平台,旨在解决大学生闲置物品交易问题。系统采用Java语言和MySQL数据库设计,支持用户浏览、收藏、评价商品及发布闲置物品。管理员可审核商品和用户信息,确保交易安全。系统具备在线搜索功能,方便用户查找商品,并提供实时沟通渠道,增强平台透明度和用户体验。该平台简化了二手交易流程,满足了大学生对便捷、高效交易的需求,具有重要的实际应用价值。
|
2天前
|
前端开发 Java 关系型数据库
基于ssm的社区物业管理系统,附源码+数据库+论文+任务书
社区物业管理系统采用B/S架构,基于Java语言开发,使用MySQL数据库。系统涵盖个人中心、用户管理、楼盘管理、收费管理、停车登记、报修与投诉管理等功能模块,方便管理员及用户操作。前端采用Vue、HTML、JavaScript等技术,后端使用SSM框架。系统支持远程安装调试,确保顺利运行。提供演示视频和详细文档截图,帮助用户快速上手。
31 17
|
5天前
|
前端开发 Java 关系型数据库
基于ssm的超市会员(积分)管理系统,附源码+数据库+论文,包安装调试
本项目为简单内容浏览和信息处理系统,具备管理员和员工权限。管理员可管理会员、员工、商品及积分记录,员工则负责积分、商品信息和兑换管理。技术框架采用Java编程语言,B/S架构,前端使用Vue+JSP+JavaScript+Css+LayUI,后端为SSM框架,数据库为MySQL。运行环境为Windows,JDK8+Tomcat8.5,非前后端分离的Maven项目。提供演示视频和详细文档,购买后支持免费远程安装调试。
55 19
|
2天前
|
前端开发 Java 关系型数据库
基于ssm的培训学校教学管理平台,附源码+数据库+论文
金旗帜文化培训学校网站项目包含管理员、教师和用户三种角色,各角色功能通过用例图展示。技术框架采用Java语言,B/S架构,前端为Vue+HTML+CSS+LayUI,后端为SSM,数据库为MySQL,运行环境为JDK8+Tomcat8.5。项目含12张数据库表,非前后端分离,支持演示视频与截图查看。购买后提供免费安装调试服务,确保顺利运行。
24 14
|
6天前
|
前端开发 JavaScript Java
[Java计算机毕设]基于ssm的OA办公管理系统的设计与实现,附源码+数据库+论文+开题,包安装调试
OA办公管理系统是一款基于Java和SSM框架开发的B/S架构应用,适用于Windows系统。项目包含管理员、项目管理人员和普通用户三种角色,分别负责系统管理、请假审批、图书借阅等日常办公事务。系统使用Vue、HTML、JavaScript、CSS和LayUI构建前端,后端采用SSM框架,数据库为MySQL,共24张表。提供完整演示视频和详细文档截图,支持远程安装调试,确保顺利运行。
48 17
|
7天前
|
存储 Java 关系型数据库
ssm151大学生就业信息管理系统+jsp(文档+源码)_kaic
大学生就业信息管理系统基于现代经济快速发展和信息化技术的升级,旨在通过软件工具提升数据管理效率。该系统利用SSM框架、Java语言和Mysql数据库开发,实现数据的科学化、规范化与自动化管理。系统界面简洁美观,功能模块布局合理,提供高效的数据处理能力,并注重数据安全。通过此系统,管理者能够快速处理大量信息,提高工作效率,同时确保数据的安全性和可靠性。关键词:大学生就业信息管理系统;SSM框架;Mysql;自动化。
|
4天前
|
前端开发 Java 关系型数据库
基于ssm的网络直播带货管理系统,附源码+数据库+论文
该项目为网络直播带货网站,包含管理员和用户两个角色。管理员可进行主页、个人中心、用户管理、商品分类与信息管理、系统及订单管理;用户可浏览主页、管理个人中心、收藏和订单。系统基于Java开发,采用B/S架构,前端使用Vue、JSP等技术,后端为SSM框架,数据库为MySQL。项目运行环境为Windows,支持JDK8、Tomcat8.5。提供演示视频和详细文档截图。
42 10