Spring和MaBatis整合

news2025/3/1 16:03:18

Spring和MyBatis整合:

先瞅一眼各种文件路径:
在这里插入图片描述

  • 将之前mybatis中的测试类中的SqlSessionFactory(通过其openSession()来获得对象SqlSession),和Mybatis配置文件中的数据源(url,username等)揉在一起放入Spring配置文件中,对了,还有指定MyBatis核心配置文件的位置
  • 将Mapper接口放进去,扫描包含接口的包,会自动生成实现类
  • 将之前MyBatis中的创建接口代理的代码放入Spring中
  • 将之前Spring中的properties文件放进去
  • 将所需要的包扫描(讲几个层和Mapper接口放进去)
  • 事务管理
   <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       https://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">
    

<!--    扫描组件的包:数据层,业务层等-->
    <context:component-scan base-package="com.itjh"/>
    <context:property-placeholder location="jdbcMm.properties"/>
    <!-- 配置数据源 -->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="${jdbc.driver}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"></property>
    </bean>
<!--  创建sqlsession对象  -->
    <bean class="org.mybatis.spring.SqlSessionFactoryBean">
<!--  注入数据源 -->
        <property name="dataSource" ref="dataSource"></property>
<!--  指定mybatis核心配置文件     -->
        <property name="configLocation" value="MybatisOnlyconfig.xml"></property>
</bean>


    <!--   Mapper扫描配器,扫描Mapper接口,自动生成实现类   -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.itjh.mapper" ></property>
    </bean>

<!-- 事务管理器   -->
    <bean id="manager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
    </bean>
    <tx:annotation-driven transaction-manager="manager" />
</beans>

从测试类开始看:Dao,Service类等等都加入了注解,调用业务层的实现类

import com.itjh.pojo.Dao;
import com.itjh.service.ServiceDao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.List;

public class Test01 {
    public static void main(String[] args) {
        ApplicationContext applicationContext =new ClassPathXmlApplicationContext("springConfig.xml");
        ServiceDao serviceDao=(ServiceDao) applicationContext.getBean("servicedaoimple");
        List<Dao> daos = serviceDao.selectall(1);
        System.out.println(daos);
    }
}

看业务层的实现类之前先看看其实现的接口:这个接口定义了调用数据的方法,方便实现类ServiceDaoImple重写了这些方法之后对数据进行调用(Dao类的里面数据)

package com.itjh.service;

import com.itjh.pojo.Dao;
import java.util.List;

public interface ServiceDao {
    int add(Dao dao);
    List<Dao> selectall(int id);

}

再看实现类:通过给方法传递参数来让方法中的调用成功,当然方法中的调用需要到另一个接口Mapper,于是用到 @Autowired来代替之前配置文件中的<property>标签,有了这个接口的注入

package com.itjh.service;

import com.itjh.mapper.mapper;
import com.itjh.pojo.Dao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Transactional
@Service("servicedaoimple")
public class ServiceDaoImple implements ServiceDao{
    public ServiceDaoImple(){
        System.out.println("巴黎");
    }
    @Autowired
    public mapper map;

    public int add(Dao dao) {
        return map.insert(dao);
    }


    public List<Dao> selectall(int id) {
        System.out.println("茜茜");
        return map.selectall(id);
    }
}

来到Mapper接口中:在最开始的那个Spring配置文件中扫描接口的标签由于会自动生成接口的实现类,过程中就将位置一样的Mapper映射文件与Mapper接口的实现类挂钩了,于是实现了再业务层中对于Mapper接口的方法成功调用后,由于其实现类和映射文件的关系,就自动的进入映射文件中找到和接口方法相同的id,执行sql语句

package com.itjh.mapper;

import com.itjh.pojo.Dao;

import java.util.List;

