【MyBatis篇】MyBatis动态代理总结

news2025/1/11 4:06:24

本人正在浅学mybatis,正学到mybatis动态代理,在查询多方资料之后做出以下总结,以便于系统学习时回顾;

目录

MyBatis为什么引入动态代理

mybatis的动态代理

 Dao代理技术


MyBatis为什么引入动态代理

因为程序员的  懒,为了节省代码的书写量,将书写复杂,没有一点子营养的机械代码交给java内置工具去写,下面使用案例解释;

一个完整的项目应该直接或间接拥有以下结构:

我们可以了解到里面有一个dao层的接口,还有dao层的实现dao.impl,之所以写这个接口,是因为在规范的实际开发中,写dao层的接口是编程规范,是必须写的。我们前期学习的时候会感觉dao层接口是没有实际作用的,也就是可以没有 ,但是实际开发中必不可少;下面是我前期的dao层代码;

编写AccountDao接⼝,以及AccountDaoImpl实现类

public interface AccountDao {
 /**
 * 根据账号获取账户信息
 * @param actno 账号
 * @return 账户信息
 */
 Account selectByActno(String actno);
 /**
 * 更新账户信息
 * @param act 账户信息
 * @return 1表示更新成功,其他值表示失败
 */
 int update(Account act);
}
package com.powernode.bank.dao.impl;
import com.powernode.bank.dao.AccountDao;
import com.powernode.bank.pojo.Account;
import com.powernode.bank.utils.SqlSessionUtil;
import org.apache.ibatis.session.SqlSession;
public class AccountDaoImpl implements AccountDao {
 @Override
 public Account selectByActno(String actno) {
 SqlSession sqlSession = SqlSessionUtil.openSession();
 Account act = (Account)sqlSession.selectOne("selectByActno", actno
);
 sqlSession.close();
 return act;
 }
 @Override
 public int update(Account act) {
 SqlSession sqlSession = SqlSessionUtil.openSession();
 int count = sqlSession.update("update", act);
 sqlSession.commit();
 sqlSession.close();
 return count;
 }
}

与之对应的sql映射文件,也就是mapper.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="account">
 <select id="selectByActno" resultType="com.powernode.bank.pojo.Accoun
t">
 select * from t_act where actno = #{actno}
 </select>
 <update id="update">
 update t_act set balance = #{balance} where actno = #{actno}
 </update>
</mapper>

实际应用dao层以及dao的实现类:

public class AccountServiceImpl implements AccountService {
 private AccountDao accountDao = new AccountDaoImpl();
 @Override
 public void transfer(String fromActno, String toActno, double money) t
hrows MoneyNotEnoughException, AppException {
 // 查询转出账户的余额
 Account fromAct = accountDao.selectByActno(fromActno);
 if (fromAct.getBalance() < money) {
 throw new MoneyNotEnoughException("对不起,您的余额不⾜。");
 }
 try {
 // 程序如果执⾏到这⾥说明余额充⾜
 // 修改账户余额
 Account toAct = accountDao.selectByActno(toActno);
 fromAct.setBalance(fromAct.getBalance() - money);
 toAct.setBalance(toAct.getBalance() + money);
 // 更新数据库
 accountDao.update(fromAct);
 accountDao.update(toAct);
 } catch (Exception e) {
 throw new AppException("转账失败,未知原因!");
 }
 }
}

以上就是一个雏形的mybatis项目中的dao层的使用与代码书写; 

上面的案例演示中只涵盖了一张表,然而当我们的项目中包含了很多张表,每一张表都对应一个mapper.xml文件,那就会需要多个dao层的接口,那我们是不是要写很多的实现类呢???数量到达千万级,岂不是要做很多重复的代码,枯燥无味。

于是前辈们就想能不能使用一个方法,让dao层的某一个接口默认直接和某一个mapper.xml文件相互映射对应;让dao层接口中的每一个方法都完全正确的对应mapper.xml文件中的一个SQL语句,这样我们就可以避免书写dao层的实现类,换句话说:就是让MyBatis框架给我们自动生成dao层接口的实现类。

mybatis的动态代理

上面的想法是可以实现的,称为MyBatis的动态代理。

employeeDao mapper = sqlSession.getMapper(employeeDao.class);

使⽤以上代码的前提是:AccountMapper.xml⽂件中的namespace必须和dao接⼝的全限定名称⼀致, id必须和dao接⼝中⽅法名⼀致。

