【Spring集成MyBatis】MyBatis的Dao层实现(基于配置,非注解开发)

文章目录

  • 1. MyBatis的dao层实现(传统方式)——需要写接口及其实现类
  • 2. MyBatis的代理开发方式——仅需写接口

1. MyBatis的dao层实现(传统方式)——需要写接口及其实现类

传统方式就是在项目下边建立dao包,里面包含接口及其实现类,文件结构如下:
在这里插入图片描述
UserMapper.java

package com.example.demo.dao;

import com.example.demo.domain.User;

import java.io.IOException;
import java.util.List;

public interface UserMapper {
    List<User> findAll() throws IOException;
}

UserMapperImpl.java

package com.example.demo.dao.impl;

import com.example.demo.dao.UserMapper;
import com.example.demo.domain.User;
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;
import java.util.List;

public class UserMapperImpl implements UserMapper {
    @Override
    public List<User> findAll() throws IOException {
        InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();

        List<User> userList = sqlSession.selectList("userMapper.findAll");

        sqlSession.close();

        return userList;
    }
}

测试其实现:

package com.example.demo.service;

import com.example.demo.dao.UserMapper;
import com.example.demo.domain.User;

import java.io.IOException;
import java.util.List;

public class ServiceDemo {

    public static void main(String[] args) throws IOException {
//        创建dao层对象,目前dao层是手动编写的
        UserMapper userMapper = new UserMapperImpl();
        List<User> all = userMapper.findAll();

        System.out.println(all);
    }
}

其实这里边就是用MyBatis提供的API调用MyBatis配置,这个内容在刚开始学MyBatis的时候有提到过:【Spring集成MyBatis】MyBatis诞生及代码快速入门(非注解开发)

2. MyBatis的代理开发方式——仅需写接口

在上面的代码中,其实很多代码都是重复的,比如获取sqlSession的代码:

InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();

而sql语句的代码又是半重复的,只有括号里面的内容会发生变化:

List<User> userList = sqlSession.selectList("userMapper.findAll");

在这里介绍MyBatis的代理开发方式,其需要遵循一定的规范
在这里插入图片描述
即如下的对应部分应该相同:
在这里插入图片描述
使用以上介绍的开发方式,我们就不需要再写接口的实现类了,只需要让接口与XML文件中的定义对应即可。
此时,我的XML文件和接口分别为:
UserMapper.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.example.demo.dao.UserMapper">
    <select id="findAll" resultType="user">
        select * from user
    </select>
</mapper>

UserMapper.java

package com.example.demo.dao;

import com.example.demo.domain.User;

import java.io.IOException;
import java.util.List;

public interface UserMapper {
    List<User> findAll() throws IOException;
}

测试的时候,只需要通过sqlSession.getMapper()来获得对应类的实现配置即可

package com.example.demo.service;

import com.example.demo.dao.UserMapper;
import com.example.demo.domain.User;
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;
import java.util.List;

public class ServiceDemo {

    public static void main(String[] args) throws IOException {
        InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();

        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        List<User> userList = userMapper.findAll();
        System.out.println(userList);
    }
}

假如带参数查询,操作也是类似的,在XML文件中加上:
<select id="findById" parameterType="int" resultType="user">
    select * from user where id=#{id}
</select>

接口中加上:

User findById(int id);

实现时调用:

User user = userMapper.findById(1);

即可获得对应的user结果

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

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

相关文章

3D人脸扫描设备助力企业家数字人复刻,打破商业边界

京都薇薇推出数字人VN&#xff0c;以京都薇薇董事长为原型制作&#xff0c;赋能品牌直播、短片宣传、线上面诊等活动&#xff0c;进一步增强消费者对品牌的交互体验&#xff0c;把元宇宙与品牌相融合&#xff0c;推动品牌线上服务与线下服务实现数字一体化&#xff0c;打造一个…

Linux宝塔面板搭建Discuz论坛, 并内网穿透实现公网访问

Linux宝塔面板搭建Discuz论坛&#xff0c; 并内网穿透实现公网访问 文章目录 Linux宝塔面板搭建Discuz论坛&#xff0c; 并内网穿透实现公网访问前言1.安装基础环境2.一键部署Discuz3.安装cpolar工具4.配置域名访问Discuz5.固定域名公网地址6.配置Discuz论坛 &#x1f4f7; 江池…

基于C#实现线段树

一、线段树 线段树又称"区间树”&#xff0c;在每个节点上保存一个区间&#xff0c;当然区间的划分采用折半的思想&#xff0c;叶子节点只保存一个值&#xff0c;也叫单元节点&#xff0c;所以最终的构造就是一个平衡的二叉树&#xff0c;拥有 CURD 的 O(lgN)的时间。 从…

XC3320 离线式、无电感交流输入线性稳压器 可替代KP3310 固定5V输出电压

XC3320 是一款紧凑型无电感设计的离线式线性稳压器。XC3320 可获得 5V输出电压。XC3320 是一种简单可靠的获得偏置供电的离线式电源解决方案。XC3320 集成了 650V 功率 MOSFET&#xff0c;启动控制电路,VDD 电压控制电路,AC 交流信号同步检测电路&#xff0c;低压差稳压器等。该…

电动机保护方式

3.3.1、电动机温度保护 温度保护是利用安装在电动机内部的温度继电器或变换器来实现的。当电动机达到一定温度时继电器动作&#xff0c;通过控制电路断开电动机的主电路。对于单相小容量电动机&#xff0c;可以用继电器直接断开动力电路。 根据温度传感器的不同可以分为&…

