前情回顾

到本文,我们已经学习了 SSM 框架中的 MyBatisSpring 两大核心内容,本文介绍如何将两者结合起来在项目中使用,这也是实际开发中常用的操作,必须掌握,下面开始撸码~

集成步骤

第一步:创建数据库、数据表

数据库各位跟随自己爱好建就行,数据表我这里是 programmer,字段有这几个:

  • id 主键,varchar(64)、自动增长、不为null
  • name 姓名,varchar(125)
  • age 年龄,int

第二步:新建项目,完成基本配置

新建基于 maven 的 Java项目,完成如下配置:

pom.xml 文件中主要是依赖:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <groupId>com.javafirst</groupId>
  6. <artifactId>spring-mybatis</artifactId>
  7. <version>1.0-SNAPSHOT</version>
  8. <properties>
  9. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  10. <maven.compiler.source>1.8</maven.compiler.source>
  11. <maven.compiler.target>1.8</maven.compiler.target>
  12. </properties>
  13. <dependencies>
  14. <dependency>
  15. <groupId>junit</groupId>
  16. <artifactId>junit</artifactId>
  17. <version>4.11</version>
  18. </dependency>
  19. <!-- MySQL驱动-->
  20. <dependency>
  21. <groupId>mysql</groupId>
  22. <artifactId>mysql-connector-java</artifactId>
  23. <version>8.0.25</version>
  24. </dependency>
  25. <!--MyBatis依赖-->
  26. <dependency>
  27. <groupId>org.mybatis</groupId>
  28. <artifactId>mybatis</artifactId>
  29. <version>3.5.7</version>
  30. </dependency>
  31. <!-- Spring依赖 -->
  32. <dependency>
  33. <groupId>org.springframework</groupId>
  34. <artifactId>spring-context</artifactId>
  35. <version>5.3.14</version>
  36. </dependency>
  37. <!-- MyBatis集成Spring -->
  38. <dependency>
  39. <groupId>org.mybatis</groupId>
  40. <artifactId>mybatis-spring</artifactId>
  41. <version>1.3.3</version>
  42. </dependency>
  43. <!-- Spring事务-->
  44. <dependency>
  45. <groupId>org.springframework</groupId>
  46. <artifactId>spring-tx</artifactId>
  47. <version>5.3.14</version>
  48. </dependency>
  49. <dependency>
  50. <groupId>org.springframework</groupId>
  51. <artifactId>spring-jdbc</artifactId>
  52. <version>1.2.6</version>
  53. </dependency>
  54. <!-- 阿里数据库连接池 druid -->
  55. <dependency>
  56. <groupId>com.alibaba</groupId>
  57. <artifactId>druid</artifactId>
  58. <version>1.2.8</version>
  59. </dependency>
  60. </dependencies>
  61. <build>
  62. <resources>
  63. <resource>
  64. <directory>src/main/java</directory>
  65. <includes>
  66. <include>**/*.properties</include>
  67. <include>**/*.xml</include>
  68. </includes>
  69. <filtering>false</filtering>
  70. </resource>
  71. </resources>
  72. </build>
  73. </project>

以上配置基本是固定的,用到什么依赖就在这里配置即可。

第三步:创建实体类

这个和我们之前学习过,就是创建和表中字段对应Java实体类对象,代码如下:

  1. package com.javafirst.daomain;
  2. /**
  3. * desc: 数据表 对应的 实体类
  4. * <p>
  5. * author: 推荐学java
  6. * <p>
  7. * weChat: studyingJava
  8. */
  9. public class Programmer {
  10. private Integer id;
  11. private String name;
  12. private Integer age;
  13. public Integer getId() {
  14. return id;
  15. }
  16. public void setId(Integer id) {
  17. this.id = id;
  18. }
  19. public String getName() {
  20. return name;
  21. }
  22. public void setName(String name) {
  23. this.name = name;
  24. }
  25. public Integer getAge() {
  26. return age;
  27. }
  28. public void setAge(Integer age) {
  29. this.age = age;
  30. }
  31. @Override
  32. public String toString() {
  33. return "Programmer信息:{" +
  34. "id=" + id +
  35. ", name='" + name + '\'' +
  36. ", age=" + age +
  37. '}';
  38. }
  39. }

第四步:创建dao接口和mapper文件

这一步其实还属于 MyBatis 的配置,需要注意的是我这里将接口和对应的 mapper 文件没有放在同一个目录(package)下,这里不同会引起MyBatis 配置文件中给JavaBean对象起别名的配置有区别,看个人习惯,我习惯将class和xml分开。

