Spring——spring集成mybatis

2023-11-16

目录

1.spring集成mybatis相关说明

 2.实现步骤

2.1实现步骤说明

2.2准备数据库,MySQL 创建新建表 Student

 2.3 maven 依赖 pom.xml

2.4 实体类(Student)

2.5定义 StudentDao 接口和对应的mapper映射文件

2.6 编写MyBatis主配置文件

2.7定义 Service 接口和实现类

2.8 编写Spring配置文件

2.8.1 加载外部属性配置文件 

2.8.2声明数据源

2.8.3 注册SqlSessionFactoryBean

2.8.4 定义Mapper扫描配置器MapperScannerConfigurer

2.8.5 向Service中注入相关的接口名

2.9 编写测试方法

2.9.1 测试方法1

 2.9.2 测试方法2


1.spring集成mybatis相关说明

       将 MyBatis 与 Spring 进行整合,主要解决的问题就是将SqlSessionFactory 对象交由 Spring 来管理。所以,该整合,只需要将SqlSessionFactory 的对象生成器 SqlSessionFactoryBean 注册在 Spring 容器中,再将其注入给 Dao 的实现类即可完成整合。

        实现 Spring 与 MyBatis 的整合常用的方式:扫描的 Mapper 动态代理Spring 像插线板一样,mybatis 框架是插头,可以容易的组合到一起。插线板 spring 插上 mybatis,两个框架就是一个整体。

        使用mybatis,需要创建mybatis框架中的某些对象,使用这些对象,就可以使用mybatis提供的功能了。

对于mybatis执行sql语句,需要用到的对象有:

1. SqlSessionFactory对象,只有创建了SqlSessionFactory对象,才能调用openSession()方法得到SqlSession对象。

2. dao接口的代理对象,例如StudentDao接口,需要的代理对象为:SqlSeesion.getMapper(StudentDao.class)。

3. 数据源DataSource对象,使用一个更强大、功能更多的连接池对象代替mybatis自己的PooledDataSource。

 

 2.实现步骤

2.1实现步骤说明

Spring集成mybatis
实现步骤:
1.使用mysql库,创建表。
2.创建maven项目。
3.添加gav (依赖级)
    Spring依赖、mybatis依赖、mysql驱动、junit依赖
    mybatis-spring依赖(mybatis网站上提供的,用来在spring项目中,创建mybatis对象)
    spring有关事务的依赖。

    mybatis和spring整合的时候,事务自动提交的。
4.创建实体Student
5.创建Dao接口和mapper文件写sql语句
6.写mybatis主配置文件
7.创建service接口和他的实现类
8.创建spring的配置文件
    1)声明数据源DataSource,使用的是阿里的Druid连接池
    2)声明SqlSessionFactoryBean类,在这个类内部创建的是SqlSessionFactory对象。
    3)声明MapperScannerConfiguration类,在内部创建dao代理对象,创建的对象放都到Spring容器中。
    4)声明Service对象,把3)中的dao赋值给service属性
9.测试dao访问数据库

2.2准备数据库,MySQL 创建新建表 Student

 2.3 maven 依赖 pom.xml

 

<!-- spring依赖 -->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context</artifactId>
  <version>5.2.5.RELEASE</version>
</dependency>

<!-- spring事务依赖 -->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-tx</artifactId>
  <version>5.2.5.RELEASE</version>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-jdbc</artifactId>
  <version>5.2.5.RELEASE</version>
</dependency>
<!-- mybatis依赖 -->
<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis</artifactId>
  <version>3.5.1</version>
</dependency>
<!-- mybatis和spring集成依赖 -->
<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis-spring</artifactId>
  <version>1.3.1</version>
</dependency>
<!-- mysql驱动 -->
<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>5.1.9</version>
</dependency>
<!-- 阿里的连接池 -->
<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>druid</artifactId>
  <version>1.1.12</version>
</dependency>

<!-- 单元测试 -->
<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.11</version>
  <scope>test</scope>
</dependency>
<build>
    <resources>
      <resource>
        <directory>src/main/java</directory> <!--所在的目录-->
        <includes> <!--包括目录下的.properties,.xml 文件都会扫描到-->
          <include>**/*.properties</include>
          <include>**/*.xml</include>
        </includes>
        <filtering>false</filtering>
      </resource>
    </resources>
 </build>

2.4 实体类(Student)

package com.liuhaiyang.domain;

public class Student {
    private Integer id;
    private String name;
    private Integer age;
    