项目管理中的资源日历是什么?有什么作用

管理项目不仅需要规划和预算&#xff0c;还需要日程安排。 资源日历是一种显示项目经理或团队领导在特定时间内可用资源的工具。这种类型的项目日历可以显示团队成员和设备在特定时间段内的可用工作时间。 例如&#xff0c;如果一名员工每天工作 8 小时&#xff0c;而他已经在…

软件开发及交付的项目管理角色

在软件开发及交付过程中&#xff0c;通常会涉及不同的角色和职责&#xff0c;包括业务角色、技术角色和管理角色。这些角色在项目管理中发挥着不同的作用&#xff0c;以确保项目的成功和交付高质量的产品。 业务角色&#xff1a;包括产品经理、业务分析师和业务运营人员等职位…

MySQL数据库_01

Web后端开发_02 数据库介绍 什么是数据库&#xff1f; 数据库&#xff1a;DataBase&#xff08;DB&#xff09;&#xff0c;是存储和管理数据的仓库 数据库管理系统&#xff1a;DataBase Management System (DBMS)&#xff0c;操纵和管理数据库的大型软件。SQL&#xff1a;St…

APM工具skywalking部署

一 整体架构 整个架构&#xff0c;分成上、下、左、右四部分&#xff1a; 上部分 Agent &#xff1a;负责从应用中&#xff0c;收集链路信息&#xff0c;发送给 SkyWalking OAP 服务器。目前支持 SkyWalking、Zikpin、Jaeger 等提供的 Tracing 数据信息。而我们目前采用的是&…

css渐变详解(重复性线性渐变、径向渐变、重复性径向渐变的使用)

目录 线性渐变 重复性线性渐变 径向渐变 重复性径向渐变的使用 线性渐变 线性渐变是向下、向上、向左、向右、对角方向的颜色渐变。 其语法格式为&#xff1a; background-image: linear-gradient(side-or-corner|angle, linear-color-stop); 参数说明如下&#xff1a; …

【Proteus仿真】【51单片机】篮球比赛计分器

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真51单片机控制器&#xff0c;使用声光报警模块、动态数码管模块、按键模块等。 主要功能&#xff1a; 系统运行后&#xff0c;数码管显示比赛时间和AB队得分&#xff1b;系统还未开…

小白也看的懂的爬取视频操作

1.获取一段视频 可以直接从抖音下&#xff0c;也可以从b站上爬取&#xff08;注意法律谢谢&#xff09; 保护原创 b站的视频 直接复制网址链接到哔哩哔哩(bilibili)视频解析下载 - 保存B站视频到手机、电脑 去就好了&#xff0c;

QGIS之二十五两个面图层数据中选择图形完全一致的数据

效果 步骤 1、准备数据 2、按位置选择 在Qgis工具箱中搜索"按位置选择"工具 选择要素和比较要素根据实际选择 运行 3、结果

基于框架的线性回归

线性回归是机器学习中最简单和最常用的回归方法之一。它建立了自变量和因变量之间的线性关系&#xff0c;并通过拟合一条直线或超平面来预测和分析数据。 基于框架的线性回归是构建线性回归模型的一种常见方法&#xff0c;它利用现有的机器学习框架来实现线性回归模型的建立、…

40、Flink 的Apache Kafka connector(kafka source 和sink 说明及使用示例) 完整版

Flink 系列文章 1、Flink 部署、概念介绍、source、transformation、sink使用示例、四大基石介绍和示例等系列综合文章链接 13、Flink 的table api与sql的基本概念、通用api介绍及入门示例 14、Flink 的table api与sql之数据类型: 内置数据类型以及它们的属性 15、Flink 的ta…

易涝积水点监测,内涝积水监测仪安装

城市内涝对人们来讲会有很多影响&#xff0c;比如出行需要绕远路或者家中涌入污水导致淤泥堆积&#xff0c;这还有可能让屋内的家具受到破坏&#xff0c;既影响正常生活也造成了经济损失。在街道上还可能对交通、通讯、电力等基础设施造成严重威胁。因此政府如果能实时监测路面…

实用工具推荐 | 在线制作电子书

​随着互联网的发展&#xff0c;越来越多的人开始关注知识的传播和分享。而电子书作为一种方便携带、易于分享的形式&#xff0c;越来越受到人们的青睐。今天&#xff0c;就为大家推荐一款实用的工具——FLBOOK在线制作电子杂志平台&#xff0c;让你轻松在线制作电子书&#xf…

邻趣连接力:如何无代码集成CRM、电商平台和营销系统,提升广告推广效率

连接即服务&#xff1a;邻趣无代码集成方法 传统的电商系统集成过程需要大量的时间和资源进行API开发&#xff0c;这不仅耗时耗力&#xff0c;还需要专业的技术团队支持。然而&#xff0c;邻趣通过提供一种无需API开发的连接方法&#xff0c;极大地简化了整个集成过程。商家只…

【独家发布】抖音半蓝V官方免费认证技术

先在巨量引擎升级dou账号 随后上传资料进行验证即可 逐步操作 全程实操保姆及教程 后续0粉点亮蓝v技术教程 来自&#xff1a;人类小徐-分享有价值的资源

Python 异常的传递性

实例 这里就简单用2个function来演示一下异常的传递性 func1 这里num 1/0明显是一个ZeroDivisionError错误&#xff0c;作为演示 def func1():print("fun1 开始执行")num 1 / 0print("func1 结束执行") func2 def func2():print("func2 开始执…