ProgrammerDao.java 代码如下:

  1. /**
  2. * desc: MyBatis 对应的 dao 层,操作SQL使用
  3. * <p>
  4. * author: 推荐学java
  5. * <p>
  6. * weChat: studyingJava
  7. */
  8. public interface ProgrammerDao {
  9. int addProgrammer(Programmer programmer);
  10. List<Programmer> selectAllProgrammer();
  11. }

这个应该不陌生,使我们学习 MyBatis 的时候用到的,这里定义的接口,实际会映射到去执行 Mapper 中的 SQL 语句。

ProgrammerMapper.xml 代码如下:

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="com.javafirst.dao.ProgrammerDao">
  6. <insert id="addProgrammer">
  7. insert into programmer(`name`,age) values (#{name},#{age})
  8. </insert>
  9. <select id="selectAllProgrammer" resultType="com.javafirst.daomain.Programmer">
  10. select * from programmer
  11. </select>
  12. </mapper>

该类在 resource 目录下的 mapper 文件夹下。

第五步:完成MyBatis主配置文件

这个文件的位置在 resource 目录下,名为 mybatis-config.xml ,其代码如下:

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <configuration>
  6. <!-- 日志 -->
  7. <settings>
  8. <setting name="logImpl" value="STDOUT_LOGGING"/>
  9. </settings>
  10. <typeAliases>
  11. <typeAlias type="com.javafirst.daomain.Programmer" alias="programmerDao"/>
  12. <!-- 要求 dao接口和mapper文件在同一文件夹下 -->
  13. <!-- <package name="com.javafirst.daomain"/>-->
  14. </typeAliases>
  15. <mappers>
  16. <mapper resource="mapper/ProgrammerMapper.xml"/>
  17. </mappers>
  18. </configuration>

第四步中提到的不同之处就在这里的 <typeAliases> 标签里面的内容了,各位看注释或者看往期文章就明白了。

接下来的操作就和 Spring 相关了,可能细心的同学已经有疑惑了,我们的数据源去哪了,也就是连接数据库的配置去哪了?能想到这一点,说明我们对学过的内容记忆的很好,其实,MyBatis 和 Spring 结合使用的时候,数据源是交给 Spring容器来处理的,相对我们单独使用 MyBatis 更简单轻松了,快往下看:

第六步:创建 Service 接口和实现类

定义 ProgrammerService 接口代码如下:

  1. public interface ProgrammerService {
  2. int insertProgrammer(Programmer programmer);
  3. List<Programmer> queryProgrammers();
  4. }

这步操作其实就是我们学习 Spring 的流程,会动态创建 Java 对象,然后通过相关设置方式来赋值。

实现类代码:

  1. /**
  2. * desc:
  3. * author: 推荐学java
  4. * <p>
  5. * weChat: studyingJava
  6. */
  7. public class ProgrammerServiceImpl implements ProgrammerService {
  8. private ProgrammerDao programmerDao;
  9. public void setProgrammerDao(ProgrammerDao programmerDao) {
  10. this.programmerDao = programmerDao;
  11. }
  12. @Override
  13. public int insertProgrammer(Programmer programmer) {
  14. return programmerDao.addProgrammer(programmer);
  15. }
  16. @Override
  17. public List<Programmer> queryProgrammers() {
  18. return programmerDao.selectAllProgrammer();
  19. }
  20. }

这里可以理解为代理对象的作用。

第七步:创建 Spring 的配置文件

这个应该很熟悉了,名为 applicationContext.xmlresource 目录下,不同前面我们使用的是,这里的内容有所变化:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. 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">
  6. <!-- 使用属性文件 配置数据源中数据库链接信息 -->
  7. <context:property-placeholder location="jdbc.properties"/>
  8. <!-- 声明数据源-->
  9. <bean id="myDataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
  10. <!-- <property name="driver" value="com.mysql.jdbc.Driver"/>-->
  11. <property name="url" value="${jdbc.url}"/>
  12. <property name="username" value="${jdbc.username}"/>
  13. <property name="password" value="${jdbc.password}"/>
  14. </bean>
  15. <!-- 声明 SQLSessionFactoryBean -->
  16. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  17. <property name="dataSource" ref="myDataSource"/>
  18. <property name="configLocation" value="classpath:mybatis-config.xml"/>
  19. </bean>
  20. <!-- 声明 MapperScannerConfigurer -->
  21. <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
  22. <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
  23. <!--指定包名,包名是dao接口所在的包名
  24. MapperScannerConfigurer 会扫描 basePackage 给定包中的所有接口,把每个接口都执行
  25. 一次getMapper()方法,得到每个接口的dao对象
  26. 创建好的dao对象放入到spring的容器中
  27. dao默认对象的名称:是接口名字的首字母小写
  28. -->
  29. <property name="basePackage" value="com.javafirst.dao"/>
  30. <!-- 多个包下有实体,使用,分割 -->
  31. <!-- <property name="basePackage" value="com.javafirst.dao,com.javafirst.dao2"/>-->
  32. </bean>
  33. <!-- 注册自定义Service -->
  34. <bean id="programmerService" class="com.javafirst.service.impl.ProgrammerServiceImpl">
  35. <property name="programmerDao" ref="programmerDao"/>
  36. </bean>
  37. </beans>

这里其实主要有四小步工作,且这四步基本都是固定模式,我们在理解的基础上把流程记下来就行,后面用就知道为什么这么写了。

为了方便,我这里将数据库相关的配置信息放在了外部文件 jdbc.properties 中,这和我们前面学习 MyBatis 的时候引用外部配置文件是一样的用法,该文件在 resource 目录下,Spring配置文件中引用就是这里的第一句代码。

jdbc.properties 文件内容如下:

  1. jdbc.url=jdbc:mysql://localhost:3306/spring_demo
  2. jdbc.username=root
  3. jdbc.password=root

下面说这四小步都代表什么意思:

  • 声明数据源 :其实就是和数据库建立链接,这个过程交给了 Spring容器来管理
  • 声明 SQLSessionFactoryBean :这个工作的意思就是读取 MyBatis 主配置文件,讲声明的 javaBean 对象映射到 SqlSessionFactoryBean 管理器中。
  • 声明 MapperScannerConfigurer :会扫描给定包下的接口对象,将所有接口执行一次 getMapper() 后得到接口的 dao 对象,将这些对象交给 Spring容器管理。
  • 注册自定义Service :这是我们自定义的东西,也就是我们自己的业务层。

第八步:测试

到这里其实有两种测试可以进行,一种是测试Dao层是否能访问数据库,并进行相关操作,不经过我们的业务层。

  1. @Test
  2. public void test_addProgrammer() {
  3. String config = "applicationContext.xml";
  4. ApplicationContext context = new ClassPathXmlApplicationContext(config);
  5. ProgrammerDao programmerDao = (ProgrammerDao) context.getBean("programmerDao");
  6. Programmer programmer = new Programmer();
  7. programmer.setName("王重阳");
  8. programmer.setAge(102);
  9. programmerDao.addProgrammer(programmer);
  10. }

这一步测试不需要我们前面配置中的自定义Service 即可进行。需要注意的是Spring中添加记录,已经不需要我们手动commit() 了。

第二种测试,就是我们 Spring 和 MyBatis 集成后的测试,代码如下:

  1. @Test
  2. public void test_addProgrammer_spring() {
  3. String config = "applicationContext.xml";
  4. ApplicationContext context = new ClassPathXmlApplicationContext(config);
  5. ProgrammerService programmerService = (ProgrammerService) context.getBean("programmerService");
  6. Programmer programmer = new Programmer();
  7. programmer.setName("周伯通");
  8. programmer.setAge(112);
  9. int row = programmerService.insertProgrammer(programmer);
  10. System.out.println("插入结果:" + row);
  11. }

结果大家自行验证,看下数据表中这里插入的值:

推荐学java——Spring集成MyBatis - 图1

我们还定义了一个查询功能,测试代码如下:

  1. /**
  2. * Spring方式 查询记录
  3. */
  4. @Test
  5. public void test_selectProgrammers_spring() {
  6. String config = "applicationContext.xml";
  7. ApplicationContext context = new ClassPathXmlApplicationContext(config);
  8. ProgrammerService programmerService = (ProgrammerService) context.getBean("programmerService");
  9. List<Programmer> programmers = programmerService.queryProgrammers();
  10. System.out.println("查询结果:" + programmers);
  11. }

结果各位自己验证哈,一般前面流程跑通,到这里不会有问题。

最后,再看下我的项目结构:

推荐学java——Spring集成MyBatis - 图2

总结

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

学编程,推荐首选Java语言,小编创建了一个专注Java的原创公众号推荐学java,各位可以在微信搜索javaFirst 关注,一起开启Java旅途!