推荐学java——Spring集成MyBatis

从来好事天生俭,自古瓜儿苦后甜。这篇文章主要讲述推荐学java——Spring集成MyBatis相关的知识,希望能为你提供帮助。
前情回顾
到本文,我们已经学习了 SSM 框架中的 MyBatis 和 Spring 两大核心内容,本文介绍如何将两者结合起来在项目中使用,这也是实际开发中常用的操作,必须掌握,下面开始撸码~
集成步骤
第一步:创建数据库、数据表数据库各位跟随自己爱好建就行,数据表我这里是 programmer,字段有这几个:

  • id 主键,varchar(64)、自动增长、不为null
  • name 姓名,varchar(125)
  • age 年龄,int
第二步:新建项目,完成基本配置新建基于 maven 的 java项目,完成如下配置:
pom.xml 文件中主要是依赖:
< ?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> com.javafirst< /groupId> < artifactId> spring-mybatis< /artifactId> < version> 1.0-SNAPSHOT< /version> < properties> < project.build.sourceEncoding> UTF-8< /project.build.sourceEncoding> < maven.compiler.source> 1.8< /maven.compiler.source> < maven.compiler.target> 1.8< /maven.compiler.target> < /properties> < dependencies> < dependency> < groupId> junit< /groupId> < artifactId> junit< /artifactId> < version> 4.11< /version> < /dependency> < !-- mysql驱动--> < dependency> < groupId> mysql< /groupId> < artifactId> mysql-connector-java< /artifactId> < version> 8.0.25< /version> < /dependency> < !--MyBatis依赖--> < dependency> < groupId> org.mybatis< /groupId> < artifactId> mybatis< /artifactId> < version> 3.5.7< /version> < /dependency> < !--Spring依赖--> < dependency> < groupId> org.springframework< /groupId> < artifactId> spring-context< /artifactId> < version> 5.3.14< /version> < /dependency> < !--MyBatis集成Spring--> < dependency> < groupId> org.mybatis< /groupId> < artifactId> mybatis-spring< /artifactId> < version> 1.3.3< /version> < /dependency> < !-- Spring事务--> < dependency> < groupId> org.springframework< /groupId> < artifactId> spring-tx< /artifactId> < version> 5.3.14< /version> < /dependency> < dependency> < groupId> org.springframework< /groupId> < artifactId> spring-jdbc< /artifactId> < version> 1.2.6< /version> < /dependency> < !--阿里数据库连接池 druid--> < dependency> < groupId> com.alibaba< /groupId> < artifactId> druid< /artifactId> < version> 1.2.8< /version> < /dependency> < /dependencies> < build> < resources> < resource> < directory> src/main/java< /directory> < includes> < include> **/*.properties< /include> < include> **/*.xml< /include> < /includes> < filtering> false< /filtering> < /resource> < /resources> < /build> < /project>

以上配置基本是固定的,用到什么依赖就在这里配置即可。
第三步:创建实体类这个和我们之前学习过,就是创建和表中字段对应Java实体类对象,代码如下:
package com.javafirst.daomain; /** * desc: 数据表 对应的 实体类 * < p> * author: 推荐学java * < p> * weChat: studyingJava */ public class Programmer private Integer id; private String name; private Integer age; public Integer getId() return id; public void setId(Integer id) this.id = id; public String getName() return name; public void setName(String name) this.name = name; public Integer getAge() return age; public void setAge(Integer age) this.age = age; @Override public String toString() return "Programmer信息:" + "id=" + id + ", name=" + name + \\ + ", age=" + age + ;

第四步:创建dao接口和mapper文件这一步其实还属于 MyBatis 的配置,需要注意的是我这里将接口和对应的 mapper 文件没有放在同一个目录(package)下,这里不同会引起MyBatis 配置文件中给JavaBean对象起别名的配置有区别,看个人习惯,我习惯将class和xml分开。
ProgrammerDao.java 代码如下:
/** * desc: MyBatis 对应的 dao 层,操作SQL使用 * < p> * author: 推荐学java * < p> * weChat: studyingJava */ public interface ProgrammerDao int addProgrammer(Programmer programmer); List< Programmer> selectAllProgrammer();

