MyBatis进阶-1-面向接口编程

通过 MyBatis 底层自动创建接口实现类,我们可以直接对接口的方法进行编程

若简单的 sql 语句可以使用注解的方式进行,复杂的查询建议使用 xml 文件编写语句

注解使用时直接在接口的方法上加上对应语句的注解即可,而使用 xml 需要在文件中的标签引用到当前接口和里面的方法

Maven 依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>aaa</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.31</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.10</version>
        </dependency>
    </dependencies>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
    </properties>

</project>

持久层的接口设置

public interface BirthdayMapper {

    @Select("select * from t_birthday")
    List<BirthBean> selectAll();
    
    int insert(BirthBean birthBean);//插入字段

    List<BirthBean> selectAge();//查找年龄大于 10 的记录

}

数据库表的实现类 Pojo

package mybatis.Pojo;

public class BirthBean {
    private String name;
    private int age;
    private String birthday;

    public BirthBean() {
    }

    public BirthBean(String name, int age, String birthday) {
        this.name = name;
        this.age = age;
        this.birthday = birthday;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getBirthday() {
        return birthday;
    }

    public void setBirthday(String birthday) {
        this.birthday = birthday;
    }

    @Override
    public String toString() {
        return "BirthBean{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", birthday='" + birthday + '\'' +
                '}';
    }
}

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="mybatis.Mapper.BirthdayMapper">