<mapper namespace="com.node.dao.employeeDao">
    <insert id="insert">
        insert into employee
            (id, name, age, position)
            value
            (#{id},#{name},#{age},#{position});
    </insert>

 dao接口:

public interface employeeDao {
    /**
    *@auther 
    *Description 插入数据
    *@Date 15:08 2023/10/6
    *@param emp
    *@Return int
    **/
    int insert(employee emp);
}

当我们执行下面这条语句时:

employeeDao mapper = sqlSession.getMapper(employeeDao.class);

 MyBatis框架底层是根据你的Dao接口,通过反射技术 在内存中虚拟的创建了dao接口的实现类对象。MyBatis把这个技术叫做  dao 的动态代理,或者是dao的代理技术;

然后我们就可以使用这个Mapper对象,对数据表进行增删改查:

employee employee = mapper.selectById(1);

 Dao代理技术

由MyBatis创建Dao接口的实现类DaoImpl,使用这个框架创建的实现类来代替你自己写的实现类的功能;那么这样就不需要开发人员自己写实现类了;但是框架实际创建的并不是就叫这个名字, 框架创建的实现类的真正名字是  proxy。

使用MyBatis动态代理技术的前提:
AccountMapper.xml⽂件中的namespace必须和dao接⼝的全限定名称⼀致, id必须和dao接中⽅法名⼀致。

在mapper.xml文件中,<mapper>标签有一个namespace属性,这个属性的属性值在整个项目中是惟一的。每一个SQL语句的标签,select,insert,delete等,都有一个id属性值,这个id属性值在这个mapper.xml文件中又是唯一的。这样根据这个字符串地址就能唯一确定一个SQL语句。

按照编码规范,namespace属性值必须是这个mapper.xml文件对应的dao层接口类的全限定路径名称。id属性值必须是这个sql 语句对应的dao层接口类中的方法名。

只有这样,MyBatis才能自动生成dao层接口对应的实现类。才能实现dao层接口的动态代理。

实际应用:

public class proxyTest {
    @Test
    public void test(){
        SqlSession sqlSession = mybatisUtil.getSqlSession();
        employeeDao mapper = sqlSession.getMapper(employeeDao.class);
        employee employee = mapper.selectById(1);
        System.out.println(employee);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1128371.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

访问控制2

文章目录 主要内容一.Role和ClusterRole1.ClusterRole示例&#xff0c;创建一个名为test-clusterrole且仅有创建Pod和deployment的集群角色代码如下&#xff08;示例&#xff09;: 2.YAML文件创建代码如下&#xff08;示例&#xff09;: 3.将udbs用户和Clusterrole进行绑定&…

0基础学习VR全景平台篇第112篇:控制点和遮罩工具 - PTGui Pro教程

上课&#xff01;全体起立~ 大家好&#xff0c;欢迎观看蛙色官方系列全景摄影课程&#xff01; 前情回顾&#xff1a;上节&#xff0c;我们用PTGui拼接了一张全景图&#xff0c;全景编辑器里的各项功能帮助我们进行了初步的检查和编辑。 之后我们需要使用【控制点】和【遮罩…

智慧垃圾站:AI视频智能识别技术助力智慧环保项目,以“智”替人强监管

一、背景分析 建设“技术先进、架构合理、开放智能、安全可靠”的智慧环保平台&#xff0c;整合环境相关的数据&#xff0c;对接已建业务系统&#xff0c;将环境相关数据进行统一管理&#xff0c;结合GIS技术进行监测、监控信息的展现和挖掘分析&#xff0c;实现业务数据的快速…

【AI视野·今日CV 计算机视觉论文速览 第271期】Thu, 19 Oct 2023

AI视野今日CS.CV 计算机视觉论文速览 Thu, 19 Oct 2023 Totally 63 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computer Vision Papers Learning from Rich Semantics and Coarse Locations for Long-tailed Object Detection Authors Lingchen Meng, Xiyang D…

偕行十年,阿里云助力众安保险用科技温暖每一张保单

云布道师 前言&#xff1a;应云而生的众安保险&#xff0c;其 IT 架构都搭建在阿里云上&#xff0c;云服务器 ECS 关键应用上的数据需要保护&#xff0c;需要简单易用、稳定性高的方案&#xff0c;助力保险业务的快速开发和上线。在经过全面充分地沟通评估后&#xff0c;众安保…

凌晨!腾讯云终于发布了2023年度双十一优惠活动!

2023腾讯云双11优惠价格表终于来了&#xff0c;轻量2核2G3M云服务器88元一年、轻量2核4G5M服务器166.6元一年、3年轻量2核2G4M带宽优惠价366.6元、3年轻量2核4G5M配置566.6元&#xff0c;CVM云服务器2核2G配置SA2实例172.3元一年、标准型S5服务器2核2G配置280.8元一年&#xff…

个人微信管理系统都有些什么功能呢?

个人微信管理系统是一项高效的工具&#xff0c;可协助企业有效管理多个微信账号&#xff0c;从而提升工作效率。该系统允许企业在电脑上集中管理所有微信账号&#xff0c;省去了频繁切换设备的繁琐&#xff0c;同时还可以将微信账号分派给员工以进行更高效的微信管理。 来看看微…

融合通信系统在大型运动会中的应用

随着经济社会的发展&#xff0c;大型体育运动会的规模不断扩大&#xff0c;融合通信设备及指挥调度系统的应用逐渐成为不可或缺的一部分。通过融合通信设备的产品保障以及指挥调度系统的技术保障&#xff0c;可以对比赛进行高效、准确和实时的指挥和调度&#xff0c;确保比赛的…

安防视频监控平台EasyCVR新版(V.3.4)平台界面更新2.0

视频监控TSINGSEE青犀视频平台EasyCVR能在复杂的网络环境中&#xff0c;将分散的各类视频资源进行统一汇聚、整合、集中管理&#xff0c;在视频监控播放上&#xff0c;TSINGSEE青犀视频安防监控汇聚平台可支持1、4、9、16个画面窗口播放&#xff0c;可同时播放多路视频流&#…

软考系统架构师知识点集锦一:系统工程与信息系统基础

一、考情分析 二、考点精讲 2.1 软件开发方法 &#xff08;1&#xff09;结构化开发方法 用户至上&#xff0c;自顶向下,逐步分解(求解)&#xff0c;严格区分工作阶段&#xff0c;每阶段有任务与成果&#xff0c;强调系统开发过程的整体性和全局性&#xff0c;系统开发过程工…

自动驾驶的未来展望和挑战

自动驾驶技术是一项引人瞩目的创新&#xff0c;将在未来交通领域产生深远影响。然而&#xff0c;随着技术的不断演进&#xff0c;自动驾驶也面临着一系列挑战和障碍。本文将探讨自动驾驶的未来发展方向、技术面临的挑战&#xff0c;以及自动驾驶对社会和环境的潜在影响。 自动驾…

基于springboot实现车辆充电桩平台管理系统项目【项目源码+论文说明】

基于sprinboot实现车辆充电桩管理平台系统演示 摘要 随着信息化时代的到来&#xff0c;管理系统都趋向于智能化、系统化&#xff0c;车辆充电桩管理系统也不例外&#xff0c;但目前国内仍都使用人工管理&#xff0c;市场规模越来越大&#xff0c;同时信息量也越来越庞大&#…

【算法挨揍日记】day17——1137. 第 N 个泰波那契数、面试题 08.01. 三步问题

1137. 第 N 个泰波那契数 1137. 第 N 个泰波那契数 题目描述&#xff1a; 泰波那契序列 Tn 定义如下&#xff1a; T0 0, T1 1, T2 1, 且在 n > 0 的条件下 Tn3 Tn Tn1 Tn2 给你整数 n&#xff0c;请返回第 n 个泰波那契数 Tn 的值。 解题思路&#xff1a; 本题很…

spark案例分析-搜索引擎日志分析案例

1.业务分析 2.数据截图 3.代码实现&#xff1a; main.py&#xff1a; #cording:utf8 from pyspark import SparkConf, SparkContext from pyspark.storagelevel import StorageLevel from defs import content_jieba, filter_word, append_word, extract_user_and_word from o…

数据结构和算法——图结构

图是一种数据结构&#xff1b; 图 有向图 带权图 邻接矩阵 邻接表相较于邻接矩阵&#xff0c;减少了存储空间&#xff1b; 邻接表 图的深度优先遍历(DFS) 图的广度优先遍历(BFS) 代码&#xff1a; import java.util.ArrayList; import java.util.Arrays; import java.util.L…

【定向征文活动】2023年深圳1024开发者城市聚会活动参会感想征文

深圳1024开发者城市聚会&#xff0c;有奖征文&#xff0c;欢迎大家来参与。 活动介绍 就在2023年10月22日&#xff0c;深圳COC社区与CSDN主办方联合发起了本年度深圳1024开发者城市聚会活动。活动一经发出&#xff0c;收到了小伙伴的热烈反响&#xff0c;一时间报名人数蹭蹭地…

墨西哥专线海运的集装箱尺寸选择

在国际贸易中&#xff0c;海运是一种常见的运输方式&#xff0c;而集装箱作为一种标准化的物流载具&#xff0c;其大小直接影响着货物的装卸和堆垛效率。对于需要通过墨西哥专线海运的客户来说&#xff0c;了解不同尺寸集装箱的优势和适用范围&#xff0c;可以帮助他们更有效地…

Java后端开发——房贷计算器(Ajax版、Json版、等额本息+等额本金)

MVC房贷计算器&#xff08;Ajax版&#xff09; 1.新建一个JavaWeb项目hslcalweb&#xff0c;设置tomcat10。 2.创建房贷计算器JavaBean&#xff1a;HslCalBean.java&#xff0c;增加以下的属性&#xff0c;并生成Getter/Setter方法。 private double total; //贷款额度pr…

Linux安装JumpServer

功能简介在线安装 环境要求&#xff1a;准备一台 2核4G &#xff08;最低&#xff09;且可以访问互联网的 64 位 Linux 主机 以 root 用户执行如下命令一键安装 JumpServer curl -sSL https://resource.fit2cloud.com/jumpserver/jumpserver/releases/latest/download/quick_st…

JAVA毕业设计102—基于Java+Springboot+vue的个人理财管理系统(源码+数据库)

基于JavaSpringbootvue的个人理财管理系统(源码数据库) 一、系统介绍 本系统前后端分离 管理员功能&#xff1a; 登录、注册、添加账单、导出账单、统计分析、个人信息修改、消费对比 二、所用技术 后端技术栈&#xff1a; SpringbootSpringMvcmybatismysql 前端技术栈…