mybatis——Mapper代理方式
一、原始DAO开发问题
Dao接口实现类方法中存在大量模板方法,设想能否将这些代码提取出来,大大减轻程序员的工作
量。
调用sqlSession的数据库操作方法需要指定statement的id,这里存在硬编码,不利于开发维护。
调用SqlSession方法时传入的变量,由于SqlSession方法使用泛型,即使变量类型传入错误,在编译阶段也不报错,不利于程序员开发。
注:原始Dao开发和我们Web阶段讲解的Dao开发基本类似,都是有Dao接口和Dao实现类,无非
Web阶段的Dao实现类中通过DBUtils来操作SQL;现在Mybatis的原始Dao开发,把SQL分离出去
了,写在的XML映射文件里面而已。
二、Mapper代理方式
Mapper代理开发方式只需要程序员编写Mapper接口(相当于Dao接口),由MyBatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体同上边Dao接口实现类方法。
程序员编写Mapper接口需要遵循一些开发规范,MyBatis可以自动生成Mapper接口实现类代理对象。
(一)、开发规范
1、Mapper.xml文件中的namespace与mapper接口的类路径相同。
2、Mapper.xml中定义的每个标签的id与Mapper接口方法名相同。
3、Mapper.xml中定义的每个sql的parameterType的类型与Mapper接口方法的参数类型相同。
4、Mapper.xml中定义的每个sql的resultType的类型与Mapper接口方法返回值类型相同。
注:Mapper.xml映射文件最好和Mapper接口名称一致。
环境搭建和之前的一样。
(二)、实体类
package org.example.entity;import java.util.Date;public class Emp {private Integer empno;private String ename;private String job;private Integer mgr;private Date hiredate;private Double sal;private Double comm;private Integer deptno;public Integer getEmpno() {return empno;}public void setEmpno(Integer empno) {this.empno = empno;}public String getEname() {return ename;}public void setEname(String ename) {this.ename = ename;}public String getJob() {return job;}public void setJob(String job) {this.job = job;}public Integer getMgr() {return mgr;}public void setMgr(Integer mgr) {this.mgr = mgr;}public Date getHiredate() {return hiredate;}public void setHiredate(Date hiredate) {this.hiredate = hiredate;}public Double getSal() {return sal;}public void setSal(Double sal) {this.sal = sal;}public Double getComm() {return comm;}public void setComm(Double comm) {this.comm = comm;}public Integer getDeptno() {return deptno;}public void setDeptno(Integer deptno) {this.deptno = deptno;}@Overridepublic String toString() {return "Emp{" +"empno=" + empno +", ename='" + ename + '\'' +", job='" + job + '\'' +", mgr=" + mgr +", hiredate=" + hiredate +", sal=" + sal +", comm=" + comm +", deptno=" + deptno +'}';}
}
(三)、Mapper接口
package org.example.mapper;import org.example.entity.Emp;import java.util.List;
//Mapper接口相当于我们之前写的Dao接口,只是在Mybatis里面我们习惯这么写而已
public interface EmpMapper {List<Emp> select();Emp selectById(Integer empno);void insert(Emp emp);int update(Emp emp);boolean delete(Integer empno);
}
批量查询:方法返回值为List类型,表示SqlSession对象将调用selectList()方法。
单条查询:方法返回值为单个实体对象,表示SqlSession对象将调用selectOne()方法。
增删改:
方法返回值为void,表示SqlSession对象中insert,update,delete方法的返回值不做任何处理。
方法返回值为int类型,表示SqlSession对象中insert,update,delete方法的返回值直接返
回。
方法返回值为boolean类型,表示根据SqlSession对象中的insert,update,delete方法返回
值(影响数据库的条数)判断操作是否成功,如果影响数据库的条数大于0条,表示成功,否
则表示失败。
(四)、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">
<!--namespace:与Mapper接口的全限定名保持一致-->
<mapper namespace="org.example.mapper.EmpMapper"><!--statementId与Mapper接口的方法名称保持一致;parameterType的类型必须与方法的参数类型保持一致;resultType的类型必须与方法的返回值类型保持一致;--><select id="select" resultType="org.example.entity.Emp">select empno,ename,job,mgr,hiredate,sal,comm,deptno from emp</select><select id="selectById" parameterType="java.lang.Integer"resultType="org.example.entity.Emp">select empno,ename,job,hiredate,mgr,sal,comm,deptno from emp whereempno=#{empno}</select><insert id="insert" parameterType="org.example.entity.Emp">insert into emp(ename,job,mgr,hiredate,sal,comm,deptno)values(#{ename},#{job},#{mgr},#{hiredate},#{sal},#{comm},#{deptno})</insert><update id="update" parameterType="org.example.entity.Emp">update emp setename=#{ename},job=#{job},mgr=#{mgr},hiredate=#{hiredate},sal=#{sal},comm=#{comm},deptno=#{deptno}where empno=#{empno}</update><delete id="delete" parameterType="java.lang.Integer">delete from emp where empno=#{empno}</delete>
</mapper>
(五)、utils工具类
package org.example.utils;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;public class MybatisUtil {private MybatisUtil(){}private static SqlSessionFactory sqlSessionFactory;static {//1.创建读取全局配置文件的流try {InputStream is = Resources.getResourceAsStream("mybatis-config.xml");//2、获取SqlSessionFactorysqlSessionFactory = new SqlSessionFactoryBuilder().build(is);} catch (IOException e) {throw new RuntimeException(e);}}public static SqlSession getSession(){sqlSessionFactory.openSession();return sqlSessionFactory.openSession();}}
(六、)、测试
import com.gs.entity.Emp;
import com.gs.mapper.EmpMapper;
import com.gs.util.MybatisUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.util.Date;
import java.util.List;
public class MapperTest {
private SqlSession sqlSession;
private EmpMapper empMapper;
@Before
public void before() {
sqlSession = MybatisUtil.getSession();
//获取Mapper接口的代理对象
empMapper = sqlSession.getMapper(EmpMapper.class);
}
@After
public void after() {
sqlSession.commit();
sqlSession.close();
}
@Test
public void test() {
System.out.println(sqlSession);
System.out.println(empMapper);
}
@Test
public void testSelect() {
List<Emp> list = empMapper.select();
for (Emp emp : list) {
System.out.println(emp);
}
}
@Test
public void testSelectById() {
Emp emp = empMapper.selectById(7938);
System.out.println(emp);
}
@Test
public void testInsert() {
Emp emp = new Emp();
emp.setEname("小明");
emp.setJob("职员");
emp.setSal(4500.0);
emp.setComm(1000.0);
emp.setMgr(1);
emp.setHiredate(new Date());
empMapper.insert(emp);
}
@Test
public void testUpdate() {
Emp emp = new Emp();
emp.setEmpno(7940);
emp.setEname("小李");
emp.setJob("秘书");
emp.setSal(5300.0);
emp.setComm(1300.0);
emp.setMgr(1);
emp.setHiredate(new Date());
int result = empMapper.update(emp);
System.out.println("方法的返回值:" + result);
}
@Test
public void testDelete() {
boolean result = empMapper.delete(7940);
System.out.println("方法的返回值:" + result);
}
}
Mybatis官方推荐使用mapper代理方式开发mapper接口,程序员不用编写mapper接口实现类,使用mapper代理方法时,输入参数可以使用pojo包装对象或map对象,保证dao的通用性。
相关文章:
mybatis——Mapper代理方式
一、原始DAO开发问题 Dao接口实现类方法中存在大量模板方法,设想能否将这些代码提取出来,大大减轻程序员的工作 量。 调用sqlSession的数据库操作方法需要指定statement的id,这里存在硬编码,不利于开发维护。 调用SqlSession方…...
FreeRTOS——消息队列
目录 一、概念及其作用 1.1概念 1.2特点 1.3工作原理 二、相关API 2.1创建队列 2.2任务中写队列 2.3任务中读队列 2.4中断中写队列 2.5中断中读队列 三、实现原理 3.1消息队列控制块 3.2消息队列的创建 3.3消息的发送 3.3.1任务中发送 3.3.2中断中发送 3.4消息的…...
【题解】—— LeetCode一周小结46
🌟欢迎来到 我的博客 —— 探索技术的无限可能! 🌟博客的简介(文章目录) 【题解】—— 每日一道题目栏 上接:【题解】—— LeetCode一周小结45 11.切棍子的最小成本 题目链接:1547. 切棍子的最…...
Java项目实战II基于微信小程序的校运会管理系统(开发文档+数据库+源码)
目录 一、前言 二、技术介绍 三、系统实现 四、核心代码 五、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导 一、前言 在充满活力与激情的校园生活中,校运会不仅是…...
python里的数据结构
列表(List) 定义和特点: 列表是一种有序的可变序列,可包含不同类型的元素,如整数、字符串、列表等。可以通过索引访问和修改元素,索引从 0 开始。代码示例: my_list [1, 2, apple, [4, 5]] pr…...
[Unity Demo]从零开始制作空洞骑士Hollow Knight第二十一集:制作游戏的金钱系统吉欧Geo和初步制作HUD Canvas的额外内容
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、制作游戏的金钱系统吉欧Geo以及HUD Camera 1.制作金钱系统吉欧2.制作吉欧的脚本Geo Counter逻辑处理3.制作HUD Canvas的吉欧的UI4.在敌人的HealthManager.c…...
底层逻辑之:极大似然方法(Maximum Likelihood Estimation, MLE)
简介: 极大似然方法(Maximum Likelihood Estimation, MLE)是一种用于估计统计模型参数的方法。其核心思想是基于观测数据来寻找最可能产生这些数据的模型参数。 早在1821年,德国数学家高斯(C. F. Gauss)就…...
笔记:Centos Nginx Jdk Mysql OpenOffce KkFile Minio安装部署
远程工具 ToDesk Nginx 解压 tar zxvf nginx-1.20.2.tar.gz进入Nginx 文件夹 cd nginx-1.20.2报错解决 ./configure: error: C compiler cc is not found yum -y install gcc gcc-c autoconf automake make./configure: error: the HTTP rewrite module requires the PC…...
【MARL】深入理解多智能体近端策略优化(MAPPO)算法与调参
📢本篇文章是博主强化学习(RL)领域学习时,用于个人学习、研究或者欣赏使用,并基于博主对相关等领域的一些理解而记录的学习摘录和笔记,若有不当和侵权之处,指出后将会立即改正,还望谅…...
深入探索Go语言中的sync.Mutex与sync.RWMutex:原理、应用与实践
深入探索Go语言中的sync.Mutex与sync.RWMutex:原理、应用与实践 在并发编程的世界里,Go语言以其独特的并发模型和简洁的语法赢得了广泛的关注。在Go语言的并发控制工具箱中,sync.Mutex和sync.RWMutex是两个至关重要的工具,它们帮助开发者保护共享资源,避免竞态条件,确保…...
15.postgresql--jsonb 数组进行打平,过滤
用jsonb_array_elements函数先展开数组,再用jsonb_each函数遍历元素中的键值对 例如: SELECT * FROM data_table, LATERAL jsonb_array_elements(json_column) WITH ORDINALITY as elem(element, idx) JOIN LATERAL jsonb_each(elem.element) as kv(ke…...
linux下i2c开发与框架源码分析
目录 1 概述 2 I2c子系统框架 3 I2C的使用流程 3.1 在驱动里使用 3.2 在应用层使用 3.3 I2ctool的使用 4 为硬件i2c注册一个适配器 5 i2c子系统源码流程分析 5.1 i2c device与driver绑定过程 5.1.1 Driver的注册与处理 5.1.2 Client device的生成 5.2 I2c的发送与接…...
[ruby on rails] 安装docker
1. docker安装 ubuntu14.04后自带docker安装包,可以直接安装docker.io sudo apt-get updatesudo apt-get install -y docker.io # 安装后启动sudo service docker start最新版本docker 安装docker-ce # 官方源 curl -fsSL https://download.docker.com/linux/ubun…...
I2C学习
详情学习 12. I2C通讯 — [野火]Linux基础与应用开发实战指南——基于LubanCat-RK系列板卡 文档 (embedfire.com) 问题 i2c总线中scl和sda两条线的作用以及区别 在 I2C 总线(Inter-Integrated Circuit)中,SCL 和 SDA 是两条核心信号线&am…...
VUE:基于MVVN的前端js框架
文章目录 vue框架v-show vue框架 注意是 先写函数名,再写function。 handle:function (){}下面是错误的 function:handle(){}3 v-show 本质上等于号后面还是判断条件,所以不能写赋值语句,下面是正确的 下面是错误的 v-show " ge…...
06、Spring AOP
在我们接下来聊Spring AOP之前我们先了解一下设计模式中的代理模式。 一、代理模式 代理模式是23种设计模式中的一种,它属于结构型设计模式。 对于代理模式的理解: 程序中对象A与对象B无法直接交互,如:有人要找某个公司的老总得先打前台登记传达程序中某个功能需要在原基…...
c语言学习26字符串的应用
字符串在stm32串口中的应用 串口控制流水灯 pc通过串口发送字符串命令控制流水灯 open 流水灯打开 close 流水灯关闭 speed 1~9速度控制 if(strcmp((char *)usart1_rec_buff,"open")0) { led_flag 1; } else if(strcmp((char *)usart1_rec_buff,"close&qu…...
法语旅游常用口语-柯桥学外语到蓝天广场泓畅学校
以下是一些实用的法语旅游常用口语,帮助你在法国旅行时能够进行基本的交流: 问候与道别 Bonjour: 用于日常问候。Au revoir: 用于告别。 请求帮助 S’il vous plat: 用于请求帮助,例如在需要寻找某个地点或服务时。 询问信息 Excusez-moi: 用…...
Kafka 生产者优化与数据处理经验
Kafka:分布式消息系统的核心原理与安装部署-CSDN博客 自定义 Kafka 脚本 kf-use.sh 的解析与功能与应用示例-CSDN博客 Kafka 生产者全面解析:从基础原理到高级实践-CSDN博客 Kafka 生产者优化与数据处理经验-CSDN博客 Kafka 工作流程解析:…...
MySQL 主从复制之多线程复制
一、MySQL 多线程复制的背景 MySQL 的主从复制延迟一直是受开发者最为关注的问题之一,MySQL 从 5.6 版本开始追加了并行复制功能,目的就是为了改善复制延迟问题,并行复制称为enhanced multi-threaded slave(简称MTS)。…...
Windows Defender移除终极指南:如何彻底禁用微软安全组件提升系统性能30%
Windows Defender移除终极指南:如何彻底禁用微软安全组件提升系统性能30% 【免费下载链接】windows-defender-remover A tool which is uses to remove Windows Defender in Windows 8.x, Windows 10 (every version) and Windows 11. 项目地址: https://gitcode.…...
3分钟学会使用elan:告别Lean版本混乱的智能版本管理器
3分钟学会使用elan:告别Lean版本混乱的智能版本管理器 【免费下载链接】elan The Lean version manager 项目地址: https://gitcode.com/gh_mirrors/el/elan 还在为不同Lean项目需要不同版本而头疼吗?elan作为Lean定理证明器的智能版本管理器&…...
Unity预加载:减少游戏中首次加载资源时的卡顿
遇到的问题,如标题所示,所以写了如下模块。模块功能就是初始化时候,加载零散/文件夹的物体,代码如下:#region 启动预加载模块/// <summary> 预加载间隔(分帧防卡顿) </summary>priv…...
CANN 端侧部署实战:模型转换与服务化
CANN 端侧部署实战:模型转换与服务化如何将训练好的模型快速部署到昇腾端侧设备?本文详解模型格式转换、端侧优化与服务化部署的完整流程。—一、端侧部署概述 1.1 端侧部署的挑战 与数据中心训练不同,端侧部署面临独特的约束:算力…...
Autosar Crypto Driver配置避坑指南:从CryptoPrimitive到CryptoKeyType,手把手教你配出安全又高效的加密服务
AUTOSAR Crypto Driver实战配置:从算法选型到密钥管理的安全工程实践 在汽车电子系统开发中,加密服务已成为保障车载通信安全的核心组件。AUTOSAR标准定义的Crypto Driver模块为开发者提供了统一的加密接口,但实际配置过程中,工程…...
你的方差分析做对了吗?避开SPSS中ANOVA的5个经典坑(从数据准备到结果报告)
你的方差分析做对了吗?避开SPSS中ANOVA的5个经典坑(从数据准备到结果报告) 在科研论文和市场调研中,方差分析(ANOVA)是最常用的统计方法之一。许多研究者虽然掌握了SPSS的基本操作,却在结果报告…...
MoE稀疏激活原理与工程实践:解密大模型2%参数调用真相
1. 项目概述:参数规模与稀疏激活的真相拆解“GPT-4 Has 1.8 Trillion Parameters. It Uses 2% of Them Per Token.”——这句话过去两年在技术社区反复刷屏,常被当作“AI算力爆炸”的标志性论断。但作为从2016年就开始跑LSTM、2018年手写Transformer Enc…...
自指系统与算术障碍的跨领域猜想:封闭认知框架下的几何-物理-计算统一理论研究(世毫九实验室原创研究)
自指系统与算术障碍的跨领域猜想:封闭认知框架下的几何-物理-计算统一理论研究(世毫九实验室原创研究) 作者:方见华 单位:世毫九实验室 摘要 本研究提出了一个关于"自指系统与算术障碍的跨领域猜想"的理论框…...
雷达信号体制识别
雷达信号体制识别 摘要 本文档基于工程中的信号识别流水线入口脚本及其所依赖的核心模块,系统梳理该工程如何实现雷达脉冲信号的体制分类(Signal Type Recognition)。该流水线采用“脉冲检测 → 脉冲描述字提取 → 脉内特征分析 → 驻留段分段…...
OpenELB安全配置:RBAC、网络策略与证书管理最佳实践
OpenELB安全配置:RBAC、网络策略与证书管理最佳实践 【免费下载链接】openelb Load Balancer Implementation for Kubernetes in Bare-Metal, Edge, and Virtualization 项目地址: https://gitcode.com/gh_mirrors/op/openelb OpenELB是一款专为Kubernetes设…...