     //set和get方法以及tostring、构造方法等
}

2.5定义 StudentDao 接口和对应的mapper映射文件

package com.liuhaiyang.dao;

import com.liuhaiyang.domain.Student;

import java.util.List;

public interface StudentDao {
    int insertStudent(Student student);
    List<Student> selectStudent();
}
<?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.liuhaiyang.dao.StudentDao">
    <!--使用insert,uodate,delete,select标签写sql-->

    <insert id="insertStudent" >
        insert into student2(name,age) values (#{name},#{age})
    </insert>

    <select id="selectStudent" resultType="com.liuhaiyang.domain.Student">
    select * from student2
</select>
</mapper>

2.6 编写MyBatis主配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--    设置日志-->
        <settings>
            <setting name="logImpl" value="STDOUT_LOGGING"/>
        </settings>

<!-- 别名-->
<!--    <typeAliases>-->
<!--        <package name="com.liuhaiyang.domain"/>-->
<!--    </typeAliases>-->


    <!--指定其他mapper文件的位置  才能找到其他文件sql语句-->
    <mappers>
<!--        <mapper resource="com/lhy/dao/StudentDao.xml"/>-->
        <!--   使用要求:
        1.mapper文件和dao接口在同一个目录
        2.mapper文件和dao接口名称一样
        -->
        <package name="com.liuhaiyang.dao"/>
    </mappers>
</configuration>

2.7定义 Service 接口和实现类

package com.liuhaiyang.service;

import com.liuhaiyang.domain.Student;

import java.util.List;

public interface StudentService {
    int addSttudent(Student student);
    List<Student> selectStudent();
}
package com.liuhaiyang.service.impl;

import com.liuhaiyang.dao.StudentDao;
import com.liuhaiyang.domain.Student;
import com.liuhaiyang.service.StudentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;

import java.util.List;

@Service("studentService")
public class StudentServiceImpl implements StudentService {
   // @Autowired(required = false)
   // @Qualifier("studentDao")
    private StudentDao studentDao=null;

    public void setStudentDao(StudentDao studentDao) {
        this.studentDao = studentDao;
    }

    @Override
    public int addSttudent(Student student) {
        int a=studentDao.insertStudent(student);
        System.out.println("本次执行结果影响了"+a+"行");
        return  a;
    }

    @Override
    public List<Student> selectStudent() {
        List<Student> stu=studentDao.selectStudent();
        return stu;
    }
}

2.8 编写Spring配置文件

 jdbc.properties配置文件(数据库的相关消息)

jdbc.url=jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=utf-8
jdbc.username=root
jdbc.password=123456(数据库密码)

2.8.1 加载外部属性配置文件 

<!-- 加载外部属性配置文件 -->
<context:property-placeholder location="classpath:jdbc.properties"/>

2.8.2声明数据源


<!-- 声明数据源DataSource -->
<bean id="myDataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
    <property name="url" value="${jdbc.url}"/>
    <property name="username" value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>
</bean>

2.8.3 注册SqlSessionFactoryBean

<!-- 声明SqlSessionFactoryBean,在这个类的内部,创建SqlSessionFactory对象,之后就可以获取SqlSession对象 -->
<bean id="factory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <!-- 指定数据源 -->
    <property name="dataSource" ref="myDataSource"/>
    <!-- 指定mybatis主配置文件 -->
    <property name="configLocation" value="classpath:mybatis.xml"/>
</bean>

2.8.4 定义Mapper扫描配置器MapperScannerConfigurer

<!-- 声明MapperScannerConfigurer -->
<!--
     MapperScannerConfigurer作用:
       循环basePackage所表示的包,把包中的每个接口都找到,调用SqlSession.getMapper(XXXDao.class)
       把每个dao接口都创建出对应的dao代理对象,将dao代理对象放在容器中
       对于StudentDao接口,其代理对象为 studentDao
        相当于:
          ApplicationContext ctx=...
          SqlSessionFactory sqlSessionFactory=ctx.getBean("factory");
          for(接口: com.liuhaiyang.dao){
          接口 对象=session.getMapper(接口)
          springMap.put(对象名, 对象)
          }
-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <!-- 指定SqlSessionFactory对象的名称 -->
    <property name="sqlSessionFactoryBeanName" value="factory"/>
    <!-- 指定基本包,dao接口所在的包名 -->
    <property name="basePackage" value="com.liuhaiyang.dao"/>
</bean>

2.8.5 向Service中注入相关的接口名

<!--        声明service-->
        <bean id="studentService" class="com.liuhaiyang.service.impl.StudentServiceImpl">
                <property name="studentDao" ref="studentDao"/>
        </bean>

2.9 编写测试方法

2.9.1 测试方法1

@Test
    public void tset02(){
        //StudentDao操作,和属于mybatis内容
        String config="application.xml";
        ApplicationContext app=new ClassPathXmlApplicationContext(config);
        StudentDao student=(StudentDao) app.getBean("studentDao");  //这个是由容器创建的。主要是容器的第三个模块
        Student stu=new Student();
        stu.setName("张三");
        stu.setAge(26);
        int a=student.insertStudent(stu);
        System.out.println(a);
    }

结果截图:

 

 2.9.2 测试方法2

 @Test
    public void test03(){
        //StudentService操作的,是将mybatis和Spring结合起来
        String config="application.xml";
        ApplicationContext app=new ClassPathXmlApplicationContext(config);
        StudentService service=(StudentService) app.getBean("studentService");
        List<Student> students=service.selectStudent();
        for (Student student:students) System.out.println(student);

    }

结果截图:

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring——spring集成mybatis 的相关文章

  • Java:无法从同一包中的不同类访问静态变量

    这很奇怪 因为我有一个可以访问 Frame dimension getWidth 的 Character 类 及其伙伴 getHeight 但是当我想在 Map 类中使用它时 Eclipse 强调了它并且无法给我反馈 运行该程序最终会出现
  • “java.net.MalformedURLException:未找到协议”读取到 html 文件

    我收到一个错误 java net MalformedURLException Protocol not found 我想读取网络上的 HTML 文件 mainfest uses permission android name android
  • 打印星号的 ASCII 菱形

    我的程序打印出这样的钻石 但只有当参数或菱形的每一面为4 例如如果我输入6 底部三角形的间距是错误的 我一直在试图找出答案 当参数改变时 底部的三角形不会改变 只有顶部的三角形会改变 它只适用于输入4 public static void
  • 身份验证在 Spring Boot 1.5.2 和 Oauth2 中不起作用

    我正在使用带有 spring boot 1 5 2 RELEASE 的 Oauth2 当我尝试重写 ResourceServerConfigurerAdapter 类的配置方法时 它给了我一个编译错误 但这在 Spring boot 1 2
  • 在 Wildfly 中与 war 部署共享 util jar 文件

    假设我有一个名为 util jar 的 jar 文件 该 jar 文件主要包含 JPA 实体和一些 util 类 无 EJB 如何使这个 jar 可用于 Wildfly 中部署的所有 war 无需将 jar 放置在 war 的 WEB IN
  • 大数据使用什么数据结构

    我有一个包含一百万行的 Excel 工作表 每行有 100 列 每行代表一个具有 100 个属性的类的实例 列值是这些属性的值 哪种数据结构最适合在这里使用来存储数百万个数据实例 Thanks 这实际上取决于您需要如何访问这些数据以及您想要
  • 如何在代理后面安装 Eclipse Neon

    对于 Neon Eclipse 附带了一个安装程序 我在安装程序中找不到任何配置菜单 我的java版本是 java version java version 1 8 0 72 Java TM SE Runtime Environment b
  • Spring 规范 - 谓词的联合

    我需要一个函数来过滤参数并构建查询 我有 4 个参数 因此如果我尝试为每个条件实现查询 我将不得不编写 16 2 4 实施 这不是一个好主意 我尝试通过界面改进我的代码Specification来自 Spring Data JPA 但我无法
  • ConcurrentHashMap 内部是如何工作的?

    我正在阅读有关 Java 并发性的 Oracle 官方文档 我想知道Collection由返回 public static
  • 需要使用 joda 进行灵活的日期时间转换

    我想使用 joda 解析电子邮件中的日期时间字符串 不幸的是我得到了各种不同的格式 例如 Wed 19 Jan 2011 12 52 31 0600 Wed 19 Jan 2011 10 15 34 0800 PST Wed 19 Jan
  • Jackson XML ArrayList 输出具有两个包装器元素

    我在 Jackson 生成的 XML 输出中得到了两个包装器元素 我只想拥有一个 我有一个 Java bean Entity Table name CITIES JacksonXmlRootElement localName City pu
  • 如何使用 Hibernate (EntityManager) 或 JPA 调用 Oracle 函数或过程

    我有一个返回 sys refcursor 的 Oracle 函数 当我使用 Hibernate 调用该函数时 出现以下异常 Hibernate call my function org hibernate exception Generic
  • 如何检测 Java 字符串中的 unicode 字符?

    假设我有一个包含 的字符串 我如何找到所有这些 un icode 字符 我应该测试他们的代码吗 我该怎么做呢 例如 给定字符串 A X 我想将其转换为 AYXY 我想对其他 unicode 字符做同样的事情 并且我不想将它们存储在某种翻译映
  • Java Swing For mac 中的 DJ Native Swing 浏览器

    我有一个用 Swing 制作的 Java 应用程序 并且使用了一个 DJ Native Swing 浏览器 当我尝试在 OS X 上使用它时 它抛出了一个NoClassDefFoundError尽管我添加了 swt jar 但始终如此 有人
  • 返回 Java 8 中的通用函数接口

    我想写一种函数工厂 它应该是一个函数 以不同的策略作为参数调用一次 它应该返回一个函数 该函数根据参数选择其中一种策略 该参数将由谓词实现 嗯 最好看看condition3为了更好的理解 问题是 它没有编译 我认为因为编译器无法弄清楚函数式
  • 使用布尔值进行冒泡排序以确定数组是否已排序

    我有以下用于冒泡排序的代码 但它根本不排序 如果我删除布尔值那么它工作正常 我知道 由于我的 a 0 小于所有其他元素 因此没有执行交换 任何人都可以帮助我解决这个问题 package com sample public class Bub
  • 在 Google App-Engine JAVA 中将文本转换为字符串,反之亦然

    如何从字符串转换为文本 java lang String to com google appengine api datastore Text 反之亦然 Check Javadoc http code google com appengin
  • Hamcrest Matchers - 断言列表类型

    问题 我目前正在尝试使用 Hamcrest Matchers 来断言返回的列表类型是特定类型 例如 假设我的服务调用返回以下列表 List
  • Java中HashMap和ArrayList的区别?

    在爪哇 ArrayList and HashMap被用作集合 但我不明白我们应该在哪些情况下使用ArrayList以及使用时间HashMap 他们两者之间的主要区别是什么 您具体询问的是 ArrayList 和 HashMap 但我认为要完
  • 在浏览器刷新中刷新检票面板

    我正在开发一个付费角色系统 一旦用户刷新浏览器 我就需要刷新该页面中可用的统计信息 统计信息应该从数据库中获取并显示 但现在它不能正常工作 因为在页面刷新中 java代码不会被调用 而是使用以前的数据加载缓存的页面 我尝试添加以下代码来修复

随机推荐

  • 【教程+实例】Python爬虫实例——用Python爬虫爬取bangumi上的galgame资讯

    文章目录 0 前言 1 什么是爬虫 2 什么东西可以爬 3 简易爬虫示例 4 如何筛选数据 5 正则表达式 6 最终代码 如何修改代码 以适应自己的需求 效果截图 7 彩蛋 本人与知乎用户间宫羽咲sama是同一人 内容同步更新在CSDN和知
  • 1.通用文件模型及VFS结构-基础

    一 reiserFS 新型文件系统 特点 1 采用完全平衡树来容纳数据 ReiserFS是基于平衡树 STree 的文件系统结构 尤其对于大量文件的巨型文件系统 如服务器上的文件系统 搜索速度要比ext2快 ext2使用局部的二分查找法 综
  • 客户服务器被 ddos 攻击,应该怎么办?

    转自 点击打开链接https www v2ex com t 145842 首页 注册 登录 V2EX way to explore V2EX 是一个关于分享和探索的地方 现在注册 已注册用户请 登录 V2EX 提问指南 广告
  • plSQL中修改代码字体的大小

    在第一次打开PLSQL时 大部分人看代码字体的大小肯定不习惯 这时候只需要修改一下字体的大小即可 首先找到左上角的 工具 然后点击第一个首选项 然后再用户界面找到 字体 最后点击编译器中的 选择 即可 然后就可以进行字体大小的调节了
  • Android推送总结

    http blog csdn net baidu 26352053 article details 54135107 最近Android开发当中推送技术是热点 互联网上不同的博客关于推送的介绍也非常的多 大致上关于推送技术 我们可以有使用第
  • JAVA_HOME is not set

    关于JAVA HOME没有设置 本人是在配置spark集群的时候显示 JAVA HOME is not set 具体如下 但是我们在 cd JAVA HOME 还是能够进去 查阅网上资料有各种各样的解决办法 但是看着没啥关系 于是我猜测是没
  • 解决百度网盘(百度云)分享链接不存在失效、分享的文件已经被取消的问题

    解决百度网盘 百度云 分享链接不存在失效 分享的文件已经被取消的问题 参考文章 1 解决百度网盘 百度云 分享链接不存在失效 分享的文件已经被取消的问题 2 https www cnblogs com hafiz p 5496391 htm
  • spring--容器创建过程(IOC和AOP的过程)

    在前面两篇中我们介绍了IOC和AOP 知道了IOC容器就是来管理每个Bean的 而AOP就是对这些Bean进行功能的拓展 那么这个过程是怎么样实现的呢 IOC和AOP又是怎么样的一个过程呢 一 Spring容器创建过程 我们通过一个简单的创
  • 配置网卡信息/etc/sysconfig/network-scripts/ifcfg-eth0,修改ip

    1 ifconfig查看ip信息 root用户下 root edgzrip2 ifconfig a eth0 Link encap Ethernet HWaddr 00 50 56 2B 27 67 inet addr 192 168 23
  • 一键列出所有容器IP地址脚本

    文章目录 使用场景 效果 列出所有容器 自动跳过无终端的容器 脚本 案例 查看网络带宽占用 过滤IP对应的容器 解决带宽占用问题 使用场景 在服务器带宽被占用 但不好定位是哪个容器时 通过用此脚本来快速过滤容器名 以便解决问题 效果 列出所
  • [C++]使用关键字new创建对象

    1 首先解释new关键字的作用 在堆中开辟指定数据类型的空间 调用指定数据类型的构造函数 创建对象 返回创建的对象 int pn new int new与delete搭配使用 这种写法 pn为栈上的一个指针 指向堆上所对应的内存块 int
  • 逻辑地址、物理地址和线性地址

    逻辑地址 logical address 包含在机器语言指令中用来指定一个操作数或一条指令的地址 这种寻址方式在80X86著名的分段结构中表现的尤为具体 它促使MS DOS或Windows程序员把程序分成若干段 每一个逻辑地址都由一个段 s
  • 【pyspark】DataFrame基础操作(二)

    介绍一下 pyspark 的 DataFrame 基础操作 一 选择和访问数据 PySpark DataFrame 是惰性计算的 简单地选择一列不会触发计算 但它会返回一个 Column 实例 并且 大多数按列操作都返回 Column 实例
  • 代码审计工具学习之Seay(安装以及初步认识)

    目录 1 1名词解释 1 2代码审计的重要性 1 3代码审计的步骤 1 4代码审计的内容 1 5常见的代码审计工具 2 Seay 2 1什么是Seay 2 2 Seay的安装过程 3典型漏洞分析 3 1什么是命令注入漏洞 3 2 如何理解命
  • Windows下运用Tensorflow object detection API训练出现的问题--爬坑

    刚开始学习Tensorflow object detection API遇到了不少问题 下面就遇到的问题做下记录 我是在CPU下训练的模型 然后遇到训练到一百多步的时候会报这个错误 如图 用的训练模型为ssd mobilenet v1 co
  • VS2010中dumpbin工具的使用

    用VS2010生成的 obj文件 lib库 dll库 exe执行文件 如果想查看其中这些文件或库包含了哪些函数以及相关的信息 符号清单 可以通过VS2010自带的dumpbin工具来完成 dumpbin exe为Microsoft COFF
  • C++入门篇--函数

    C 的函数和C语言的函数是差不多的 都是把要重复使用的代码封装起来 以便我们后续使用 而C 的函数在c语言上右增加了几个特性 那就是缺省参数和函数重载 这一篇就分享一下C 函数的这些特性 开篇 说到函数 自然得提一下C 的输入函数和输出函数
  • ArcGIS应用基础知识

    ArcGIS应用基础 一 地理信息系统概念介绍 二 地图基本知识 三 ArcGIS体系介绍 四 ArcGIS数据格式介绍 五 基本工具介绍 一 地理信息系统概念介绍 地理信息系统 简称GIS Geographic Information S
  • Reflect中MethodInfo使用方法

    using System using System Collections Generic using System Linq using System Text using System Reflection namespace Meth
  • Spring——spring集成mybatis

    目录 1 spring集成mybatis相关说明 2 实现步骤 2 1实现步骤说明 2 2准备数据库 MySQL 创建新建表 Student 2 3 maven 依赖 pom xml 2 4 实体类 Student 2 5定义 Studen