    <insert id="insert" parameterType="mybatis.Pojo.BirthBean">
        insert into t_birthday values(#{name},#{age},#{birthday})
    </insert>

    <select id="selectAge" resultType="mybatis.Pojo.BirthBean">
        select * from t_birthday where age >= 10
    </select>

</mapper>

数据库表

测试程序

public class Main {
    public static void main(String[] args) throws Exception{
        //面向接口,获取到接口的代理对象
        SqlSessionFactory build = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
        SqlSession sqlSession = build.openSession();
        BirthdayMapper mapper = sqlSession.getMapper(BirthdayMapper.class);
        //增加记录操作
        BirthBean birth = new BirthBean("mybatis进阶",1,"2024-8-22");
        mapper.insert(birth);
        //查询所有记录
        List<BirthBean> birthBeans = mapper.selectAll();
        //查询年龄大于 10 的记录
        List<BirthBean> birthBeans1 = mapper.selectAge();
        sqlSession.commit();
        //打印查询结果
        System.out.println(birthBeans);
        System.out.println("---------------------");
        System.out.println(birthBeans1);
    }
}

执行结果

[BirthBean

{name='曼波', age=12, birthday='2008/11/13'},

BirthBean{name='光头强', age=26, birthday='1999-8-9'},

BirthBean{name='哈基米', age=13, birthday='2007-11-12'},

BirthBean{name='花下的晚风', age=20, birthday='不告诉你'},

BirthBean{name='丘比特', age=520, birthday='1314-5-20'},

BirthBean{name='跳跳虎', age=2, birthday='2022-02-02'},

BirthBean{name='玛卡巴卡', age=1, birthday='2023-09-11'},

BirthBean{name='唔西迪西', age=3, birthday='2021-11-11'},

BirthBean{name='mybatis', age=5, birthday='3-5-10'},

BirthBean{name='mybatis进阶', age=1, birthday='2024-8-22'}

]
---------------------
[BirthBean

{name='曼波', age=12, birthday='2008/11/13'},

BirthBean{name='光头强', age=26, birthday='1999-8-9'},

BirthBean{name='哈基米', age=13, birthday='2007-11-12'},

BirthBean{name='花下的晚风', age=20, birthday='不告诉你'},

BirthBean{name='丘比特', age=520, birthday='1314-5-20'}

]

Process finished with exit code 0

一些小细节:

占位符:
#{} 底层以 ? 的形式传值
${} 底层会直接将传进来的参数拼接到 sql 语句上

在 mybatic-config.xml 文件中
可以利用<typeAlias type="" alias=""/> 标签
将 type 类起 alias 的别名

在 XXXMapper.mxl 文件中
<mapper>标签特有属性:
resource : 从根路径查找资源
ur l : 从绝对路径查找资源
class : 全限定接口名

setting -> File and Code Tmpla... 中可以将常用的配置模版放入其中
------------------------------传参----------------------------------
parameterType 属性,属于 Mapper 标签的属性
指定传参的类型
mybatis 底层会自动识别大多数类型的传参

简单类型: 
直接传参,底层自动识别

Map 集合:
通常传入的 map 集合 key 为字段名,值为字段的值
parameterType="map"
在sql语句中的占位符中,每一个 #{key} 代表一个 key.getValue()  

实体类:
直接传参,底层自动识别
的占位符中,每一个 #{属性名} 代表一个 属性名对应的传参的值

多参数传参:
底层用 Map 管理多个参数
sql中写 #{agr0} #{agr1} 或 #{param1} #{param2} 代表传的是第几个参数
agr从索引 0 开始,param从 1 开始
低版本 #{0} #{1}

Param注解:
在接口类的传参的形参前可以指定多参数传参的 key
起到代替 arg0,agr1 ... 的作用
------------------------------返回值----------------------------------
返回值为一条记录:
在 Mapper 标签中的 resultType 属性中指定 该表对应的 Pojo 类即可
在接口方法中的返回值处写上 Pojo 类

返回值为多条记录:
与一条记录返回时唯一的不同点在于接口中的方法需要返回 List<Pojo> 

返回单条记录且没有对应的 Pojo :
接口中的方法返回 Map<String,Object>
mapper 映射文件 的 mapper 属性 加上 resultType = "map"
String key -> 字段名
Object Value -> 字段值

返回多条记录且没有对应 Pojo :
方法1----
接口中的方法返回 List<Map<String,Object>>
mapper 映射文件 的 mapper 属性 加上 resultType = "map"
方法2----
接口中的方法返回 Map<Long,Map<String,Object>>
接口的方法上使用注解 @MapKey("id") 指定作为 key 的 id 字段 
mapper 映射文件 的 mapper 属性 加上 resultType = "map"

当查询结果的字段名与 Pojo 类的属性名对不上时无法封装:

可以通过给查询结果起别名来解决,单这种方式的复用性不高

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ES6解构赋值详解;全面掌握:JavaScript解构赋值的终极指南

目录 全面掌握&#xff1a;JavaScript解构赋值的终极指南 一、数组解构赋值 1、基本用法 2、跳过元素 3、剩余元素 4、默认值 二、对象解构赋值 1、基本用法 2、变量重命名 3、默认值 4、嵌套解构 三、复杂的嵌套结构解构 四、函数参数解构赋值 1、对象解构作为函…

Jenkins汉化配置详解

Window安装构建神器Jenkins Window安装构建神器Jenkins详细教程-CSDN博客DevOps&#xff0c;CI&#xff0c;CD&#xff0c;自动化简单介绍选择其他需要和Jenkins一起安装的服务&#xff0c;点击Next。https://blog.csdn.net/qq_37237487/article/details/141299623 登录进入J…

【机器学习】CNN的基本架构模块

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 CNN的基本架构模块1. 引言2. 卷积层2.1 基本原理2.2 卷积层的特性2.3 卷积层的超…

SQL,解析 json

Google BigQuery数据库的data表存储了若干多层的Json串&#xff0c;其中一条形如&#xff1a; [{"active":true,"key":"key1","values":[{"active":true,"value":"value1"}]},{"active":tru…

Java巅峰之路---进阶篇---面向对象(二)

Java巅峰之路---进阶篇---面向对象&#xff08;二&#xff09; 多态介绍多态调用成员的特点多态的优势、弊端以及解决方案综合练习 包和final包的介绍使用其他类的规则&#xff08;导包&#xff09;final关键字final的用途常量 权限修饰符和代码块权限修饰符的介绍四个权限修饰…

Halo个人博客Docker部署结合内网穿透为本地站点配置公网地址远程访问

文章目录 前言1. Docker部署Halo1.1 检查Docker版本如果未安装Docker可参考已安装Docker步骤&#xff1a;1.2 在Docker中部署Halo 2. Linux安装Cpolar2.1 打开服务器防火墙2.2 安装cpolar内网穿透 3. 配置Halo个人博客公网地址4. 固定Halo公网地址 前言 本文主要介绍如何在Cen…

C#学习第二节课 ,伤害计算

伤害计算 我一直好奇游戏的伤害计算是怎么计算并输出的,这第二节课利用学过的初级语法,Console.WriteLine,Console.ReadLine(),以及基础变量,int,string 和if 判断 组合,来实现打印一下伤害计算吧! 老规矩 先上结果图 代码区域 namespace hello01 {internal class Program …

望繁信科技荣膺上海市浦东新区博士后创新实践基地称号

近日&#xff0c;上海望繁信科技有限公司&#xff08;简称“望繁信科技”&#xff09;凭借在大数据流程智能领域的卓越表现&#xff0c;成功入选上海市浦东新区博士后创新实践基地。这一荣誉不仅是对望繁信科技创新能力和技术实力的高度认可&#xff0c;也标志着公司在推动产学…

EasyCVR视频汇聚平台构建远程安防监控:5大亮点解析,助力安防无死角

随着科技的飞速发展&#xff0c;远程安防监控系统已经成为现代社会中不可或缺的一部分&#xff0c;无论是在小区、公共场所还是工业领域&#xff0c;安防监控都发挥着至关重要的作用。而EasyCVR作为一款功能强大的视频监控综合管理平台&#xff0c;其在构建远程安防监控系统方面…

Qt 学习第六天:页面布局

如何设计页面&#xff1f; 有个类似沙盒模式的玩法&#xff0c;Qt Widget Designer可以更好的帮助我们设计页面 点击.ui文件进入 右上方可以看到四种常见的布局&#xff1a; 四种布局 &#xff08;一&#xff09;水平布局horizontalLayout&#xff1a;QHBoxLayout H 是 hori…

算法之工程化内容(3)—— Docker常用命令

目录 1. 配置docker镜像加速 2. 创建镜像docker-name 3. 查看正在运行的镜像 4. 拉取镜像 5. 运行镜像 6. 停止/启动指定 id 的容器 7. 删除指定 id 的镜像/容器 8. docker发布和部署 (推荐教程&#xff1a;&#x1f69a; 发布和部署 - Docker 快速入门) 1. 配置docke…

【蓝桥杯集训100题】scratch时间计算 蓝桥杯scratch比赛专项预测编程题 集训模拟练习题第26题

目录 scratch时间计算 一、题目要求 编程实现 二、案例分析 1、角色分析 2、背景分析 3、前期准备 三、解题思路 1、思路分析 2、详细过程 四、程序编写 五、考点分析 六、推荐资料 1、入门基础 2、蓝桥杯比赛 3、考级资料 4、视频课程 5、python资料 scratc…

【网络】UDP和TCP之间的差别和回显服务器

文章目录 UDP 和 TCP 之间的差别有连接/无连接可靠传输/不可靠传输面向字节流/面向数据报全双工/半双工 UDP/TCP API 的使用UDP APIDatagramSocket构造方法方法 DatagramPacket构造方法方法 回显服务器&#xff08;Echo Server&#xff09;1. 接收请求2. 根据请求计算响应3. 将…

AdMob聚合平台

Google Admob产品介绍 Google给开发者提供了3款用于流量变现的产品&#xff0c;分别是AdMob&#xff0c;通过应用内广告帮助App开发者变现&#xff1b;AdSense&#xff0c;通过网站广告帮助所有者变现&#xff1b;Google Ads Manager&#xff0c;通过全面管理和优化广告资源&a…

[ICLR-24] LRM: Large Reconstruction Model for Single Image to 3D

[pdf | proj | code] 本文首次提出大型重建模型&#xff08;Large Reconstruction Model, LRM&#xff09;&#xff0c;实现5s内对单图物体的3D重建。在128张A100&#xff08;40G&#xff09;上训练30 epochs。 LRM包含三个部分&#xff0c;具体框架如下&#xff1a; 图片编码…

亚马逊测评号生存法则:如何抵御亚马逊封号风波?

距离黑五购物狂欢节还剩99天&#xff0c;相信各位商家都在紧锣密鼓的筹备相关事宜&#xff0c;然而&#xff0c;亚马逊的封号风波再次席卷而来。那如何在这场风暴中让亚马逊矩阵测评号安全航行亦或是脱颖而出呢&#xff1f;本文将给你一个答案&#xff0c;并帮助你的亚马逊店铺…

【java计算机毕设】足浴城消费系统小程序MySQL ssm vue uniapp maven项目设计源代码 编程语言 小组课后作业 寒暑假作业

目录 1项目功能 2项目介绍 3项目地址 1项目功能 【java计算机毕设】足浴城消费系统小程序MySQL ssm vue uniapp maven项目设计源代码 编程语言 小组课后作业 寒暑假作业 2项目介绍 系统功能&#xff1a; 足浴城消费系统小程序包括管理员、用户、商家三种角色。 管理员功能&…

Transformer大模型在训练过程中所需的计算量

目录 简介计算需求参数与数据集的权衡计算成本的工程意义内存需求推理模型权重总推理内存训练模型参数优化器状态梯度激活值和批大小总训练内存分布式训练分片优化器3D 并行分片优化器 + 3D 并行参考简介 许多关于Transformer语言模型的基本且重要的信息都可以用相当简单的方式…

C++ 特殊类设计以及单例模式

目录 1 不能被拷贝 2 只能在堆上创建对象 3 只能在栈上创建对象 4 禁止在堆上创建对象 5 不能被继承的类 6 单例类 特殊类就是一些有特殊需求的类。 1 不能被拷贝 要设计一个防拷贝的类&#xff0c;C98之前我们只需要将拷贝构造以及拷贝赋值设为私有&#xff0c;同时只声明…

2024年入职/转行网络安全,该如何规划?_网络安全职业规划

前言 前段时间&#xff0c;知名机构麦可思研究院发布了 《2022年中国本科生就业报告》&#xff0c;其中详细列出近五年的本科绿牌专业&#xff0c;其中&#xff0c;信息安全位列第一。 网络安全前景 对于网络安全的发展与就业前景&#xff0c;想必无需我多言&#xff0c;作为…