这个应该不陌生,使我们学习 MyBatis 的时候用到的,这里定义的接口,实际会映射到去执行 Mapper 中的 SQL 语句。
ProgrammerMapper.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.javafirst.dao.ProgrammerDao"> < insert id="addProgrammer"> insert into programmer(`name`,age) values (#name,#age) < /insert> < select id="selectAllProgrammer" resultType="com.javafirst.daomain.Programmer"> select * from programmer < /select> < /mapper>

该类在 resource 目录下的 mapper 文件夹下。
第五步:完成MyBatis主配置文件这个文件的位置在 resource 目录下,名为 mybatis-config.xml ,其代码如下:
< ?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="https://www.songbingjia.com/android/STDOUT_LOGGING"/> < /settings> < typeAliases> < typeAlias type="com.javafirst.daomain.Programmer" alias="programmerDao"/> < !--要求 dao接口和mapper文件在同一文件夹下--> < !--< package name="com.javafirst.daomain"/> --> < /typeAliases> < mappers> < mapper resource="mapper/ProgrammerMapper.xml"/> < /mappers> < /configuration>

第四步中提到的不同之处就在这里的 & lt; typeAliases& gt; 标签里面的内容了,各位看注释或者看往期文章就明白了。
接下来的操作就和 Spring 相关了,可能细心的同学已经有疑惑了,我们的数据源去哪了,也就是连接数据库的配置去哪了?能想到这一点,说明我们对学过的内容记忆的很好,其实,MyBatis 和 Spring 结合使用的时候,数据源是交给 Spring容器来处理的,相对我们单独使用 MyBatis 更简单轻松了,快往下看:
第六步:创建 Service 接口和实现类定义 ProgrammerService 接口代码如下:
public interface ProgrammerService int insertProgrammer(Programmer programmer); List< Programmer> queryProgrammers();

这步操作其实就是我们学习 Spring 的流程,会动态创建 Java 对象,然后通过相关设置方式来赋值。
实现类代码:
/** * desc: * author: 推荐学java * < p> * weChat: studyingJava */ public class ProgrammerServiceImpl implements ProgrammerService private ProgrammerDao programmerDao; public void setProgrammerDao(ProgrammerDao programmerDao) this.programmerDao = programmerDao; @Override public int insertProgrammer(Programmer programmer) return programmerDao.addProgrammer(programmer); @Override public List< Programmer> queryProgrammers() return programmerDao.selectAllProgrammer();

这里可以理解为代理对象的作用。
第七步:创建 Spring 的配置文件这个应该很熟悉了,名为 applicationContext.xmlresource 目录下,不同前面我们使用的是,这里的内容有所变化:
< ?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" 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"> < !--使用属性文件 配置数据源中数据库链接信息--> < context:property-placeholder location="jdbc.properties"/> < !-- 声明数据源--> < bean id="myDataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> < !--< property name="driver" value="https://www.songbingjia.com/android/com.mysql.jdbc.Driver"/> --> < property name="url" value="https://www.songbingjia.com/android/$jdbc.url"/> < property name="username" value="https://www.songbingjia.com/android/$jdbc.username"/> < property name="password" value="https://www.songbingjia.com/android/$jdbc.password"/> < /bean> < !--声明 SQLSessionFactoryBean--> < bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> < property name="dataSource" ref="myDataSource"/> < property name="configLocation" value="https://www.songbingjia.com/android/classpath:mybatis-config.xml"/> < /bean> < !--声明 MapperScannerConfigurer--> < bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> < property name="sqlSessionFactoryBeanName" value="https://www.songbingjia.com/android/sqlSessionFactory"/> < !--指定包名,包名是dao接口所在的包名 MapperScannerConfigurer 会扫描 basePackage 给定包中的所有接口,把每个接口都执行 一次getMapper()方法,得到每个接口的dao对象 创建好的dao对象放入到spring的容器中dao默认对象的名称:是接口名字的首字母小写 --> < property name="basePackage" value="https://www.songbingjia.com/android/com.javafirst.dao"/> < !--多个包下有实体,使用,分割--> < !--< property name="basePackage" value="https://www.songbingjia.com/android/com.javafirst.dao,com.javafirst.dao2"/> --> < /bean> < !--注册自定义Service--> < bean id="programmerService" class="com.javafirst.service.impl.ProgrammerServiceImpl"> < property name="programmerDao" ref="programmerDao"/> < /bean> < /beans>