public interface mapper {
    int insert(Dao dao);
    List<Dao> selectall(int id);
}

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">
<mapper namespace="com.itjh.mapper.mapper">
    <insert id="insert">
        insert into bank (name,age) values (#{name},#{age})
    </insert>
    <select id="selectall" resultType="com.itjh.pojo.Dao">
        select * from bank where id = #{id}
    </select>
</mapper>

对了还有MyBatis核心配置文件:不过里面的数据源标签,扫描映射文件标签都没了(映射文件加载变成现在的Spring配置文件中对于包含接口的包的扫描产生实现类,且由于接口与映射文件路径相同,于是加载出了映射文件),就简单的加一个日志:

<?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.itjh.mapper.mapper">
    <insert id="insert">
        insert into bank (name,age) values (#{name},#{age})
    </insert>
    <select id="selectall" resultType="com.itjh.pojo.Dao">
        select * from bank where id = #{id}
    </select>
</mapper>

最后还有properties文件:用于搭配Spring配置文件中的数据源中${}

梳理一遍:

整体流程: 将参数从测试类传进业务层的实现类(方法由业务层的接口来定义,业务层实现类实现),再传进Mapper接口的方法,再因为其实现类和映射文件的关系,直接进入了映射文件进行sql语句的执行

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

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

相关文章

【Java爬虫】HttpClient+Jsoup实现爬取校内新闻

警告网络爬虫作为一门技术&#xff0c;在使用过程中&#xff0c;应该遵守Robots协议。采集数据时应注意礼貌&#xff0c;不允许爬的网站尽量不要短时间大频率爬取&#xff0c;涉及hdd的网站更是不要去满足自己的好奇心&#xff0c;不然说不准哪天就和吴签一起吃大碗宽面了...介…

[洛谷-P2585][ZJOI2006]三色二叉树(树形DP+状态机DP)

[洛谷-P2585][ZJOI2006]三色二叉树&#xff08;树形DP状态机DP&#xff09;一、题目题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1提示数据规模与约定二、分析1、递归建树2、树形DP 状态机DP&#xff08;1&#xff09;状态表示&#xff08;2&#xff09;状态转移三、…

C++11异步编程

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言1、std::future和std::shared_future1.1 std:future1.2 std::shared_future2、std::async3、std::promise4、std::packaged_task前言 C11提供了异步操作相关的类…

Vue3电商项目实战-结算支付 2【03-结算-对话框组件封装、04-结算-收货地址-切换】

文章目录03-结算-对话框组件封装04-结算-收货地址-切换03-结算-对话框组件封装 目的&#xff1a;实现一个对话框组件可设置标题&#xff0c;动态插入内容&#xff0c;动态插入底部操作按钮&#xff0c;打开关闭功能。 大致步骤&#xff1a; 参照xtx-confirm定义一个基础布局实…

MFC常用控件使用(文本框、编辑框、下拉框、列表控件、树控件)

简介 本文章主要介绍下MFC常用控件的使用&#xff0c;包括静态文本框(Static Text)、编辑框(Edit Control)、下拉框(Combo Box)、列表控件(List Control)、树控件(Tree Control)的使用。 创建项目 我们选择 文件->新建->新建项目&#xff0c;选择MFC程序 选择基于对话…

二叉树的三种遍历

二叉树的遍历可以有&#xff1a;先序遍历、中序遍历、后序遍历先序遍历&#xff1a;根、左子树&#xff0c;右子树中序遍历&#xff1a;左子树、根、右子树后序遍历&#xff1a;左子树、右子树、根下面是我画图理解三种遍历&#xff1a;二叉树里都是分为左子树和右子树。分治思…

Linux文件基础I/O

文件IO文件的常识基础IO为什么要学习操作系统的文件操作C语言对于函数接口的使用接口函数介绍如何理解文件文件描述符重定向更新给模拟实现的shell增加重定向功能为什么linux下一切皆文件&#xff1f;缓冲区为什么要有缓冲区缓冲区对应的刷新策略缓冲区的位置在哪里文件的常识 …

VSCode:添加SSH远程连接

有的时候我们的代码保存于远程服务器&#xff0c;通过VSCode可以通过SSH进行连接&#xff0c;完成远程的编辑。在VSCode的扩展中安装Remote - SSH点击左侧工具栏的远程资源管理器&#xff0c;然后点加号输入ssh的机器及用户名选择一个用于保存ssh配置文件的路径&#xff0c;默认…

Tabs Studio 5.3.0 多功能标签 Crack

在 Visual Studio 2022 和 SQL Server Management Studio 中轻松处理任意数量和类型的文档 你爱写代码&#xff0c;不会好好扫描文档找到你需要切换到的文件名&#xff0c;然后扫描文件菜单下拉列表&#xff0c;然后求助于解决方案资源管理器或搜索。只有在您需要切换到另一个…

javascript入门基础

目录 前言 引入&#xff1a;html中嵌入javascript有三种方式 0. 变量&#xff08;var、let&#xff09; 1. 函数 1.1 普通函数 和 箭头函数 1.1.2 普通函数中的this 1.1.3 箭头函数没有自己的this 1.1.4 普通函数有arguments方法&#xff0c;箭头函数没有 1.1.5 箭头函…

MS python学习(9)

开始学习第二辑 more python for beginners talking about formating https://learn.microsoft.com/en-us/shows/more-python-for-beginners/formatting-and-linting–more-python-for-beginners-2-of-20 Formating 代码格式化&#xff1a;使用pylint工具来帮助遵循PEP8(pyt…

conda创建一个地理开发环境

conda创建一个地理开发环境1. 环境内包说明2. 创建yml文件3. 创建地理开发环境使用conda安装包的时候&#xff0c;经常遇到包之间相互冲突。为了方便配置环境&#xff0c;测试了常用的地理开发所需要的各种包&#xff0c;生成了yml文件方便一键安装。 Linux下pip基本可以成功安…

手敲Mybatis(七)-细化xml语句解析和构建

前言为什么这一章节要细分之前的解析xml处理逻辑&#xff0c;原因是违反了单一原则设计&#xff0c;职责并不明确&#xff0c;将Sql语句、参数、返回值等等一切都进行解析&#xff0c;那么这种的需要拆开&#xff0c;为了后面可维护可扩展&#xff0c;例如Mapper级别的有mapper…

k8s client-go源码解析之informer三

Informer&#xff08;三&#xff09; 注意&#xff1a;本文内容为学习笔记&#xff0c;内容为个人见解&#xff0c;不保证准确性&#xff0c;但欢迎大家讨论何指教。 觉得文章不错请关注跟博客及github 本篇介绍DeltaFIFO及indexer。 informer大致工作流程如下&#xff1a; …

顺序表来喏!!!

前言&#xff1a;还记得前面的文章&#xff1a;《通讯录的实现》吗&#xff1f;通讯录的完成就借助了顺序表这种数据结构&#xff01;&#xff01;&#xff01;那么今天我们就来介绍我们的顺序表介绍顺序表前&#xff0c;我们来了解一下线性表的概念线性表&#xff1a;线性表&a…

mysql笔试题18道

部门表、员工表、薪水等级表 1.取得每个部门最高薪水人员名称 第一步&#xff1a;取得每个部门最高薪水作为临时表t select deptno,max(sal) as maxSal from emp group by deptno 第二步&#xff1a;临时表t与emp表连接条件 e.deptnot.deptno and e.salt.maxSal select …

Spring - Spring IoC 容器相关面试题总结

文章目录01. Spring IoC 和依赖注入是什么&#xff1f;02. Spring IoC 的优点和缺点分别是什么&#xff1f;03. Spring IoC 有什么作用和功能&#xff1f;04. Spring 依赖注入的方式&#xff1f;05. Spring 构造器注入和 setter 方法注入的区别&#xff1f;06. Spring 依赖注入…

嵌入式系统实验——【玄武F103开发板】按key1熄灭两个LED灯、松开恢复点亮

这里写目录标题一、任务目标&#xff08;一&#xff09;分析二、设计思路&#xff08;一&#xff09;开启KEY1对应的GPIOx时钟1.找到KEY1&#xff08;PE3&#xff09;所在的GPIOx端口2.开启GPIOE端口时钟3.清空PE3的端口位4.设置PE3的端口位为输出模式的上拉模式5.一个易错点&a…

二分——力扣篇

二分——力扣篇搜索旋转排序数组搜索旋转排序数组II寻找旋转排序数组中的最小值寻找旋转排序数组中的最小值II搜索旋转排序数组 定理一&#xff1a;只有在顺序区间内才可以通过区间两端的数值判断target是否在其中。 定理二&#xff1a;判断顺序区间还是乱序区间&#xff0c;只…

案例学习20之内存长期占用导致系统缓慢

前言&#xff1a; 发现问题&#xff0c;解决问题&#xff0c;是贯穿整个项目开发过程的事情&#xff0c;能够处理更多的问题&#xff0c;随着经验的丰富&#xff0c;提前预知更多的问题&#xff0c;让问题不出现是最好的解决问题方式。 问题背景&#xff1a; 项目运行过程中出现…