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

news2024/12/26 11:51:15

文章目录

  • 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结果

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

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

相关文章

【Spring Cloud实战】分布式系统控制与组件应用

在现代软件开发中&#xff0c;分布式系统已经成为一种常见的架构模式&#xff0c;被广泛应用于各种规模的企业和组织中。这种架构模式通过将应用程序拆分为独立的组件&#xff0c;并分布在不同的计算机节点上运行&#xff0c;使得系统能够应对高负载和大规模的数据处理需求&…

FPGA自学教程 03 设计一个以1秒频率闪烁的LED灯

双非硕士 研一下学期视觉转FPGA&#xff08;在b站跟小梅哥视频&#xff09; 长路漫漫&#xff0c;但希望前途光明 此篇文章开始省去建工程的操作&#xff0c;如果有不懂的同学可以看我之前的两篇文章。 1.新建文件名为&#xff1a;led_flash&#xff0c;等待右侧弹出Verilog代…

飞翔的小鸟游戏

GameApp类 package App;import main.GameFrame;public class GameApp {public static void main(String[] args) {//游戏的入口new GameFrame();} } main Barrier 类 package main;import util.Constant; import util.GameUtil;import java.awt.*; import java.awt.image.Buf…

C++设计模式之工厂模式(上)——简单工厂模式

工厂模式 概述简单工厂模式介绍示例示例使用运行结果缺点 概述 工厂模式属于一种创建型设计模式。其可以分为简单工厂模式&#xff0c;工厂模式和抽象工厂模式。工厂模式分为上、中、下三篇&#xff0c;本篇主要介绍简单工厂模式。 简单工厂模式 介绍 简单工厂模式可以理解…

【MySQL】多表查询、子查询、自连接、合并查询详解,包含大量示例,包你会。

复合查询 前言正式开始一些开胃菜多表查询自连接子查询单行子查询多行子查询in关键字all关键字any关键字多列子查询在from中使用子查询 合并查询union 和 union all 前言 我前面博客讲的所有的查询都是在单表中进行的&#xff0c;从这里开始就要专门针对查询这个话题进行进一步…

测试开发(二) 开发chrome插件,提升测试效率

chrome插件截图 功能说明 自定义拦截请求response数据、并根据需要做解析&#xff0c;方便检查数据&#xff0c;提升测试效率。 chrome插件截图 功能说明 自定义修改请求的header、接口返回的response的header&#xff0c;提升模拟请求的效率&#xff0c;进而提升测试效率。…

算法刷题-动态规划2(继续)

算法刷题-动态规划2 珠宝的最高价值下降路径最小和 珠宝的最高价值 题目 大佬思路 多开一行使得代码更加的简洁 移动到右侧和下侧 dp[ i ][ j ]有两种情况&#xff1a; 第一种是从上面来的礼物最大价值&#xff1a;dp[ i ][ j ] dp[ i - 1 ][ j ] g[ i ][ j ] 第二种是从左…

csapp 深入理解计算机系统 bomb lab(2)phase_2

bomblab及phase_1 同phase_1可以查看phase_2的汇编代 call 40145c <read_six_numbers>可以看出phase_2调用了read_six_numbers&#xff0c;然后把1和 (%rsp)比较&#xff0c;如果不是1&#xff0c;就会调用<explode_bomb>函数。 %rsp 存放地址&#xff0c;(%r…

csdn最新最全的Selenium教程:定位frame框架中的元素

定位frame框架中的元素 在web应用中经常会出现frame嵌套的应用&#xff0c;假设页面上有A,B两个frame,其中B在A内&#xff0c;那么定位B中的内容则需要先到A&#xff0c;再到B。 switch_to.frame方法可以把当前定位的主题切换到frame里&#xff0c;在frame里实际是嵌套了另外一…

vue项目引入中国地图

先安装有china.js的版本 npm install echarts4.8 --save //以前的版本有china.js <template><div class"mapMain"><div id"map" style"width: 30vw; height: 30vw;" /></div> </template><script>//引入文…

AIGC 实践——七鱼客服机器人业务指标波动分析

智能客服机器人的业务指标&#xff0c;最常见的就是解决率&#xff0c;解决率的高低直接关系到客户采购机器人的价值。解决率很高&#xff0c;客户可以省下很多成本开销&#xff0c;如果解决率很低&#xff0c;那么就没有必要采购这个客服机器人。所以&#xff0c;智能客服机器…

电机应用开发-直流有刷电机电流环控制实现

目录 直流有刷电机电流环控制实现 硬件设计 直流电机电流环控制-位置式PID实现 编程要点 配置ADC可读取电流值 配置基本定时器6产生定时中断读取当前电路中驱动电机的电流值并执行PID运算 配置定时器1输出PWM控制电机 ADC数据处理 编写位置式PID算法 直流电机电流环控…

jquery实现:多个输入框字数统计示例

一、实现效果&#xff1a; 二、代码实现&#xff1a; 每个输入框添加了相同的类名 inputField 并且每个输入框旁边的字数统计使用相同的类名 charCount。 然后使用 jQuery 的类选择器 $(‘.inputField’) 来选中所有具有该类名的输入框&#xff0c;并为它们绑定了 input 事件。…

【学历是敲门砖】如果你想有个好的起点,不妨冲一冲计算机考研,这本书将会助你一臂之力

目录 计算机考研难点 《计算机考研精炼1000题》揭秘问答 1. 为什么是1000题&#xff1f; 2. 有什么优势&#xff1f; 3. 编写团队水平如何&#xff1f; 4. 题目及解析品质如何&#xff1f;可以试读吗&#xff1f; 购买链接 高质量的学习提升圈子 京东热卖下单链接&…

本地MinIO存储服务通过Java程序结合Cpolar内网穿透进行远程访问

[本地MinIO存储服务通过Java程序结合Cpolar内网穿透进行远程访问] 前言 MinIO是一款高性能、分布式的对象存储系统&#xff0c;它可以100%的运行在标准硬件上&#xff0c;即X86等低成本机器也能够很好的运行MinIO。它的优点包括高性能、高可用性、易于部署和管理、支持多租户…

C++中在一个cpp文件中引用另外一个cpp文件的方法

C中在一个cpp文件中引用另外一个cpp文件 可以通过导入cpp文件或者.h文件来实现&#xff0c; 类似python中的import 导入 下面距离说明下 创建1个func1.cpp 内容如下&#xff1a; #include<iostream> using namespace std;int sum (int num1, int num2) {return (num1…

Nginx反向代理实现负载均衡+Keepalive实现高可用

目录 实现负载均衡 实现高可用 实现负载均衡 Nginx的几种负载均衡算法&#xff1a; 1.轮询&#xff08;默认&#xff09; 每个请求按照时间顺序逐一分配到下游的服务节点&#xff0c;如果其中某一节点故障&#xff0c;nginx 会自动剔除故障系统使用户使用不受影响。 2.权重…

珠江啤酒坚持创新,“酿”造电子化采购平台

珠江啤酒 广州珠江啤酒股份有限公司&#xff08;简称“珠江啤酒”&#xff09;是一家以啤酒酿造产业和啤酒文化产业“双主业”协同发展、包装产业配套发展的大型现代化国有控股企业。2010年&#xff0c;在深交所上市&#xff0c;下属企业16家&#xff0c;其中啤酒企业12家&…

UE5 UI教程学习笔记

参考资料&#xff1a;https://item.taobao.com/item.htm?spma21n57.1.0.0.2b4f523cAV5i43&id716635137219&ns1&abbucket15#detail 基础工程&#xff1a;https://download.csdn.net/download/qq_17523181/88559312 1. 介绍 工程素材 2. 创建Widget UE5 UI系统的…

C语言运算符详解

详细介绍了C语言表达式、算术运算符、赋值运算符、关系运算符、条件结构、逻辑运算符、位运算符的语法和使用方法&#xff0c;并讨论了运算符的优先级。 1、表达式与算术运算符 在C语言中&#xff0c;表达式是一个类似数学中的算式&#xff0c;表达式由变量、字面值、常量、运…