这里其实主要有四小步工作,且这四步基本都是固定模式,我们在理解的基础上把流程记下来就行,后面用就知道为什么这么写了。
jdbc.properties 文件内容如下:
jdbc.url=jdbc:mysql://localhost:3306/spring_demo jdbc.username=root jdbc.password=root

下面说这四小步都代表什么意思:
  • 声明数据源 :其实就是和数据库建立链接,这个过程交给了 Spring容器来管理
  • 声明 SQLSessionFactoryBean :这个工作的意思就是读取 MyBatis 主配置文件,讲声明的 javaBean 对象映射到 SqlSessionFactoryBean 管理器中。
  • 声明 MapperScannerConfigurer :会扫描给定包下的接口对象,将所有接口执行一次 getMapper() 后得到接口的 dao 对象,将这些对象交给 Spring容器管理。
  • 注册自定义Service :这是我们自定义的东西,也就是我们自己的业务层。
第八步:测试到这里其实有两种测试可以进行,一种是测试Dao层是否能访问数据库,并进行相关操作,不经过我们的业务层。
@Test public void test_addProgrammer() String config = "applicationContext.xml"; ApplicationContext context = new ClassPathXmlApplicationContext(config); ProgrammerDao programmerDao = (ProgrammerDao) context.getBean("programmerDao"); Programmer programmer = new Programmer(); programmer.setName("王重阳"); programmer.setAge(102); programmerDao.addProgrammer(programmer);

这一步测试不需要我们前面配置中的自定义Service 即可进行。需要注意的是Spring中添加记录,已经不需要我们手动commit() 了。
第二种测试,就是我们 Spring 和 MyBatis 集成后的测试,代码如下:
@Test public void test_addProgrammer_spring() String config = "applicationContext.xml"; ApplicationContext context = new ClassPathXmlApplicationContext(config); ProgrammerService programmerService = (ProgrammerService) context.getBean("programmerService"); Programmer programmer = new Programmer(); programmer.setName("周伯通"); programmer.setAge(112); int row = programmerService.insertProgrammer(programmer); System.out.println("插入结果:" + row);

结果大家自行验证,看下数据表中这里插入的值:
推荐学java——Spring集成MyBatis

文章图片

我们还定义了一个查询功能,测试代码如下:
/** * Spring方式 查询记录 */ @Test public void test_selectProgrammers_spring() String config = "applicationContext.xml"; ApplicationContext context = new ClassPathXmlApplicationContext(config); ProgrammerService programmerService = (ProgrammerService) context.getBean("programmerService"); List< Programmer> programmers = programmerService.queryProgrammers(); System.out.println("查询结果:" + programmers);

结果各位自己验证哈,一般前面流程跑通,到这里不会有问题。
最后,再看下我的项目结构:
推荐学java——Spring集成MyBatis

文章图片

总结
【推荐学java——Spring集成MyBatis】本文将前面学习的 MyBatis 和 Spring 结合起来使用,掌握其流程和原理很重要,其实思考一下,结合起来反倒简单多了,可能第一次接触的时候,被各种流程性的东西搞的有点懵,但这并不妨碍我们后面的顺利上手。

    推荐阅读